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 26*5a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h" 27*5a72c02bSZachary Turner 282c1f46dcSZachary Turner namespace lldb_private { 29edb35d95SEugene Zelenko 30*5a72c02bSZachary 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, 77*5a72c02bSZachary Turner #if PY_MAJOR_VERSION >= 3 78*5a72c02bSZachary Turner Bytes, 79*5a72c02bSZachary Turner #else 80*5a72c02bSZachary Turner Bytes = String, 81*5a72c02bSZachary Turner #endif 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 267*5a72c02bSZachary Turner class PythonBytes : public PythonObject 268*5a72c02bSZachary Turner { 269*5a72c02bSZachary Turner public: 270*5a72c02bSZachary Turner PythonBytes(); 271*5a72c02bSZachary Turner explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes); 272*5a72c02bSZachary Turner PythonBytes(const uint8_t *bytes, size_t length); 273*5a72c02bSZachary Turner PythonBytes(PyRefType type, PyObject *o); 274*5a72c02bSZachary Turner PythonBytes(const PythonBytes &object); 275*5a72c02bSZachary Turner 276*5a72c02bSZachary Turner ~PythonBytes() override; 277*5a72c02bSZachary Turner 278*5a72c02bSZachary Turner static bool 279*5a72c02bSZachary Turner Check(PyObject *py_obj); 280*5a72c02bSZachary Turner 281*5a72c02bSZachary Turner // Bring in the no-argument base class version 282*5a72c02bSZachary Turner using PythonObject::Reset; 283*5a72c02bSZachary Turner 284*5a72c02bSZachary Turner void 285*5a72c02bSZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 286*5a72c02bSZachary Turner 287*5a72c02bSZachary Turner llvm::ArrayRef<uint8_t> 288*5a72c02bSZachary Turner GetBytes() const; 289*5a72c02bSZachary Turner 290*5a72c02bSZachary Turner size_t 291*5a72c02bSZachary Turner GetSize() const; 292*5a72c02bSZachary Turner 293*5a72c02bSZachary Turner void 294*5a72c02bSZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 295*5a72c02bSZachary Turner 296*5a72c02bSZachary Turner StructuredData::StringSP 297*5a72c02bSZachary Turner CreateStructuredString() const; 298*5a72c02bSZachary Turner }; 299*5a72c02bSZachary Turner 3002c1f46dcSZachary Turner class PythonString : public PythonObject 3012c1f46dcSZachary Turner { 3022c1f46dcSZachary Turner public: 3032c1f46dcSZachary Turner PythonString(); 304f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 305f8b22f8fSZachary Turner explicit PythonString(const char *string); 30687f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 30787f47729SZachary Turner PythonString(const PythonString &object); 308edb35d95SEugene Zelenko 309f8b22f8fSZachary Turner ~PythonString() override; 3102c1f46dcSZachary Turner 31122c8efcdSZachary Turner static bool Check(PyObject *py_obj); 31222c8efcdSZachary Turner 313f8b22f8fSZachary Turner // Bring in the no-argument base class version 314f8b22f8fSZachary Turner using PythonObject::Reset; 315f8b22f8fSZachary Turner 316f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3172c1f46dcSZachary Turner 3182c1f46dcSZachary Turner llvm::StringRef 3192c1f46dcSZachary Turner GetString() const; 3202c1f46dcSZachary Turner 3212c1f46dcSZachary Turner size_t 3222c1f46dcSZachary Turner GetSize() const; 3232c1f46dcSZachary Turner 3242c1f46dcSZachary Turner void SetString(llvm::StringRef string); 3252c1f46dcSZachary Turner 3262c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 3272c1f46dcSZachary Turner }; 3282c1f46dcSZachary Turner 3292c1f46dcSZachary Turner class PythonInteger : public PythonObject 3302c1f46dcSZachary Turner { 3312c1f46dcSZachary Turner public: 3322c1f46dcSZachary Turner PythonInteger(); 33387f47729SZachary Turner explicit PythonInteger(int64_t value); 334f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 335f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 336edb35d95SEugene Zelenko 337f8b22f8fSZachary Turner ~PythonInteger() override; 3382c1f46dcSZachary Turner 33922c8efcdSZachary Turner static bool Check(PyObject *py_obj); 34022c8efcdSZachary Turner 341f8b22f8fSZachary Turner // Bring in the no-argument base class version 342f8b22f8fSZachary Turner using PythonObject::Reset; 343f8b22f8fSZachary Turner 344f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3452c1f46dcSZachary Turner 3462c1f46dcSZachary Turner int64_t GetInteger() const; 3472c1f46dcSZachary Turner 3482c1f46dcSZachary Turner void 3492c1f46dcSZachary Turner SetInteger (int64_t value); 3502c1f46dcSZachary Turner 3512c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 3522c1f46dcSZachary Turner }; 3532c1f46dcSZachary Turner 3542c1f46dcSZachary Turner class PythonList : public PythonObject 3552c1f46dcSZachary Turner { 3562c1f46dcSZachary Turner public: 357a1405147SZachary Turner PythonList() {} 35887f47729SZachary Turner explicit PythonList(PyInitialValue value); 35987f47729SZachary Turner explicit PythonList(int list_size); 360f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 361f8b22f8fSZachary Turner PythonList(const PythonList &list); 362edb35d95SEugene Zelenko 363f8b22f8fSZachary Turner ~PythonList() override; 3642c1f46dcSZachary Turner 36522c8efcdSZachary Turner static bool Check(PyObject *py_obj); 36622c8efcdSZachary Turner 367f8b22f8fSZachary Turner // Bring in the no-argument base class version 368f8b22f8fSZachary Turner using PythonObject::Reset; 369f8b22f8fSZachary Turner 370f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3712c1f46dcSZachary Turner 3722c1f46dcSZachary Turner uint32_t GetSize() const; 3732c1f46dcSZachary Turner 3742c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 3752c1f46dcSZachary Turner 376f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 3772c1f46dcSZachary Turner 378f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 3792c1f46dcSZachary Turner 3802c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 3812c1f46dcSZachary Turner }; 3822c1f46dcSZachary Turner 383a1405147SZachary Turner class PythonTuple : public PythonObject 384a1405147SZachary Turner { 385a1405147SZachary Turner public: 386a1405147SZachary Turner PythonTuple() {} 387a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 388a1405147SZachary Turner explicit PythonTuple(int tuple_size); 389a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 390a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 391a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 392a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject*> objects); 393a1405147SZachary Turner 394a1405147SZachary Turner ~PythonTuple() override; 395a1405147SZachary Turner 396a1405147SZachary Turner static bool Check(PyObject *py_obj); 397a1405147SZachary Turner 398a1405147SZachary Turner // Bring in the no-argument base class version 399a1405147SZachary Turner using PythonObject::Reset; 400a1405147SZachary Turner 401a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 402a1405147SZachary Turner 403a1405147SZachary Turner uint32_t GetSize() const; 404a1405147SZachary Turner 405a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 406a1405147SZachary Turner 407a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 408a1405147SZachary Turner 409a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 410a1405147SZachary Turner }; 411a1405147SZachary Turner 4122c1f46dcSZachary Turner class PythonDictionary : public PythonObject 4132c1f46dcSZachary Turner { 4142c1f46dcSZachary Turner public: 415a1405147SZachary Turner PythonDictionary() {} 41687f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 417f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 418f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 419edb35d95SEugene Zelenko 420f8b22f8fSZachary Turner ~PythonDictionary() override; 4212c1f46dcSZachary Turner 42222c8efcdSZachary Turner static bool Check(PyObject *py_obj); 42322c8efcdSZachary Turner 424f8b22f8fSZachary Turner // Bring in the no-argument base class version 425f8b22f8fSZachary Turner using PythonObject::Reset; 426f8b22f8fSZachary Turner 427f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4282c1f46dcSZachary Turner 4292c1f46dcSZachary Turner uint32_t GetSize() const; 4302c1f46dcSZachary Turner 431f8b22f8fSZachary Turner PythonList GetKeys() const; 4322c1f46dcSZachary Turner 433f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 434f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 4352c1f46dcSZachary Turner 4362c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 4372c1f46dcSZachary Turner }; 43887f47729SZachary Turner 4397841efbbSZachary Turner class PythonModule : public PythonObject 4407841efbbSZachary Turner { 4417841efbbSZachary Turner public: 4427841efbbSZachary Turner PythonModule(); 4437841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 4447841efbbSZachary Turner PythonModule(const PythonModule &dict); 4457841efbbSZachary Turner 4467841efbbSZachary Turner ~PythonModule() override; 4477841efbbSZachary Turner 4487841efbbSZachary Turner static bool Check(PyObject *py_obj); 4497841efbbSZachary Turner 450a1405147SZachary Turner static PythonModule 451a1405147SZachary Turner BuiltinsModule(); 452a1405147SZachary Turner 453a1405147SZachary Turner static PythonModule 454a1405147SZachary Turner MainModule(); 455a1405147SZachary Turner 456a1405147SZachary Turner static PythonModule 457a1405147SZachary Turner AddModule(llvm::StringRef module); 4587841efbbSZachary Turner 4592419f1d5SZachary Turner static PythonModule 4602419f1d5SZachary Turner ImportModule(llvm::StringRef module); 4612419f1d5SZachary Turner 4627841efbbSZachary Turner // Bring in the no-argument base class version 4637841efbbSZachary Turner using PythonObject::Reset; 4647841efbbSZachary Turner 4657841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4667841efbbSZachary Turner 4677841efbbSZachary Turner PythonDictionary GetDictionary() const; 4687841efbbSZachary Turner }; 4697841efbbSZachary Turner 470a1405147SZachary Turner class PythonCallable : public PythonObject 471a1405147SZachary Turner { 472a1405147SZachary Turner public: 473b58fb2f4SZachary Turner struct ArgInfo { 474b58fb2f4SZachary Turner size_t count; 475b58fb2f4SZachary Turner bool has_varargs : 1; 476b58fb2f4SZachary Turner bool has_kwargs : 1; 477b58fb2f4SZachary Turner }; 478b58fb2f4SZachary Turner 479a1405147SZachary Turner PythonCallable(); 480a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 481a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 482a1405147SZachary Turner 483a1405147SZachary Turner ~PythonCallable() override; 484a1405147SZachary Turner 485a1405147SZachary Turner static bool 486a1405147SZachary Turner Check(PyObject *py_obj); 487a1405147SZachary Turner 488a1405147SZachary Turner // Bring in the no-argument base class version 489a1405147SZachary Turner using PythonObject::Reset; 490a1405147SZachary Turner 491a1405147SZachary Turner void 492a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 493a1405147SZachary Turner 494b58fb2f4SZachary Turner ArgInfo 495b58fb2f4SZachary Turner GetNumArguments() const; 496b58fb2f4SZachary Turner 497b58fb2f4SZachary Turner PythonObject 498b58fb2f4SZachary Turner operator ()(); 499a1405147SZachary Turner 500a1405147SZachary Turner PythonObject 501a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 502a1405147SZachary Turner 503a1405147SZachary Turner PythonObject 504a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 505b58fb2f4SZachary Turner 506b58fb2f4SZachary Turner template<typename Arg, typename... Args> 507b58fb2f4SZachary Turner PythonObject 508b58fb2f4SZachary Turner operator ()(const Arg &arg, Args... args) 509b58fb2f4SZachary Turner { 510b58fb2f4SZachary Turner return operator()({ arg, args... }); 511b58fb2f4SZachary Turner } 512a1405147SZachary Turner }; 513a1405147SZachary Turner 514a1405147SZachary Turner 5159c40264fSZachary Turner class PythonFile : public PythonObject 5169c40264fSZachary Turner { 5179c40264fSZachary Turner public: 51832064024SZachary Turner PythonFile(); 519eda01c31SZachary Turner PythonFile(File &file, const char *mode); 520eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 5219c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 522edb35d95SEugene Zelenko 5239c40264fSZachary Turner ~PythonFile() override; 5249c40264fSZachary Turner 5259c40264fSZachary Turner static bool Check(PyObject *py_obj); 5269c40264fSZachary Turner 5279c40264fSZachary Turner using PythonObject::Reset; 5289c40264fSZachary Turner 5299c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 5309c40264fSZachary Turner void Reset(File &file, const char *mode); 531eda01c31SZachary Turner 532eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 5339c40264fSZachary Turner }; 5349c40264fSZachary Turner 5352c1f46dcSZachary Turner } // namespace lldb_private 5362c1f46dcSZachary Turner 537a281b42bSZachary Turner #endif 538a281b42bSZachary Turner 5392c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 540