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 15*41de9a97SKate Stone // LLDB Python header must be included first 16*41de9a97SKate Stone #include "lldb-python.h" 17*41de9a97SKate Stone 182c1f46dcSZachary Turner // C Includes 192c1f46dcSZachary Turner // C++ Includes 202c1f46dcSZachary Turner // Other libraries and framework includes 212c1f46dcSZachary Turner // Project includes 222c1f46dcSZachary Turner #include "lldb/Core/ConstString.h" 232c1f46dcSZachary Turner #include "lldb/Core/Flags.h" 249ba9dfddSPavel Labath #include "lldb/Core/StructuredData.h" 259c40264fSZachary Turner #include "lldb/Host/File.h" 262c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h" 279ba9dfddSPavel Labath #include "lldb/lldb-defines.h" 282c1f46dcSZachary Turner 295a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h" 305a72c02bSZachary Turner 312c1f46dcSZachary Turner namespace lldb_private { 32edb35d95SEugene Zelenko 335a72c02bSZachary Turner class PythonBytes; 342c1f46dcSZachary Turner class PythonString; 352c1f46dcSZachary Turner class PythonList; 362c1f46dcSZachary Turner class PythonDictionary; 372c1f46dcSZachary Turner class PythonInteger; 382c1f46dcSZachary Turner 392c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic 402c1f46dcSZachary Turner { 412c1f46dcSZachary Turner public: 422c1f46dcSZachary Turner StructuredPythonObject() 432c1f46dcSZachary Turner : StructuredData::Generic() 442c1f46dcSZachary Turner { 452c1f46dcSZachary Turner } 462c1f46dcSZachary Turner 472c1f46dcSZachary Turner StructuredPythonObject(void *obj) 482c1f46dcSZachary Turner : StructuredData::Generic(obj) 492c1f46dcSZachary Turner { 502c1f46dcSZachary Turner Py_XINCREF(GetValue()); 512c1f46dcSZachary Turner } 522c1f46dcSZachary Turner 53edb35d95SEugene Zelenko ~StructuredPythonObject() override 542c1f46dcSZachary Turner { 552c1f46dcSZachary Turner if (Py_IsInitialized()) 562c1f46dcSZachary Turner Py_XDECREF(GetValue()); 572c1f46dcSZachary Turner SetValue(nullptr); 582c1f46dcSZachary Turner } 592c1f46dcSZachary Turner 602c1f46dcSZachary Turner bool 612c1f46dcSZachary Turner IsValid() const override 622c1f46dcSZachary Turner { 632c1f46dcSZachary Turner return GetValue() && GetValue() != Py_None; 642c1f46dcSZachary Turner } 652c1f46dcSZachary Turner 66d9c9da53SJason Molenda void Dump(Stream &s, bool pretty_print = true) const override; 672c1f46dcSZachary Turner 682c1f46dcSZachary Turner private: 692c1f46dcSZachary Turner DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject); 702c1f46dcSZachary Turner }; 712c1f46dcSZachary Turner 722c1f46dcSZachary Turner enum class PyObjectType 732c1f46dcSZachary Turner { 742c1f46dcSZachary Turner Unknown, 752c1f46dcSZachary Turner None, 762c1f46dcSZachary Turner Integer, 772c1f46dcSZachary Turner Dictionary, 782c1f46dcSZachary Turner List, 799c40264fSZachary Turner String, 805a72c02bSZachary Turner Bytes, 81f9d6d204SZachary Turner ByteArray, 827841efbbSZachary Turner Module, 83a1405147SZachary Turner Callable, 84a1405147SZachary Turner Tuple, 859c40264fSZachary Turner File 862c1f46dcSZachary Turner }; 872c1f46dcSZachary Turner 88f8b22f8fSZachary Turner enum class PyRefType 89f8b22f8fSZachary Turner { 90f8b22f8fSZachary Turner Borrowed, // We are not given ownership of the incoming PyObject. 91f8b22f8fSZachary Turner // We cannot safely hold it without calling Py_INCREF. 92f8b22f8fSZachary Turner Owned // We have ownership of the incoming PyObject. We should 93f8b22f8fSZachary Turner // not call Py_INCREF. 94f8b22f8fSZachary Turner }; 95f8b22f8fSZachary Turner 96f8b22f8fSZachary Turner enum class PyInitialValue 97f8b22f8fSZachary Turner { 98f8b22f8fSZachary Turner Invalid, 99f8b22f8fSZachary Turner Empty 100f8b22f8fSZachary Turner }; 101f8b22f8fSZachary Turner 1022c1f46dcSZachary Turner class PythonObject 1032c1f46dcSZachary Turner { 1042c1f46dcSZachary Turner public: 105f8b22f8fSZachary Turner PythonObject() 106f8b22f8fSZachary Turner : m_py_obj(nullptr) 1072c1f46dcSZachary Turner { 1082c1f46dcSZachary Turner } 1092c1f46dcSZachary Turner 110f8b22f8fSZachary Turner PythonObject(PyRefType type, PyObject *py_obj) 111f8b22f8fSZachary Turner : m_py_obj(nullptr) 1122c1f46dcSZachary Turner { 113f8b22f8fSZachary Turner Reset(type, py_obj); 1142c1f46dcSZachary Turner } 1152c1f46dcSZachary Turner 116f8b22f8fSZachary Turner PythonObject(const PythonObject &rhs) 117f8b22f8fSZachary Turner : m_py_obj(nullptr) 1182c1f46dcSZachary Turner { 119f8b22f8fSZachary Turner Reset(rhs); 1202c1f46dcSZachary Turner } 1212c1f46dcSZachary Turner 122edb35d95SEugene Zelenko virtual ~PythonObject() 123edb35d95SEugene Zelenko { 124edb35d95SEugene Zelenko Reset(); 125edb35d95SEugene Zelenko } 1262c1f46dcSZachary Turner 127f8b22f8fSZachary Turner void 128f8b22f8fSZachary Turner Reset() 1292c1f46dcSZachary Turner { 130f8b22f8fSZachary Turner // Avoid calling the virtual method since it's not necessary 131f8b22f8fSZachary Turner // to actually validate the type of the PyObject if we're 132f8b22f8fSZachary Turner // just setting to null. 1332c1f46dcSZachary Turner if (Py_IsInitialized()) 1342c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 135f8b22f8fSZachary Turner m_py_obj = nullptr; 1362c1f46dcSZachary Turner } 137f8b22f8fSZachary Turner 138f8b22f8fSZachary Turner void 139f8b22f8fSZachary Turner Reset(const PythonObject &rhs) 140f8b22f8fSZachary Turner { 141f8b22f8fSZachary Turner // Avoid calling the virtual method if it's not necessary 142f8b22f8fSZachary Turner // to actually validate the type of the PyObject. 14360c24f70SZachary Turner if (!rhs.IsValid()) 144f8b22f8fSZachary Turner Reset(); 145f8b22f8fSZachary Turner else 146f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, rhs.m_py_obj); 147f8b22f8fSZachary Turner } 148f8b22f8fSZachary Turner 149f8b22f8fSZachary Turner // PythonObject is implicitly convertible to PyObject *, which will call the 150f8b22f8fSZachary Turner // wrong overload. We want to explicitly disallow this, since a PyObject 151f8b22f8fSZachary Turner // *always* owns its reference. Therefore the overload which takes a 152f8b22f8fSZachary Turner // PyRefType doesn't make sense, and the copy constructor should be used. 153f8b22f8fSZachary Turner void 154f8b22f8fSZachary Turner Reset(PyRefType type, const PythonObject &ref) = delete; 155f8b22f8fSZachary Turner 156f8b22f8fSZachary Turner virtual void 157f8b22f8fSZachary Turner Reset(PyRefType type, PyObject *py_obj) 158f8b22f8fSZachary Turner { 159f8b22f8fSZachary Turner if (py_obj == m_py_obj) 160f8b22f8fSZachary Turner return; 161f8b22f8fSZachary Turner 162f8b22f8fSZachary Turner if (Py_IsInitialized()) 163f8b22f8fSZachary Turner Py_XDECREF(m_py_obj); 164f8b22f8fSZachary Turner 165f8b22f8fSZachary Turner m_py_obj = py_obj; 166f8b22f8fSZachary Turner 167f8b22f8fSZachary Turner // If this is a borrowed reference, we need to convert it to 168f8b22f8fSZachary Turner // an owned reference by incrementing it. If it is an owned 169f8b22f8fSZachary Turner // reference (for example the caller allocated it with PyDict_New() 170f8b22f8fSZachary Turner // then we must *not* increment it. 171f8b22f8fSZachary Turner if (Py_IsInitialized() && type == PyRefType::Borrowed) 172f8b22f8fSZachary Turner Py_XINCREF(m_py_obj); 1732c1f46dcSZachary Turner } 1742c1f46dcSZachary Turner 1752c1f46dcSZachary Turner void 1762c1f46dcSZachary Turner Dump () const 1772c1f46dcSZachary Turner { 1782c1f46dcSZachary Turner if (m_py_obj) 1792c1f46dcSZachary Turner _PyObject_Dump (m_py_obj); 1802c1f46dcSZachary Turner else 1812c1f46dcSZachary Turner puts ("NULL"); 1822c1f46dcSZachary Turner } 1832c1f46dcSZachary Turner 1842c1f46dcSZachary Turner void 1852c1f46dcSZachary Turner Dump (Stream &strm) const; 1862c1f46dcSZachary Turner 1872c1f46dcSZachary Turner PyObject* 1882c1f46dcSZachary Turner get() const 1892c1f46dcSZachary Turner { 1902c1f46dcSZachary Turner return m_py_obj; 1912c1f46dcSZachary Turner } 1922c1f46dcSZachary Turner 19360c24f70SZachary Turner PyObject* 19460c24f70SZachary Turner release() 19560c24f70SZachary Turner { 19660c24f70SZachary Turner PyObject *result = m_py_obj; 19760c24f70SZachary Turner m_py_obj = nullptr; 19860c24f70SZachary Turner return result; 19960c24f70SZachary Turner } 20060c24f70SZachary Turner 201f8b22f8fSZachary Turner PythonObject & 202f8b22f8fSZachary Turner operator=(const PythonObject &other) 2032c1f46dcSZachary Turner { 204f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, other.get()); 205f8b22f8fSZachary Turner return *this; 2062c1f46dcSZachary Turner } 2072c1f46dcSZachary Turner 2087841efbbSZachary Turner PyObjectType 2097841efbbSZachary Turner GetObjectType() const; 2107841efbbSZachary Turner 2117841efbbSZachary Turner PythonString 2127841efbbSZachary Turner Repr() const; 2137841efbbSZachary Turner 2147841efbbSZachary Turner PythonString 2157841efbbSZachary Turner Str() const; 2167841efbbSZachary Turner 2177841efbbSZachary Turner static PythonObject 21802bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict); 2197841efbbSZachary Turner 220b58fb2f4SZachary Turner template<typename T> 221b58fb2f4SZachary Turner static T 22202bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict) 223b58fb2f4SZachary Turner { 224b58fb2f4SZachary Turner return ResolveNameWithDictionary(name, dict).AsType<T>(); 225b58fb2f4SZachary Turner } 226b58fb2f4SZachary Turner 2277841efbbSZachary Turner PythonObject 2287841efbbSZachary Turner ResolveName(llvm::StringRef name) const; 2297841efbbSZachary Turner 230b58fb2f4SZachary Turner template<typename T> 231b58fb2f4SZachary Turner T 232b58fb2f4SZachary Turner ResolveName(llvm::StringRef name) const 233b58fb2f4SZachary Turner { 234b58fb2f4SZachary Turner return ResolveName(name).AsType<T>(); 235b58fb2f4SZachary Turner } 236b58fb2f4SZachary Turner 2372c1f46dcSZachary Turner bool 2389c40264fSZachary Turner HasAttribute(llvm::StringRef attribute) const; 2399c40264fSZachary Turner 2407d6d218eSZachary Turner PythonObject 2417d6d218eSZachary Turner GetAttributeValue(llvm::StringRef attribute) const; 2427d6d218eSZachary Turner 2439c40264fSZachary Turner bool 244f8b22f8fSZachary Turner IsValid() const; 245f8b22f8fSZachary Turner 246f8b22f8fSZachary Turner bool 247f8b22f8fSZachary Turner IsAllocated() const; 248f8b22f8fSZachary Turner 249f8b22f8fSZachary Turner bool 250f8b22f8fSZachary Turner IsNone() const; 2512c1f46dcSZachary Turner 2527d6d218eSZachary Turner template<typename T> 2537d6d218eSZachary Turner T AsType() const 2547d6d218eSZachary Turner { 2557d6d218eSZachary Turner if (!T::Check(m_py_obj)) 2567d6d218eSZachary Turner return T(); 2577d6d218eSZachary Turner return T(PyRefType::Borrowed, m_py_obj); 2587d6d218eSZachary Turner } 2597d6d218eSZachary Turner 2607841efbbSZachary Turner StructuredData::ObjectSP 2617841efbbSZachary Turner CreateStructuredObject() const; 2622c1f46dcSZachary Turner 2632c1f46dcSZachary Turner protected: 2642c1f46dcSZachary Turner PyObject* m_py_obj; 2652c1f46dcSZachary Turner }; 2662c1f46dcSZachary Turner 2675a72c02bSZachary Turner class PythonBytes : public PythonObject 2685a72c02bSZachary Turner { 2695a72c02bSZachary Turner public: 2705a72c02bSZachary Turner PythonBytes(); 2715a72c02bSZachary Turner explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes); 2725a72c02bSZachary Turner PythonBytes(const uint8_t *bytes, size_t length); 2735a72c02bSZachary Turner PythonBytes(PyRefType type, PyObject *o); 2745a72c02bSZachary Turner PythonBytes(const PythonBytes &object); 2755a72c02bSZachary Turner 2765a72c02bSZachary Turner ~PythonBytes() override; 2775a72c02bSZachary Turner 2785a72c02bSZachary Turner static bool 2795a72c02bSZachary Turner Check(PyObject *py_obj); 2805a72c02bSZachary Turner 2815a72c02bSZachary Turner // Bring in the no-argument base class version 2825a72c02bSZachary Turner using PythonObject::Reset; 2835a72c02bSZachary Turner 2845a72c02bSZachary Turner void 2855a72c02bSZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 2865a72c02bSZachary Turner 2875a72c02bSZachary Turner llvm::ArrayRef<uint8_t> 2885a72c02bSZachary Turner GetBytes() const; 2895a72c02bSZachary Turner 2905a72c02bSZachary Turner size_t 2915a72c02bSZachary Turner GetSize() const; 2925a72c02bSZachary Turner 2935a72c02bSZachary Turner void 2945a72c02bSZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 2955a72c02bSZachary Turner 2965a72c02bSZachary Turner StructuredData::StringSP 2975a72c02bSZachary Turner CreateStructuredString() const; 2985a72c02bSZachary Turner }; 2995a72c02bSZachary Turner 300f9d6d204SZachary Turner class PythonByteArray : public PythonObject 301f9d6d204SZachary Turner { 302f9d6d204SZachary Turner public: 303f9d6d204SZachary Turner PythonByteArray(); 304f9d6d204SZachary Turner explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes); 305f9d6d204SZachary Turner PythonByteArray(const uint8_t *bytes, size_t length); 306f9d6d204SZachary Turner PythonByteArray(PyRefType type, PyObject *o); 307f9d6d204SZachary Turner PythonByteArray(const PythonBytes &object); 308f9d6d204SZachary Turner 309f9d6d204SZachary Turner ~PythonByteArray() override; 310f9d6d204SZachary Turner 311f9d6d204SZachary Turner static bool 312f9d6d204SZachary Turner Check(PyObject *py_obj); 313f9d6d204SZachary Turner 314f9d6d204SZachary Turner // Bring in the no-argument base class version 315f9d6d204SZachary Turner using PythonObject::Reset; 316f9d6d204SZachary Turner 317f9d6d204SZachary Turner void 318f9d6d204SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 319f9d6d204SZachary Turner 320f9d6d204SZachary Turner llvm::ArrayRef<uint8_t> 321f9d6d204SZachary Turner GetBytes() const; 322f9d6d204SZachary Turner 323f9d6d204SZachary Turner size_t 324f9d6d204SZachary Turner GetSize() const; 325f9d6d204SZachary Turner 326f9d6d204SZachary Turner void 327f9d6d204SZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 328f9d6d204SZachary Turner 329f9d6d204SZachary Turner StructuredData::StringSP 330f9d6d204SZachary Turner CreateStructuredString() const; 331f9d6d204SZachary Turner }; 332f9d6d204SZachary Turner 3332c1f46dcSZachary Turner class PythonString : public PythonObject 3342c1f46dcSZachary Turner { 3352c1f46dcSZachary Turner public: 3362c1f46dcSZachary Turner PythonString(); 337f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 338f8b22f8fSZachary Turner explicit PythonString(const char *string); 33987f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 34087f47729SZachary Turner PythonString(const PythonString &object); 341edb35d95SEugene Zelenko 342f8b22f8fSZachary Turner ~PythonString() override; 3432c1f46dcSZachary Turner 34422c8efcdSZachary Turner static bool Check(PyObject *py_obj); 34522c8efcdSZachary Turner 346f8b22f8fSZachary Turner // Bring in the no-argument base class version 347f8b22f8fSZachary Turner using PythonObject::Reset; 348f8b22f8fSZachary Turner 349f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3502c1f46dcSZachary Turner 3512c1f46dcSZachary Turner llvm::StringRef 3522c1f46dcSZachary Turner GetString() const; 3532c1f46dcSZachary Turner 3542c1f46dcSZachary Turner size_t 3552c1f46dcSZachary Turner GetSize() const; 3562c1f46dcSZachary Turner 3572c1f46dcSZachary Turner void SetString(llvm::StringRef string); 3582c1f46dcSZachary Turner 3592c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 3602c1f46dcSZachary Turner }; 3612c1f46dcSZachary Turner 3622c1f46dcSZachary Turner class PythonInteger : public PythonObject 3632c1f46dcSZachary Turner { 3642c1f46dcSZachary Turner public: 3652c1f46dcSZachary Turner PythonInteger(); 36687f47729SZachary Turner explicit PythonInteger(int64_t value); 367f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 368f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 369edb35d95SEugene Zelenko 370f8b22f8fSZachary Turner ~PythonInteger() override; 3712c1f46dcSZachary Turner 37222c8efcdSZachary Turner static bool Check(PyObject *py_obj); 37322c8efcdSZachary Turner 374f8b22f8fSZachary Turner // Bring in the no-argument base class version 375f8b22f8fSZachary Turner using PythonObject::Reset; 376f8b22f8fSZachary Turner 377f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3782c1f46dcSZachary Turner 3792c1f46dcSZachary Turner int64_t GetInteger() const; 3802c1f46dcSZachary Turner 3812c1f46dcSZachary Turner void 3822c1f46dcSZachary Turner SetInteger (int64_t value); 3832c1f46dcSZachary Turner 3842c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 3852c1f46dcSZachary Turner }; 3862c1f46dcSZachary Turner 3872c1f46dcSZachary Turner class PythonList : public PythonObject 3882c1f46dcSZachary Turner { 3892c1f46dcSZachary Turner public: 390a1405147SZachary Turner PythonList() {} 39187f47729SZachary Turner explicit PythonList(PyInitialValue value); 39287f47729SZachary Turner explicit PythonList(int list_size); 393f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 394f8b22f8fSZachary Turner PythonList(const PythonList &list); 395edb35d95SEugene Zelenko 396f8b22f8fSZachary Turner ~PythonList() override; 3972c1f46dcSZachary Turner 39822c8efcdSZachary Turner static bool Check(PyObject *py_obj); 39922c8efcdSZachary Turner 400f8b22f8fSZachary Turner // Bring in the no-argument base class version 401f8b22f8fSZachary Turner using PythonObject::Reset; 402f8b22f8fSZachary Turner 403f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4042c1f46dcSZachary Turner 4052c1f46dcSZachary Turner uint32_t GetSize() const; 4062c1f46dcSZachary Turner 4072c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 4082c1f46dcSZachary Turner 409f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 4102c1f46dcSZachary Turner 411f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 4122c1f46dcSZachary Turner 4132c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 4142c1f46dcSZachary Turner }; 4152c1f46dcSZachary Turner 416a1405147SZachary Turner class PythonTuple : public PythonObject 417a1405147SZachary Turner { 418a1405147SZachary Turner public: 419a1405147SZachary Turner PythonTuple() {} 420a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 421a1405147SZachary Turner explicit PythonTuple(int tuple_size); 422a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 423a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 424a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 425a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject*> objects); 426a1405147SZachary Turner 427a1405147SZachary Turner ~PythonTuple() override; 428a1405147SZachary Turner 429a1405147SZachary Turner static bool Check(PyObject *py_obj); 430a1405147SZachary Turner 431a1405147SZachary Turner // Bring in the no-argument base class version 432a1405147SZachary Turner using PythonObject::Reset; 433a1405147SZachary Turner 434a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 435a1405147SZachary Turner 436a1405147SZachary Turner uint32_t GetSize() const; 437a1405147SZachary Turner 438a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 439a1405147SZachary Turner 440a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 441a1405147SZachary Turner 442a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 443a1405147SZachary Turner }; 444a1405147SZachary Turner 4452c1f46dcSZachary Turner class PythonDictionary : public PythonObject 4462c1f46dcSZachary Turner { 4472c1f46dcSZachary Turner public: 448a1405147SZachary Turner PythonDictionary() {} 44987f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 450f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 451f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 452edb35d95SEugene Zelenko 453f8b22f8fSZachary Turner ~PythonDictionary() override; 4542c1f46dcSZachary Turner 45522c8efcdSZachary Turner static bool Check(PyObject *py_obj); 45622c8efcdSZachary Turner 457f8b22f8fSZachary Turner // Bring in the no-argument base class version 458f8b22f8fSZachary Turner using PythonObject::Reset; 459f8b22f8fSZachary Turner 460f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4612c1f46dcSZachary Turner 4622c1f46dcSZachary Turner uint32_t GetSize() const; 4632c1f46dcSZachary Turner 464f8b22f8fSZachary Turner PythonList GetKeys() const; 4652c1f46dcSZachary Turner 466f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 467f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 4682c1f46dcSZachary Turner 4692c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 4702c1f46dcSZachary Turner }; 47187f47729SZachary Turner 4727841efbbSZachary Turner class PythonModule : public PythonObject 4737841efbbSZachary Turner { 4747841efbbSZachary Turner public: 4757841efbbSZachary Turner PythonModule(); 4767841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 4777841efbbSZachary Turner PythonModule(const PythonModule &dict); 4787841efbbSZachary Turner 4797841efbbSZachary Turner ~PythonModule() override; 4807841efbbSZachary Turner 4817841efbbSZachary Turner static bool Check(PyObject *py_obj); 4827841efbbSZachary Turner 483a1405147SZachary Turner static PythonModule 484a1405147SZachary Turner BuiltinsModule(); 485a1405147SZachary Turner 486a1405147SZachary Turner static PythonModule 487a1405147SZachary Turner MainModule(); 488a1405147SZachary Turner 489a1405147SZachary Turner static PythonModule 490a1405147SZachary Turner AddModule(llvm::StringRef module); 4917841efbbSZachary Turner 4922419f1d5SZachary Turner static PythonModule 4932419f1d5SZachary Turner ImportModule(llvm::StringRef module); 4942419f1d5SZachary Turner 4957841efbbSZachary Turner // Bring in the no-argument base class version 4967841efbbSZachary Turner using PythonObject::Reset; 4977841efbbSZachary Turner 4987841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4997841efbbSZachary Turner 5007841efbbSZachary Turner PythonDictionary GetDictionary() const; 5017841efbbSZachary Turner }; 5027841efbbSZachary Turner 503a1405147SZachary Turner class PythonCallable : public PythonObject 504a1405147SZachary Turner { 505a1405147SZachary Turner public: 506b58fb2f4SZachary Turner struct ArgInfo { 507b58fb2f4SZachary Turner size_t count; 508a5d6765cSEnrico Granata bool is_bound_method : 1; 509b58fb2f4SZachary Turner bool has_varargs : 1; 510b58fb2f4SZachary Turner bool has_kwargs : 1; 511b58fb2f4SZachary Turner }; 512b58fb2f4SZachary Turner 513a1405147SZachary Turner PythonCallable(); 514a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 515a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 516a1405147SZachary Turner 517a1405147SZachary Turner ~PythonCallable() override; 518a1405147SZachary Turner 519a1405147SZachary Turner static bool 520a1405147SZachary Turner Check(PyObject *py_obj); 521a1405147SZachary Turner 522a1405147SZachary Turner // Bring in the no-argument base class version 523a1405147SZachary Turner using PythonObject::Reset; 524a1405147SZachary Turner 525a1405147SZachary Turner void 526a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 527a1405147SZachary Turner 528b58fb2f4SZachary Turner ArgInfo 529b58fb2f4SZachary Turner GetNumArguments() const; 530b58fb2f4SZachary Turner 531b58fb2f4SZachary Turner PythonObject 532b58fb2f4SZachary Turner operator ()(); 533a1405147SZachary Turner 534a1405147SZachary Turner PythonObject 535a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 536a1405147SZachary Turner 537a1405147SZachary Turner PythonObject 538a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 539b58fb2f4SZachary Turner 540b58fb2f4SZachary Turner template<typename Arg, typename... Args> 541b58fb2f4SZachary Turner PythonObject 542b58fb2f4SZachary Turner operator ()(const Arg &arg, Args... args) 543b58fb2f4SZachary Turner { 544b58fb2f4SZachary Turner return operator()({ arg, args... }); 545b58fb2f4SZachary Turner } 546a1405147SZachary Turner }; 547a1405147SZachary Turner 548a1405147SZachary Turner 5499c40264fSZachary Turner class PythonFile : public PythonObject 5509c40264fSZachary Turner { 5519c40264fSZachary Turner public: 55232064024SZachary Turner PythonFile(); 553eda01c31SZachary Turner PythonFile(File &file, const char *mode); 554eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 5559c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 556edb35d95SEugene Zelenko 5579c40264fSZachary Turner ~PythonFile() override; 5589c40264fSZachary Turner 5599c40264fSZachary Turner static bool Check(PyObject *py_obj); 5609c40264fSZachary Turner 5619c40264fSZachary Turner using PythonObject::Reset; 5629c40264fSZachary Turner 5639c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 5649c40264fSZachary Turner void Reset(File &file, const char *mode); 565eda01c31SZachary Turner 566744959b9SEnrico Granata static uint32_t GetOptionsFromMode(llvm::StringRef mode); 567744959b9SEnrico Granata 568eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 5699c40264fSZachary Turner }; 5709c40264fSZachary Turner 5712c1f46dcSZachary Turner } // namespace lldb_private 5722c1f46dcSZachary Turner 573a281b42bSZachary Turner #endif 574a281b42bSZachary Turner 5752c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 576