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, 78*f9d6d204SZachary 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 297*f9d6d204SZachary Turner class PythonByteArray : public PythonObject 298*f9d6d204SZachary Turner { 299*f9d6d204SZachary Turner public: 300*f9d6d204SZachary Turner PythonByteArray(); 301*f9d6d204SZachary Turner explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes); 302*f9d6d204SZachary Turner PythonByteArray(const uint8_t *bytes, size_t length); 303*f9d6d204SZachary Turner PythonByteArray(PyRefType type, PyObject *o); 304*f9d6d204SZachary Turner PythonByteArray(const PythonBytes &object); 305*f9d6d204SZachary Turner 306*f9d6d204SZachary Turner ~PythonByteArray() override; 307*f9d6d204SZachary Turner 308*f9d6d204SZachary Turner static bool 309*f9d6d204SZachary Turner Check(PyObject *py_obj); 310*f9d6d204SZachary Turner 311*f9d6d204SZachary Turner // Bring in the no-argument base class version 312*f9d6d204SZachary Turner using PythonObject::Reset; 313*f9d6d204SZachary Turner 314*f9d6d204SZachary Turner void 315*f9d6d204SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 316*f9d6d204SZachary Turner 317*f9d6d204SZachary Turner llvm::ArrayRef<uint8_t> 318*f9d6d204SZachary Turner GetBytes() const; 319*f9d6d204SZachary Turner 320*f9d6d204SZachary Turner size_t 321*f9d6d204SZachary Turner GetSize() const; 322*f9d6d204SZachary Turner 323*f9d6d204SZachary Turner void 324*f9d6d204SZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 325*f9d6d204SZachary Turner 326*f9d6d204SZachary Turner StructuredData::StringSP 327*f9d6d204SZachary Turner CreateStructuredString() const; 328*f9d6d204SZachary Turner }; 329*f9d6d204SZachary 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; 505b58fb2f4SZachary Turner bool has_varargs : 1; 506b58fb2f4SZachary Turner bool has_kwargs : 1; 507b58fb2f4SZachary Turner }; 508b58fb2f4SZachary Turner 509a1405147SZachary Turner PythonCallable(); 510a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 511a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 512a1405147SZachary Turner 513a1405147SZachary Turner ~PythonCallable() override; 514a1405147SZachary Turner 515a1405147SZachary Turner static bool 516a1405147SZachary Turner Check(PyObject *py_obj); 517a1405147SZachary Turner 518a1405147SZachary Turner // Bring in the no-argument base class version 519a1405147SZachary Turner using PythonObject::Reset; 520a1405147SZachary Turner 521a1405147SZachary Turner void 522a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 523a1405147SZachary Turner 524b58fb2f4SZachary Turner ArgInfo 525b58fb2f4SZachary Turner GetNumArguments() const; 526b58fb2f4SZachary Turner 527b58fb2f4SZachary Turner PythonObject 528b58fb2f4SZachary Turner operator ()(); 529a1405147SZachary Turner 530a1405147SZachary Turner PythonObject 531a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 532a1405147SZachary Turner 533a1405147SZachary Turner PythonObject 534a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 535b58fb2f4SZachary Turner 536b58fb2f4SZachary Turner template<typename Arg, typename... Args> 537b58fb2f4SZachary Turner PythonObject 538b58fb2f4SZachary Turner operator ()(const Arg &arg, Args... args) 539b58fb2f4SZachary Turner { 540b58fb2f4SZachary Turner return operator()({ arg, args... }); 541b58fb2f4SZachary Turner } 542a1405147SZachary Turner }; 543a1405147SZachary Turner 544a1405147SZachary Turner 5459c40264fSZachary Turner class PythonFile : public PythonObject 5469c40264fSZachary Turner { 5479c40264fSZachary Turner public: 54832064024SZachary Turner PythonFile(); 549eda01c31SZachary Turner PythonFile(File &file, const char *mode); 550eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 5519c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 552edb35d95SEugene Zelenko 5539c40264fSZachary Turner ~PythonFile() override; 5549c40264fSZachary Turner 5559c40264fSZachary Turner static bool Check(PyObject *py_obj); 5569c40264fSZachary Turner 5579c40264fSZachary Turner using PythonObject::Reset; 5589c40264fSZachary Turner 5599c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 5609c40264fSZachary Turner void Reset(File &file, const char *mode); 561eda01c31SZachary Turner 562744959b9SEnrico Granata static uint32_t GetOptionsFromMode(llvm::StringRef mode); 563744959b9SEnrico Granata 564eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 5659c40264fSZachary Turner }; 5669c40264fSZachary Turner 5672c1f46dcSZachary Turner } // namespace lldb_private 5682c1f46dcSZachary Turner 569a281b42bSZachary Turner #endif 570a281b42bSZachary Turner 5712c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 572