1edb35d95SEugene Zelenko //===-- PythonDataObjects.h--------------------------------------*- C++ -*-===// 22c1f46dcSZachary Turner // 32c1f46dcSZachary Turner // The LLVM Compiler Infrastructure 42c1f46dcSZachary Turner // 52c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source 62c1f46dcSZachary Turner // License. See LICENSE.TXT for details. 72c1f46dcSZachary Turner // 82c1f46dcSZachary Turner //===----------------------------------------------------------------------===// 92c1f46dcSZachary Turner 102c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 112c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 122c1f46dcSZachary Turner 13a281b42bSZachary Turner #ifndef LLDB_DISABLE_PYTHON 14a281b42bSZachary Turner 152c1f46dcSZachary Turner // C Includes 162c1f46dcSZachary Turner // C++ Includes 172c1f46dcSZachary Turner // Other libraries and framework includes 182c1f46dcSZachary Turner // Project includes 192c1f46dcSZachary Turner #include "lldb/lldb-defines.h" 202c1f46dcSZachary Turner #include "lldb/Core/ConstString.h" 212c1f46dcSZachary Turner #include "lldb/Core/StructuredData.h" 222c1f46dcSZachary Turner #include "lldb/Core/Flags.h" 239c40264fSZachary Turner #include "lldb/Host/File.h" 242c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h" 252c1f46dcSZachary Turner 265a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h" 275a72c02bSZachary Turner 282c1f46dcSZachary Turner namespace lldb_private { 29edb35d95SEugene Zelenko 305a72c02bSZachary Turner class PythonBytes; 312c1f46dcSZachary Turner class PythonString; 322c1f46dcSZachary Turner class PythonList; 332c1f46dcSZachary Turner class PythonDictionary; 342c1f46dcSZachary Turner class PythonInteger; 352c1f46dcSZachary Turner 362c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic 372c1f46dcSZachary Turner { 382c1f46dcSZachary Turner public: 392c1f46dcSZachary Turner StructuredPythonObject() 402c1f46dcSZachary Turner : StructuredData::Generic() 412c1f46dcSZachary Turner { 422c1f46dcSZachary Turner } 432c1f46dcSZachary Turner 442c1f46dcSZachary Turner StructuredPythonObject(void *obj) 452c1f46dcSZachary Turner : StructuredData::Generic(obj) 462c1f46dcSZachary Turner { 472c1f46dcSZachary Turner Py_XINCREF(GetValue()); 482c1f46dcSZachary Turner } 492c1f46dcSZachary Turner 50edb35d95SEugene Zelenko ~StructuredPythonObject() override 512c1f46dcSZachary Turner { 522c1f46dcSZachary Turner if (Py_IsInitialized()) 532c1f46dcSZachary Turner Py_XDECREF(GetValue()); 542c1f46dcSZachary Turner SetValue(nullptr); 552c1f46dcSZachary Turner } 562c1f46dcSZachary Turner 572c1f46dcSZachary Turner bool 582c1f46dcSZachary Turner IsValid() const override 592c1f46dcSZachary Turner { 602c1f46dcSZachary Turner return GetValue() && GetValue() != Py_None; 612c1f46dcSZachary Turner } 622c1f46dcSZachary Turner 632c1f46dcSZachary Turner void Dump(Stream &s) const override; 642c1f46dcSZachary Turner 652c1f46dcSZachary Turner private: 662c1f46dcSZachary Turner DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject); 672c1f46dcSZachary Turner }; 682c1f46dcSZachary Turner 692c1f46dcSZachary Turner enum class PyObjectType 702c1f46dcSZachary Turner { 712c1f46dcSZachary Turner Unknown, 722c1f46dcSZachary Turner None, 732c1f46dcSZachary Turner Integer, 742c1f46dcSZachary Turner Dictionary, 752c1f46dcSZachary Turner List, 769c40264fSZachary Turner String, 775a72c02bSZachary Turner Bytes, 78f9d6d204SZachary Turner ByteArray, 797841efbbSZachary Turner Module, 80a1405147SZachary Turner Callable, 81a1405147SZachary Turner Tuple, 829c40264fSZachary Turner File 832c1f46dcSZachary Turner }; 842c1f46dcSZachary Turner 85f8b22f8fSZachary Turner enum class PyRefType 86f8b22f8fSZachary Turner { 87f8b22f8fSZachary Turner Borrowed, // We are not given ownership of the incoming PyObject. 88f8b22f8fSZachary Turner // We cannot safely hold it without calling Py_INCREF. 89f8b22f8fSZachary Turner Owned // We have ownership of the incoming PyObject. We should 90f8b22f8fSZachary Turner // not call Py_INCREF. 91f8b22f8fSZachary Turner }; 92f8b22f8fSZachary Turner 93f8b22f8fSZachary Turner enum class PyInitialValue 94f8b22f8fSZachary Turner { 95f8b22f8fSZachary Turner Invalid, 96f8b22f8fSZachary Turner Empty 97f8b22f8fSZachary Turner }; 98f8b22f8fSZachary Turner 992c1f46dcSZachary Turner class PythonObject 1002c1f46dcSZachary Turner { 1012c1f46dcSZachary Turner public: 102f8b22f8fSZachary Turner PythonObject() 103f8b22f8fSZachary Turner : m_py_obj(nullptr) 1042c1f46dcSZachary Turner { 1052c1f46dcSZachary Turner } 1062c1f46dcSZachary Turner 107f8b22f8fSZachary Turner PythonObject(PyRefType type, PyObject *py_obj) 108f8b22f8fSZachary Turner : m_py_obj(nullptr) 1092c1f46dcSZachary Turner { 110f8b22f8fSZachary Turner Reset(type, py_obj); 1112c1f46dcSZachary Turner } 1122c1f46dcSZachary Turner 113f8b22f8fSZachary Turner PythonObject(const PythonObject &rhs) 114f8b22f8fSZachary Turner : m_py_obj(nullptr) 1152c1f46dcSZachary Turner { 116f8b22f8fSZachary Turner Reset(rhs); 1172c1f46dcSZachary Turner } 1182c1f46dcSZachary Turner 119edb35d95SEugene Zelenko virtual ~PythonObject() 120edb35d95SEugene Zelenko { 121edb35d95SEugene Zelenko Reset(); 122edb35d95SEugene Zelenko } 1232c1f46dcSZachary Turner 124f8b22f8fSZachary Turner void 125f8b22f8fSZachary Turner Reset() 1262c1f46dcSZachary Turner { 127f8b22f8fSZachary Turner // Avoid calling the virtual method since it's not necessary 128f8b22f8fSZachary Turner // to actually validate the type of the PyObject if we're 129f8b22f8fSZachary Turner // just setting to null. 1302c1f46dcSZachary Turner if (Py_IsInitialized()) 1312c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 132f8b22f8fSZachary Turner m_py_obj = nullptr; 1332c1f46dcSZachary Turner } 134f8b22f8fSZachary Turner 135f8b22f8fSZachary Turner void 136f8b22f8fSZachary Turner Reset(const PythonObject &rhs) 137f8b22f8fSZachary Turner { 138f8b22f8fSZachary Turner // Avoid calling the virtual method if it's not necessary 139f8b22f8fSZachary Turner // to actually validate the type of the PyObject. 14060c24f70SZachary Turner if (!rhs.IsValid()) 141f8b22f8fSZachary Turner Reset(); 142f8b22f8fSZachary Turner else 143f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, rhs.m_py_obj); 144f8b22f8fSZachary Turner } 145f8b22f8fSZachary Turner 146f8b22f8fSZachary Turner // PythonObject is implicitly convertible to PyObject *, which will call the 147f8b22f8fSZachary Turner // wrong overload. We want to explicitly disallow this, since a PyObject 148f8b22f8fSZachary Turner // *always* owns its reference. Therefore the overload which takes a 149f8b22f8fSZachary Turner // PyRefType doesn't make sense, and the copy constructor should be used. 150f8b22f8fSZachary Turner void 151f8b22f8fSZachary Turner Reset(PyRefType type, const PythonObject &ref) = delete; 152f8b22f8fSZachary Turner 153f8b22f8fSZachary Turner virtual void 154f8b22f8fSZachary Turner Reset(PyRefType type, PyObject *py_obj) 155f8b22f8fSZachary Turner { 156f8b22f8fSZachary Turner if (py_obj == m_py_obj) 157f8b22f8fSZachary Turner return; 158f8b22f8fSZachary Turner 159f8b22f8fSZachary Turner if (Py_IsInitialized()) 160f8b22f8fSZachary Turner Py_XDECREF(m_py_obj); 161f8b22f8fSZachary Turner 162f8b22f8fSZachary Turner m_py_obj = py_obj; 163f8b22f8fSZachary Turner 164f8b22f8fSZachary Turner // If this is a borrowed reference, we need to convert it to 165f8b22f8fSZachary Turner // an owned reference by incrementing it. If it is an owned 166f8b22f8fSZachary Turner // reference (for example the caller allocated it with PyDict_New() 167f8b22f8fSZachary Turner // then we must *not* increment it. 168f8b22f8fSZachary Turner if (Py_IsInitialized() && type == PyRefType::Borrowed) 169f8b22f8fSZachary Turner Py_XINCREF(m_py_obj); 1702c1f46dcSZachary Turner } 1712c1f46dcSZachary Turner 1722c1f46dcSZachary Turner void 1732c1f46dcSZachary Turner Dump () const 1742c1f46dcSZachary Turner { 1752c1f46dcSZachary Turner if (m_py_obj) 1762c1f46dcSZachary Turner _PyObject_Dump (m_py_obj); 1772c1f46dcSZachary Turner else 1782c1f46dcSZachary Turner puts ("NULL"); 1792c1f46dcSZachary Turner } 1802c1f46dcSZachary Turner 1812c1f46dcSZachary Turner void 1822c1f46dcSZachary Turner Dump (Stream &strm) const; 1832c1f46dcSZachary Turner 1842c1f46dcSZachary Turner PyObject* 1852c1f46dcSZachary Turner get() const 1862c1f46dcSZachary Turner { 1872c1f46dcSZachary Turner return m_py_obj; 1882c1f46dcSZachary Turner } 1892c1f46dcSZachary Turner 19060c24f70SZachary Turner PyObject* 19160c24f70SZachary Turner release() 19260c24f70SZachary Turner { 19360c24f70SZachary Turner PyObject *result = m_py_obj; 19460c24f70SZachary Turner m_py_obj = nullptr; 19560c24f70SZachary Turner return result; 19660c24f70SZachary Turner } 19760c24f70SZachary Turner 198f8b22f8fSZachary Turner PythonObject & 199f8b22f8fSZachary Turner operator=(const PythonObject &other) 2002c1f46dcSZachary Turner { 201f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, other.get()); 202f8b22f8fSZachary Turner return *this; 2032c1f46dcSZachary Turner } 2042c1f46dcSZachary Turner 2057841efbbSZachary Turner PyObjectType 2067841efbbSZachary Turner GetObjectType() const; 2077841efbbSZachary Turner 2087841efbbSZachary Turner PythonString 2097841efbbSZachary Turner Repr() const; 2107841efbbSZachary Turner 2117841efbbSZachary Turner PythonString 2127841efbbSZachary Turner Str() const; 2137841efbbSZachary Turner 2147841efbbSZachary Turner static PythonObject 21502bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict); 2167841efbbSZachary Turner 217b58fb2f4SZachary Turner template<typename T> 218b58fb2f4SZachary Turner static T 21902bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict) 220b58fb2f4SZachary Turner { 221b58fb2f4SZachary Turner return ResolveNameWithDictionary(name, dict).AsType<T>(); 222b58fb2f4SZachary Turner } 223b58fb2f4SZachary Turner 2247841efbbSZachary Turner PythonObject 2257841efbbSZachary Turner ResolveName(llvm::StringRef name) const; 2267841efbbSZachary Turner 227b58fb2f4SZachary Turner template<typename T> 228b58fb2f4SZachary Turner T 229b58fb2f4SZachary Turner ResolveName(llvm::StringRef name) const 230b58fb2f4SZachary Turner { 231b58fb2f4SZachary Turner return ResolveName(name).AsType<T>(); 232b58fb2f4SZachary Turner } 233b58fb2f4SZachary Turner 2342c1f46dcSZachary Turner bool 2359c40264fSZachary Turner HasAttribute(llvm::StringRef attribute) const; 2369c40264fSZachary Turner 2377d6d218eSZachary Turner PythonObject 2387d6d218eSZachary Turner GetAttributeValue(llvm::StringRef attribute) const; 2397d6d218eSZachary Turner 2409c40264fSZachary Turner bool 241f8b22f8fSZachary Turner IsValid() const; 242f8b22f8fSZachary Turner 243f8b22f8fSZachary Turner bool 244f8b22f8fSZachary Turner IsAllocated() const; 245f8b22f8fSZachary Turner 246f8b22f8fSZachary Turner bool 247f8b22f8fSZachary Turner IsNone() const; 2482c1f46dcSZachary Turner 2497d6d218eSZachary Turner template<typename T> 2507d6d218eSZachary Turner T AsType() const 2517d6d218eSZachary Turner { 2527d6d218eSZachary Turner if (!T::Check(m_py_obj)) 2537d6d218eSZachary Turner return T(); 2547d6d218eSZachary Turner return T(PyRefType::Borrowed, m_py_obj); 2557d6d218eSZachary Turner } 2567d6d218eSZachary Turner 2577841efbbSZachary Turner StructuredData::ObjectSP 2587841efbbSZachary Turner CreateStructuredObject() const; 2592c1f46dcSZachary Turner 2602c1f46dcSZachary Turner protected: 2612c1f46dcSZachary Turner PyObject* m_py_obj; 2622c1f46dcSZachary Turner }; 2632c1f46dcSZachary Turner 2645a72c02bSZachary Turner class PythonBytes : public PythonObject 2655a72c02bSZachary Turner { 2665a72c02bSZachary Turner public: 2675a72c02bSZachary Turner PythonBytes(); 2685a72c02bSZachary Turner explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes); 2695a72c02bSZachary Turner PythonBytes(const uint8_t *bytes, size_t length); 2705a72c02bSZachary Turner PythonBytes(PyRefType type, PyObject *o); 2715a72c02bSZachary Turner PythonBytes(const PythonBytes &object); 2725a72c02bSZachary Turner 2735a72c02bSZachary Turner ~PythonBytes() override; 2745a72c02bSZachary Turner 2755a72c02bSZachary Turner static bool 2765a72c02bSZachary Turner Check(PyObject *py_obj); 2775a72c02bSZachary Turner 2785a72c02bSZachary Turner // Bring in the no-argument base class version 2795a72c02bSZachary Turner using PythonObject::Reset; 2805a72c02bSZachary Turner 2815a72c02bSZachary Turner void 2825a72c02bSZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 2835a72c02bSZachary Turner 2845a72c02bSZachary Turner llvm::ArrayRef<uint8_t> 2855a72c02bSZachary Turner GetBytes() const; 2865a72c02bSZachary Turner 2875a72c02bSZachary Turner size_t 2885a72c02bSZachary Turner GetSize() const; 2895a72c02bSZachary Turner 2905a72c02bSZachary Turner void 2915a72c02bSZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 2925a72c02bSZachary Turner 2935a72c02bSZachary Turner StructuredData::StringSP 2945a72c02bSZachary Turner CreateStructuredString() const; 2955a72c02bSZachary Turner }; 2965a72c02bSZachary Turner 297f9d6d204SZachary Turner class PythonByteArray : public PythonObject 298f9d6d204SZachary Turner { 299f9d6d204SZachary Turner public: 300f9d6d204SZachary Turner PythonByteArray(); 301f9d6d204SZachary Turner explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes); 302f9d6d204SZachary Turner PythonByteArray(const uint8_t *bytes, size_t length); 303f9d6d204SZachary Turner PythonByteArray(PyRefType type, PyObject *o); 304f9d6d204SZachary Turner PythonByteArray(const PythonBytes &object); 305f9d6d204SZachary Turner 306f9d6d204SZachary Turner ~PythonByteArray() override; 307f9d6d204SZachary Turner 308f9d6d204SZachary Turner static bool 309f9d6d204SZachary Turner Check(PyObject *py_obj); 310f9d6d204SZachary Turner 311f9d6d204SZachary Turner // Bring in the no-argument base class version 312f9d6d204SZachary Turner using PythonObject::Reset; 313f9d6d204SZachary Turner 314f9d6d204SZachary Turner void 315f9d6d204SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 316f9d6d204SZachary Turner 317f9d6d204SZachary Turner llvm::ArrayRef<uint8_t> 318f9d6d204SZachary Turner GetBytes() const; 319f9d6d204SZachary Turner 320f9d6d204SZachary Turner size_t 321f9d6d204SZachary Turner GetSize() const; 322f9d6d204SZachary Turner 323f9d6d204SZachary Turner void 324f9d6d204SZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 325f9d6d204SZachary Turner 326f9d6d204SZachary Turner StructuredData::StringSP 327f9d6d204SZachary Turner CreateStructuredString() const; 328f9d6d204SZachary Turner }; 329f9d6d204SZachary Turner 3302c1f46dcSZachary Turner class PythonString : public PythonObject 3312c1f46dcSZachary Turner { 3322c1f46dcSZachary Turner public: 3332c1f46dcSZachary Turner PythonString(); 334f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 335f8b22f8fSZachary Turner explicit PythonString(const char *string); 33687f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 33787f47729SZachary Turner PythonString(const PythonString &object); 338edb35d95SEugene Zelenko 339f8b22f8fSZachary Turner ~PythonString() override; 3402c1f46dcSZachary Turner 34122c8efcdSZachary Turner static bool Check(PyObject *py_obj); 34222c8efcdSZachary Turner 343f8b22f8fSZachary Turner // Bring in the no-argument base class version 344f8b22f8fSZachary Turner using PythonObject::Reset; 345f8b22f8fSZachary Turner 346f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3472c1f46dcSZachary Turner 3482c1f46dcSZachary Turner llvm::StringRef 3492c1f46dcSZachary Turner GetString() const; 3502c1f46dcSZachary Turner 3512c1f46dcSZachary Turner size_t 3522c1f46dcSZachary Turner GetSize() const; 3532c1f46dcSZachary Turner 3542c1f46dcSZachary Turner void SetString(llvm::StringRef string); 3552c1f46dcSZachary Turner 3562c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 3572c1f46dcSZachary Turner }; 3582c1f46dcSZachary Turner 3592c1f46dcSZachary Turner class PythonInteger : public PythonObject 3602c1f46dcSZachary Turner { 3612c1f46dcSZachary Turner public: 3622c1f46dcSZachary Turner PythonInteger(); 36387f47729SZachary Turner explicit PythonInteger(int64_t value); 364f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 365f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 366edb35d95SEugene Zelenko 367f8b22f8fSZachary Turner ~PythonInteger() override; 3682c1f46dcSZachary Turner 36922c8efcdSZachary Turner static bool Check(PyObject *py_obj); 37022c8efcdSZachary Turner 371f8b22f8fSZachary Turner // Bring in the no-argument base class version 372f8b22f8fSZachary Turner using PythonObject::Reset; 373f8b22f8fSZachary Turner 374f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3752c1f46dcSZachary Turner 3762c1f46dcSZachary Turner int64_t GetInteger() const; 3772c1f46dcSZachary Turner 3782c1f46dcSZachary Turner void 3792c1f46dcSZachary Turner SetInteger (int64_t value); 3802c1f46dcSZachary Turner 3812c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 3822c1f46dcSZachary Turner }; 3832c1f46dcSZachary Turner 3842c1f46dcSZachary Turner class PythonList : public PythonObject 3852c1f46dcSZachary Turner { 3862c1f46dcSZachary Turner public: 387a1405147SZachary Turner PythonList() {} 38887f47729SZachary Turner explicit PythonList(PyInitialValue value); 38987f47729SZachary Turner explicit PythonList(int list_size); 390f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 391f8b22f8fSZachary Turner PythonList(const PythonList &list); 392edb35d95SEugene Zelenko 393f8b22f8fSZachary Turner ~PythonList() override; 3942c1f46dcSZachary Turner 39522c8efcdSZachary Turner static bool Check(PyObject *py_obj); 39622c8efcdSZachary Turner 397f8b22f8fSZachary Turner // Bring in the no-argument base class version 398f8b22f8fSZachary Turner using PythonObject::Reset; 399f8b22f8fSZachary Turner 400f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4012c1f46dcSZachary Turner 4022c1f46dcSZachary Turner uint32_t GetSize() const; 4032c1f46dcSZachary Turner 4042c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 4052c1f46dcSZachary Turner 406f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 4072c1f46dcSZachary Turner 408f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 4092c1f46dcSZachary Turner 4102c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 4112c1f46dcSZachary Turner }; 4122c1f46dcSZachary Turner 413a1405147SZachary Turner class PythonTuple : public PythonObject 414a1405147SZachary Turner { 415a1405147SZachary Turner public: 416a1405147SZachary Turner PythonTuple() {} 417a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 418a1405147SZachary Turner explicit PythonTuple(int tuple_size); 419a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 420a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 421a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 422a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject*> objects); 423a1405147SZachary Turner 424a1405147SZachary Turner ~PythonTuple() override; 425a1405147SZachary Turner 426a1405147SZachary Turner static bool Check(PyObject *py_obj); 427a1405147SZachary Turner 428a1405147SZachary Turner // Bring in the no-argument base class version 429a1405147SZachary Turner using PythonObject::Reset; 430a1405147SZachary Turner 431a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 432a1405147SZachary Turner 433a1405147SZachary Turner uint32_t GetSize() const; 434a1405147SZachary Turner 435a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 436a1405147SZachary Turner 437a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 438a1405147SZachary Turner 439a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 440a1405147SZachary Turner }; 441a1405147SZachary Turner 4422c1f46dcSZachary Turner class PythonDictionary : public PythonObject 4432c1f46dcSZachary Turner { 4442c1f46dcSZachary Turner public: 445a1405147SZachary Turner PythonDictionary() {} 44687f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 447f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 448f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 449edb35d95SEugene Zelenko 450f8b22f8fSZachary Turner ~PythonDictionary() override; 4512c1f46dcSZachary Turner 45222c8efcdSZachary Turner static bool Check(PyObject *py_obj); 45322c8efcdSZachary Turner 454f8b22f8fSZachary Turner // Bring in the no-argument base class version 455f8b22f8fSZachary Turner using PythonObject::Reset; 456f8b22f8fSZachary Turner 457f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4582c1f46dcSZachary Turner 4592c1f46dcSZachary Turner uint32_t GetSize() const; 4602c1f46dcSZachary Turner 461f8b22f8fSZachary Turner PythonList GetKeys() const; 4622c1f46dcSZachary Turner 463f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 464f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 4652c1f46dcSZachary Turner 4662c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 4672c1f46dcSZachary Turner }; 46887f47729SZachary Turner 4697841efbbSZachary Turner class PythonModule : public PythonObject 4707841efbbSZachary Turner { 4717841efbbSZachary Turner public: 4727841efbbSZachary Turner PythonModule(); 4737841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 4747841efbbSZachary Turner PythonModule(const PythonModule &dict); 4757841efbbSZachary Turner 4767841efbbSZachary Turner ~PythonModule() override; 4777841efbbSZachary Turner 4787841efbbSZachary Turner static bool Check(PyObject *py_obj); 4797841efbbSZachary Turner 480a1405147SZachary Turner static PythonModule 481a1405147SZachary Turner BuiltinsModule(); 482a1405147SZachary Turner 483a1405147SZachary Turner static PythonModule 484a1405147SZachary Turner MainModule(); 485a1405147SZachary Turner 486a1405147SZachary Turner static PythonModule 487a1405147SZachary Turner AddModule(llvm::StringRef module); 4887841efbbSZachary Turner 4892419f1d5SZachary Turner static PythonModule 4902419f1d5SZachary Turner ImportModule(llvm::StringRef module); 4912419f1d5SZachary Turner 4927841efbbSZachary Turner // Bring in the no-argument base class version 4937841efbbSZachary Turner using PythonObject::Reset; 4947841efbbSZachary Turner 4957841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4967841efbbSZachary Turner 4977841efbbSZachary Turner PythonDictionary GetDictionary() const; 4987841efbbSZachary Turner }; 4997841efbbSZachary Turner 500a1405147SZachary Turner class PythonCallable : public PythonObject 501a1405147SZachary Turner { 502a1405147SZachary Turner public: 503b58fb2f4SZachary Turner struct ArgInfo { 504b58fb2f4SZachary Turner size_t count; 505*a5d6765cSEnrico Granata bool is_bound_method : 1; 506b58fb2f4SZachary Turner bool has_varargs : 1; 507b58fb2f4SZachary Turner bool has_kwargs : 1; 508b58fb2f4SZachary Turner }; 509b58fb2f4SZachary Turner 510a1405147SZachary Turner PythonCallable(); 511a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 512a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 513a1405147SZachary Turner 514a1405147SZachary Turner ~PythonCallable() override; 515a1405147SZachary Turner 516a1405147SZachary Turner static bool 517a1405147SZachary Turner Check(PyObject *py_obj); 518a1405147SZachary Turner 519a1405147SZachary Turner // Bring in the no-argument base class version 520a1405147SZachary Turner using PythonObject::Reset; 521a1405147SZachary Turner 522a1405147SZachary Turner void 523a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 524a1405147SZachary Turner 525b58fb2f4SZachary Turner ArgInfo 526b58fb2f4SZachary Turner GetNumArguments() const; 527b58fb2f4SZachary Turner 528b58fb2f4SZachary Turner PythonObject 529b58fb2f4SZachary Turner operator ()(); 530a1405147SZachary Turner 531a1405147SZachary Turner PythonObject 532a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 533a1405147SZachary Turner 534a1405147SZachary Turner PythonObject 535a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 536b58fb2f4SZachary Turner 537b58fb2f4SZachary Turner template<typename Arg, typename... Args> 538b58fb2f4SZachary Turner PythonObject 539b58fb2f4SZachary Turner operator ()(const Arg &arg, Args... args) 540b58fb2f4SZachary Turner { 541b58fb2f4SZachary Turner return operator()({ arg, args... }); 542b58fb2f4SZachary Turner } 543a1405147SZachary Turner }; 544a1405147SZachary Turner 545a1405147SZachary Turner 5469c40264fSZachary Turner class PythonFile : public PythonObject 5479c40264fSZachary Turner { 5489c40264fSZachary Turner public: 54932064024SZachary Turner PythonFile(); 550eda01c31SZachary Turner PythonFile(File &file, const char *mode); 551eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 5529c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 553edb35d95SEugene Zelenko 5549c40264fSZachary Turner ~PythonFile() override; 5559c40264fSZachary Turner 5569c40264fSZachary Turner static bool Check(PyObject *py_obj); 5579c40264fSZachary Turner 5589c40264fSZachary Turner using PythonObject::Reset; 5599c40264fSZachary Turner 5609c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 5619c40264fSZachary Turner void Reset(File &file, const char *mode); 562eda01c31SZachary Turner 563744959b9SEnrico Granata static uint32_t GetOptionsFromMode(llvm::StringRef mode); 564744959b9SEnrico Granata 565eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 5669c40264fSZachary Turner }; 5679c40264fSZachary Turner 5682c1f46dcSZachary Turner } // namespace lldb_private 5692c1f46dcSZachary Turner 570a281b42bSZachary Turner #endif 571a281b42bSZachary Turner 5722c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 573