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 19*9ba9dfddSPavel Labath #include "lldb-python.h" 202c1f46dcSZachary Turner #include "lldb/Core/ConstString.h" 212c1f46dcSZachary Turner #include "lldb/Core/Flags.h" 22*9ba9dfddSPavel Labath #include "lldb/Core/StructuredData.h" 239c40264fSZachary Turner #include "lldb/Host/File.h" 242c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h" 25*9ba9dfddSPavel Labath #include "lldb/lldb-defines.h" 262c1f46dcSZachary Turner 275a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h" 285a72c02bSZachary Turner 292c1f46dcSZachary Turner namespace lldb_private { 30edb35d95SEugene Zelenko 315a72c02bSZachary Turner class PythonBytes; 322c1f46dcSZachary Turner class PythonString; 332c1f46dcSZachary Turner class PythonList; 342c1f46dcSZachary Turner class PythonDictionary; 352c1f46dcSZachary Turner class PythonInteger; 362c1f46dcSZachary Turner 372c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic 382c1f46dcSZachary Turner { 392c1f46dcSZachary Turner public: 402c1f46dcSZachary Turner StructuredPythonObject() 412c1f46dcSZachary Turner : StructuredData::Generic() 422c1f46dcSZachary Turner { 432c1f46dcSZachary Turner } 442c1f46dcSZachary Turner 452c1f46dcSZachary Turner StructuredPythonObject(void *obj) 462c1f46dcSZachary Turner : StructuredData::Generic(obj) 472c1f46dcSZachary Turner { 482c1f46dcSZachary Turner Py_XINCREF(GetValue()); 492c1f46dcSZachary Turner } 502c1f46dcSZachary Turner 51edb35d95SEugene Zelenko ~StructuredPythonObject() override 522c1f46dcSZachary Turner { 532c1f46dcSZachary Turner if (Py_IsInitialized()) 542c1f46dcSZachary Turner Py_XDECREF(GetValue()); 552c1f46dcSZachary Turner SetValue(nullptr); 562c1f46dcSZachary Turner } 572c1f46dcSZachary Turner 582c1f46dcSZachary Turner bool 592c1f46dcSZachary Turner IsValid() const override 602c1f46dcSZachary Turner { 612c1f46dcSZachary Turner return GetValue() && GetValue() != Py_None; 622c1f46dcSZachary Turner } 632c1f46dcSZachary Turner 64d9c9da53SJason Molenda void Dump(Stream &s, bool pretty_print = true) const override; 652c1f46dcSZachary Turner 662c1f46dcSZachary Turner private: 672c1f46dcSZachary Turner DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject); 682c1f46dcSZachary Turner }; 692c1f46dcSZachary Turner 702c1f46dcSZachary Turner enum class PyObjectType 712c1f46dcSZachary Turner { 722c1f46dcSZachary Turner Unknown, 732c1f46dcSZachary Turner None, 742c1f46dcSZachary Turner Integer, 752c1f46dcSZachary Turner Dictionary, 762c1f46dcSZachary Turner List, 779c40264fSZachary Turner String, 785a72c02bSZachary Turner Bytes, 79f9d6d204SZachary Turner ByteArray, 807841efbbSZachary Turner Module, 81a1405147SZachary Turner Callable, 82a1405147SZachary Turner Tuple, 839c40264fSZachary Turner File 842c1f46dcSZachary Turner }; 852c1f46dcSZachary Turner 86f8b22f8fSZachary Turner enum class PyRefType 87f8b22f8fSZachary Turner { 88f8b22f8fSZachary Turner Borrowed, // We are not given ownership of the incoming PyObject. 89f8b22f8fSZachary Turner // We cannot safely hold it without calling Py_INCREF. 90f8b22f8fSZachary Turner Owned // We have ownership of the incoming PyObject. We should 91f8b22f8fSZachary Turner // not call Py_INCREF. 92f8b22f8fSZachary Turner }; 93f8b22f8fSZachary Turner 94f8b22f8fSZachary Turner enum class PyInitialValue 95f8b22f8fSZachary Turner { 96f8b22f8fSZachary Turner Invalid, 97f8b22f8fSZachary Turner Empty 98f8b22f8fSZachary Turner }; 99f8b22f8fSZachary Turner 1002c1f46dcSZachary Turner class PythonObject 1012c1f46dcSZachary Turner { 1022c1f46dcSZachary Turner public: 103f8b22f8fSZachary Turner PythonObject() 104f8b22f8fSZachary Turner : m_py_obj(nullptr) 1052c1f46dcSZachary Turner { 1062c1f46dcSZachary Turner } 1072c1f46dcSZachary Turner 108f8b22f8fSZachary Turner PythonObject(PyRefType type, PyObject *py_obj) 109f8b22f8fSZachary Turner : m_py_obj(nullptr) 1102c1f46dcSZachary Turner { 111f8b22f8fSZachary Turner Reset(type, py_obj); 1122c1f46dcSZachary Turner } 1132c1f46dcSZachary Turner 114f8b22f8fSZachary Turner PythonObject(const PythonObject &rhs) 115f8b22f8fSZachary Turner : m_py_obj(nullptr) 1162c1f46dcSZachary Turner { 117f8b22f8fSZachary Turner Reset(rhs); 1182c1f46dcSZachary Turner } 1192c1f46dcSZachary Turner 120edb35d95SEugene Zelenko virtual ~PythonObject() 121edb35d95SEugene Zelenko { 122edb35d95SEugene Zelenko Reset(); 123edb35d95SEugene Zelenko } 1242c1f46dcSZachary Turner 125f8b22f8fSZachary Turner void 126f8b22f8fSZachary Turner Reset() 1272c1f46dcSZachary Turner { 128f8b22f8fSZachary Turner // Avoid calling the virtual method since it's not necessary 129f8b22f8fSZachary Turner // to actually validate the type of the PyObject if we're 130f8b22f8fSZachary Turner // just setting to null. 1312c1f46dcSZachary Turner if (Py_IsInitialized()) 1322c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 133f8b22f8fSZachary Turner m_py_obj = nullptr; 1342c1f46dcSZachary Turner } 135f8b22f8fSZachary Turner 136f8b22f8fSZachary Turner void 137f8b22f8fSZachary Turner Reset(const PythonObject &rhs) 138f8b22f8fSZachary Turner { 139f8b22f8fSZachary Turner // Avoid calling the virtual method if it's not necessary 140f8b22f8fSZachary Turner // to actually validate the type of the PyObject. 14160c24f70SZachary Turner if (!rhs.IsValid()) 142f8b22f8fSZachary Turner Reset(); 143f8b22f8fSZachary Turner else 144f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, rhs.m_py_obj); 145f8b22f8fSZachary Turner } 146f8b22f8fSZachary Turner 147f8b22f8fSZachary Turner // PythonObject is implicitly convertible to PyObject *, which will call the 148f8b22f8fSZachary Turner // wrong overload. We want to explicitly disallow this, since a PyObject 149f8b22f8fSZachary Turner // *always* owns its reference. Therefore the overload which takes a 150f8b22f8fSZachary Turner // PyRefType doesn't make sense, and the copy constructor should be used. 151f8b22f8fSZachary Turner void 152f8b22f8fSZachary Turner Reset(PyRefType type, const PythonObject &ref) = delete; 153f8b22f8fSZachary Turner 154f8b22f8fSZachary Turner virtual void 155f8b22f8fSZachary Turner Reset(PyRefType type, PyObject *py_obj) 156f8b22f8fSZachary Turner { 157f8b22f8fSZachary Turner if (py_obj == m_py_obj) 158f8b22f8fSZachary Turner return; 159f8b22f8fSZachary Turner 160f8b22f8fSZachary Turner if (Py_IsInitialized()) 161f8b22f8fSZachary Turner Py_XDECREF(m_py_obj); 162f8b22f8fSZachary Turner 163f8b22f8fSZachary Turner m_py_obj = py_obj; 164f8b22f8fSZachary Turner 165f8b22f8fSZachary Turner // If this is a borrowed reference, we need to convert it to 166f8b22f8fSZachary Turner // an owned reference by incrementing it. If it is an owned 167f8b22f8fSZachary Turner // reference (for example the caller allocated it with PyDict_New() 168f8b22f8fSZachary Turner // then we must *not* increment it. 169f8b22f8fSZachary Turner if (Py_IsInitialized() && type == PyRefType::Borrowed) 170f8b22f8fSZachary Turner Py_XINCREF(m_py_obj); 1712c1f46dcSZachary Turner } 1722c1f46dcSZachary Turner 1732c1f46dcSZachary Turner void 1742c1f46dcSZachary Turner Dump () const 1752c1f46dcSZachary Turner { 1762c1f46dcSZachary Turner if (m_py_obj) 1772c1f46dcSZachary Turner _PyObject_Dump (m_py_obj); 1782c1f46dcSZachary Turner else 1792c1f46dcSZachary Turner puts ("NULL"); 1802c1f46dcSZachary Turner } 1812c1f46dcSZachary Turner 1822c1f46dcSZachary Turner void 1832c1f46dcSZachary Turner Dump (Stream &strm) const; 1842c1f46dcSZachary Turner 1852c1f46dcSZachary Turner PyObject* 1862c1f46dcSZachary Turner get() const 1872c1f46dcSZachary Turner { 1882c1f46dcSZachary Turner return m_py_obj; 1892c1f46dcSZachary Turner } 1902c1f46dcSZachary Turner 19160c24f70SZachary Turner PyObject* 19260c24f70SZachary Turner release() 19360c24f70SZachary Turner { 19460c24f70SZachary Turner PyObject *result = m_py_obj; 19560c24f70SZachary Turner m_py_obj = nullptr; 19660c24f70SZachary Turner return result; 19760c24f70SZachary Turner } 19860c24f70SZachary Turner 199f8b22f8fSZachary Turner PythonObject & 200f8b22f8fSZachary Turner operator=(const PythonObject &other) 2012c1f46dcSZachary Turner { 202f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, other.get()); 203f8b22f8fSZachary Turner return *this; 2042c1f46dcSZachary Turner } 2052c1f46dcSZachary Turner 2067841efbbSZachary Turner PyObjectType 2077841efbbSZachary Turner GetObjectType() const; 2087841efbbSZachary Turner 2097841efbbSZachary Turner PythonString 2107841efbbSZachary Turner Repr() const; 2117841efbbSZachary Turner 2127841efbbSZachary Turner PythonString 2137841efbbSZachary Turner Str() const; 2147841efbbSZachary Turner 2157841efbbSZachary Turner static PythonObject 21602bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict); 2177841efbbSZachary Turner 218b58fb2f4SZachary Turner template<typename T> 219b58fb2f4SZachary Turner static T 22002bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict) 221b58fb2f4SZachary Turner { 222b58fb2f4SZachary Turner return ResolveNameWithDictionary(name, dict).AsType<T>(); 223b58fb2f4SZachary Turner } 224b58fb2f4SZachary Turner 2257841efbbSZachary Turner PythonObject 2267841efbbSZachary Turner ResolveName(llvm::StringRef name) const; 2277841efbbSZachary Turner 228b58fb2f4SZachary Turner template<typename T> 229b58fb2f4SZachary Turner T 230b58fb2f4SZachary Turner ResolveName(llvm::StringRef name) const 231b58fb2f4SZachary Turner { 232b58fb2f4SZachary Turner return ResolveName(name).AsType<T>(); 233b58fb2f4SZachary Turner } 234b58fb2f4SZachary Turner 2352c1f46dcSZachary Turner bool 2369c40264fSZachary Turner HasAttribute(llvm::StringRef attribute) const; 2379c40264fSZachary Turner 2387d6d218eSZachary Turner PythonObject 2397d6d218eSZachary Turner GetAttributeValue(llvm::StringRef attribute) const; 2407d6d218eSZachary Turner 2419c40264fSZachary Turner bool 242f8b22f8fSZachary Turner IsValid() const; 243f8b22f8fSZachary Turner 244f8b22f8fSZachary Turner bool 245f8b22f8fSZachary Turner IsAllocated() const; 246f8b22f8fSZachary Turner 247f8b22f8fSZachary Turner bool 248f8b22f8fSZachary Turner IsNone() const; 2492c1f46dcSZachary Turner 2507d6d218eSZachary Turner template<typename T> 2517d6d218eSZachary Turner T AsType() const 2527d6d218eSZachary Turner { 2537d6d218eSZachary Turner if (!T::Check(m_py_obj)) 2547d6d218eSZachary Turner return T(); 2557d6d218eSZachary Turner return T(PyRefType::Borrowed, m_py_obj); 2567d6d218eSZachary Turner } 2577d6d218eSZachary Turner 2587841efbbSZachary Turner StructuredData::ObjectSP 2597841efbbSZachary Turner CreateStructuredObject() const; 2602c1f46dcSZachary Turner 2612c1f46dcSZachary Turner protected: 2622c1f46dcSZachary Turner PyObject* m_py_obj; 2632c1f46dcSZachary Turner }; 2642c1f46dcSZachary Turner 2655a72c02bSZachary Turner class PythonBytes : public PythonObject 2665a72c02bSZachary Turner { 2675a72c02bSZachary Turner public: 2685a72c02bSZachary Turner PythonBytes(); 2695a72c02bSZachary Turner explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes); 2705a72c02bSZachary Turner PythonBytes(const uint8_t *bytes, size_t length); 2715a72c02bSZachary Turner PythonBytes(PyRefType type, PyObject *o); 2725a72c02bSZachary Turner PythonBytes(const PythonBytes &object); 2735a72c02bSZachary Turner 2745a72c02bSZachary Turner ~PythonBytes() override; 2755a72c02bSZachary Turner 2765a72c02bSZachary Turner static bool 2775a72c02bSZachary Turner Check(PyObject *py_obj); 2785a72c02bSZachary Turner 2795a72c02bSZachary Turner // Bring in the no-argument base class version 2805a72c02bSZachary Turner using PythonObject::Reset; 2815a72c02bSZachary Turner 2825a72c02bSZachary Turner void 2835a72c02bSZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 2845a72c02bSZachary Turner 2855a72c02bSZachary Turner llvm::ArrayRef<uint8_t> 2865a72c02bSZachary Turner GetBytes() const; 2875a72c02bSZachary Turner 2885a72c02bSZachary Turner size_t 2895a72c02bSZachary Turner GetSize() const; 2905a72c02bSZachary Turner 2915a72c02bSZachary Turner void 2925a72c02bSZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 2935a72c02bSZachary Turner 2945a72c02bSZachary Turner StructuredData::StringSP 2955a72c02bSZachary Turner CreateStructuredString() const; 2965a72c02bSZachary Turner }; 2975a72c02bSZachary Turner 298f9d6d204SZachary Turner class PythonByteArray : public PythonObject 299f9d6d204SZachary Turner { 300f9d6d204SZachary Turner public: 301f9d6d204SZachary Turner PythonByteArray(); 302f9d6d204SZachary Turner explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes); 303f9d6d204SZachary Turner PythonByteArray(const uint8_t *bytes, size_t length); 304f9d6d204SZachary Turner PythonByteArray(PyRefType type, PyObject *o); 305f9d6d204SZachary Turner PythonByteArray(const PythonBytes &object); 306f9d6d204SZachary Turner 307f9d6d204SZachary Turner ~PythonByteArray() override; 308f9d6d204SZachary Turner 309f9d6d204SZachary Turner static bool 310f9d6d204SZachary Turner Check(PyObject *py_obj); 311f9d6d204SZachary Turner 312f9d6d204SZachary Turner // Bring in the no-argument base class version 313f9d6d204SZachary Turner using PythonObject::Reset; 314f9d6d204SZachary Turner 315f9d6d204SZachary Turner void 316f9d6d204SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 317f9d6d204SZachary Turner 318f9d6d204SZachary Turner llvm::ArrayRef<uint8_t> 319f9d6d204SZachary Turner GetBytes() const; 320f9d6d204SZachary Turner 321f9d6d204SZachary Turner size_t 322f9d6d204SZachary Turner GetSize() const; 323f9d6d204SZachary Turner 324f9d6d204SZachary Turner void 325f9d6d204SZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 326f9d6d204SZachary Turner 327f9d6d204SZachary Turner StructuredData::StringSP 328f9d6d204SZachary Turner CreateStructuredString() const; 329f9d6d204SZachary Turner }; 330f9d6d204SZachary Turner 3312c1f46dcSZachary Turner class PythonString : public PythonObject 3322c1f46dcSZachary Turner { 3332c1f46dcSZachary Turner public: 3342c1f46dcSZachary Turner PythonString(); 335f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 336f8b22f8fSZachary Turner explicit PythonString(const char *string); 33787f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 33887f47729SZachary Turner PythonString(const PythonString &object); 339edb35d95SEugene Zelenko 340f8b22f8fSZachary Turner ~PythonString() override; 3412c1f46dcSZachary Turner 34222c8efcdSZachary Turner static bool Check(PyObject *py_obj); 34322c8efcdSZachary Turner 344f8b22f8fSZachary Turner // Bring in the no-argument base class version 345f8b22f8fSZachary Turner using PythonObject::Reset; 346f8b22f8fSZachary Turner 347f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3482c1f46dcSZachary Turner 3492c1f46dcSZachary Turner llvm::StringRef 3502c1f46dcSZachary Turner GetString() const; 3512c1f46dcSZachary Turner 3522c1f46dcSZachary Turner size_t 3532c1f46dcSZachary Turner GetSize() const; 3542c1f46dcSZachary Turner 3552c1f46dcSZachary Turner void SetString(llvm::StringRef string); 3562c1f46dcSZachary Turner 3572c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 3582c1f46dcSZachary Turner }; 3592c1f46dcSZachary Turner 3602c1f46dcSZachary Turner class PythonInteger : public PythonObject 3612c1f46dcSZachary Turner { 3622c1f46dcSZachary Turner public: 3632c1f46dcSZachary Turner PythonInteger(); 36487f47729SZachary Turner explicit PythonInteger(int64_t value); 365f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 366f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 367edb35d95SEugene Zelenko 368f8b22f8fSZachary Turner ~PythonInteger() override; 3692c1f46dcSZachary Turner 37022c8efcdSZachary Turner static bool Check(PyObject *py_obj); 37122c8efcdSZachary Turner 372f8b22f8fSZachary Turner // Bring in the no-argument base class version 373f8b22f8fSZachary Turner using PythonObject::Reset; 374f8b22f8fSZachary Turner 375f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3762c1f46dcSZachary Turner 3772c1f46dcSZachary Turner int64_t GetInteger() const; 3782c1f46dcSZachary Turner 3792c1f46dcSZachary Turner void 3802c1f46dcSZachary Turner SetInteger (int64_t value); 3812c1f46dcSZachary Turner 3822c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 3832c1f46dcSZachary Turner }; 3842c1f46dcSZachary Turner 3852c1f46dcSZachary Turner class PythonList : public PythonObject 3862c1f46dcSZachary Turner { 3872c1f46dcSZachary Turner public: 388a1405147SZachary Turner PythonList() {} 38987f47729SZachary Turner explicit PythonList(PyInitialValue value); 39087f47729SZachary Turner explicit PythonList(int list_size); 391f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 392f8b22f8fSZachary Turner PythonList(const PythonList &list); 393edb35d95SEugene Zelenko 394f8b22f8fSZachary Turner ~PythonList() override; 3952c1f46dcSZachary Turner 39622c8efcdSZachary Turner static bool Check(PyObject *py_obj); 39722c8efcdSZachary Turner 398f8b22f8fSZachary Turner // Bring in the no-argument base class version 399f8b22f8fSZachary Turner using PythonObject::Reset; 400f8b22f8fSZachary Turner 401f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4022c1f46dcSZachary Turner 4032c1f46dcSZachary Turner uint32_t GetSize() const; 4042c1f46dcSZachary Turner 4052c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 4062c1f46dcSZachary Turner 407f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 4082c1f46dcSZachary Turner 409f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 4102c1f46dcSZachary Turner 4112c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 4122c1f46dcSZachary Turner }; 4132c1f46dcSZachary Turner 414a1405147SZachary Turner class PythonTuple : public PythonObject 415a1405147SZachary Turner { 416a1405147SZachary Turner public: 417a1405147SZachary Turner PythonTuple() {} 418a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 419a1405147SZachary Turner explicit PythonTuple(int tuple_size); 420a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 421a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 422a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 423a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject*> objects); 424a1405147SZachary Turner 425a1405147SZachary Turner ~PythonTuple() override; 426a1405147SZachary Turner 427a1405147SZachary Turner static bool Check(PyObject *py_obj); 428a1405147SZachary Turner 429a1405147SZachary Turner // Bring in the no-argument base class version 430a1405147SZachary Turner using PythonObject::Reset; 431a1405147SZachary Turner 432a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 433a1405147SZachary Turner 434a1405147SZachary Turner uint32_t GetSize() const; 435a1405147SZachary Turner 436a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 437a1405147SZachary Turner 438a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 439a1405147SZachary Turner 440a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 441a1405147SZachary Turner }; 442a1405147SZachary Turner 4432c1f46dcSZachary Turner class PythonDictionary : public PythonObject 4442c1f46dcSZachary Turner { 4452c1f46dcSZachary Turner public: 446a1405147SZachary Turner PythonDictionary() {} 44787f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 448f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 449f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 450edb35d95SEugene Zelenko 451f8b22f8fSZachary Turner ~PythonDictionary() override; 4522c1f46dcSZachary Turner 45322c8efcdSZachary Turner static bool Check(PyObject *py_obj); 45422c8efcdSZachary Turner 455f8b22f8fSZachary Turner // Bring in the no-argument base class version 456f8b22f8fSZachary Turner using PythonObject::Reset; 457f8b22f8fSZachary Turner 458f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4592c1f46dcSZachary Turner 4602c1f46dcSZachary Turner uint32_t GetSize() const; 4612c1f46dcSZachary Turner 462f8b22f8fSZachary Turner PythonList GetKeys() const; 4632c1f46dcSZachary Turner 464f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 465f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 4662c1f46dcSZachary Turner 4672c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 4682c1f46dcSZachary Turner }; 46987f47729SZachary Turner 4707841efbbSZachary Turner class PythonModule : public PythonObject 4717841efbbSZachary Turner { 4727841efbbSZachary Turner public: 4737841efbbSZachary Turner PythonModule(); 4747841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 4757841efbbSZachary Turner PythonModule(const PythonModule &dict); 4767841efbbSZachary Turner 4777841efbbSZachary Turner ~PythonModule() override; 4787841efbbSZachary Turner 4797841efbbSZachary Turner static bool Check(PyObject *py_obj); 4807841efbbSZachary Turner 481a1405147SZachary Turner static PythonModule 482a1405147SZachary Turner BuiltinsModule(); 483a1405147SZachary Turner 484a1405147SZachary Turner static PythonModule 485a1405147SZachary Turner MainModule(); 486a1405147SZachary Turner 487a1405147SZachary Turner static PythonModule 488a1405147SZachary Turner AddModule(llvm::StringRef module); 4897841efbbSZachary Turner 4902419f1d5SZachary Turner static PythonModule 4912419f1d5SZachary Turner ImportModule(llvm::StringRef module); 4922419f1d5SZachary Turner 4937841efbbSZachary Turner // Bring in the no-argument base class version 4947841efbbSZachary Turner using PythonObject::Reset; 4957841efbbSZachary Turner 4967841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4977841efbbSZachary Turner 4987841efbbSZachary Turner PythonDictionary GetDictionary() const; 4997841efbbSZachary Turner }; 5007841efbbSZachary Turner 501a1405147SZachary Turner class PythonCallable : public PythonObject 502a1405147SZachary Turner { 503a1405147SZachary Turner public: 504b58fb2f4SZachary Turner struct ArgInfo { 505b58fb2f4SZachary Turner size_t count; 506a5d6765cSEnrico Granata bool is_bound_method : 1; 507b58fb2f4SZachary Turner bool has_varargs : 1; 508b58fb2f4SZachary Turner bool has_kwargs : 1; 509b58fb2f4SZachary Turner }; 510b58fb2f4SZachary Turner 511a1405147SZachary Turner PythonCallable(); 512a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 513a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 514a1405147SZachary Turner 515a1405147SZachary Turner ~PythonCallable() override; 516a1405147SZachary Turner 517a1405147SZachary Turner static bool 518a1405147SZachary Turner Check(PyObject *py_obj); 519a1405147SZachary Turner 520a1405147SZachary Turner // Bring in the no-argument base class version 521a1405147SZachary Turner using PythonObject::Reset; 522a1405147SZachary Turner 523a1405147SZachary Turner void 524a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 525a1405147SZachary Turner 526b58fb2f4SZachary Turner ArgInfo 527b58fb2f4SZachary Turner GetNumArguments() const; 528b58fb2f4SZachary Turner 529b58fb2f4SZachary Turner PythonObject 530b58fb2f4SZachary Turner operator ()(); 531a1405147SZachary Turner 532a1405147SZachary Turner PythonObject 533a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 534a1405147SZachary Turner 535a1405147SZachary Turner PythonObject 536a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 537b58fb2f4SZachary Turner 538b58fb2f4SZachary Turner template<typename Arg, typename... Args> 539b58fb2f4SZachary Turner PythonObject 540b58fb2f4SZachary Turner operator ()(const Arg &arg, Args... args) 541b58fb2f4SZachary Turner { 542b58fb2f4SZachary Turner return operator()({ arg, args... }); 543b58fb2f4SZachary Turner } 544a1405147SZachary Turner }; 545a1405147SZachary Turner 546a1405147SZachary Turner 5479c40264fSZachary Turner class PythonFile : public PythonObject 5489c40264fSZachary Turner { 5499c40264fSZachary Turner public: 55032064024SZachary Turner PythonFile(); 551eda01c31SZachary Turner PythonFile(File &file, const char *mode); 552eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 5539c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 554edb35d95SEugene Zelenko 5559c40264fSZachary Turner ~PythonFile() override; 5569c40264fSZachary Turner 5579c40264fSZachary Turner static bool Check(PyObject *py_obj); 5589c40264fSZachary Turner 5599c40264fSZachary Turner using PythonObject::Reset; 5609c40264fSZachary Turner 5619c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 5629c40264fSZachary Turner void Reset(File &file, const char *mode); 563eda01c31SZachary Turner 564744959b9SEnrico Granata static uint32_t GetOptionsFromMode(llvm::StringRef mode); 565744959b9SEnrico Granata 566eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 5679c40264fSZachary Turner }; 5689c40264fSZachary Turner 5692c1f46dcSZachary Turner } // namespace lldb_private 5702c1f46dcSZachary Turner 571a281b42bSZachary Turner #endif 572a281b42bSZachary Turner 5732c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 574