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, 787841efbbSZachary Turner Module, 79a1405147SZachary Turner Callable, 80a1405147SZachary Turner Tuple, 819c40264fSZachary Turner File 822c1f46dcSZachary Turner }; 832c1f46dcSZachary Turner 84f8b22f8fSZachary Turner enum class PyRefType 85f8b22f8fSZachary Turner { 86f8b22f8fSZachary Turner Borrowed, // We are not given ownership of the incoming PyObject. 87f8b22f8fSZachary Turner // We cannot safely hold it without calling Py_INCREF. 88f8b22f8fSZachary Turner Owned // We have ownership of the incoming PyObject. We should 89f8b22f8fSZachary Turner // not call Py_INCREF. 90f8b22f8fSZachary Turner }; 91f8b22f8fSZachary Turner 92f8b22f8fSZachary Turner enum class PyInitialValue 93f8b22f8fSZachary Turner { 94f8b22f8fSZachary Turner Invalid, 95f8b22f8fSZachary Turner Empty 96f8b22f8fSZachary Turner }; 97f8b22f8fSZachary Turner 982c1f46dcSZachary Turner class PythonObject 992c1f46dcSZachary Turner { 1002c1f46dcSZachary Turner public: 101f8b22f8fSZachary Turner PythonObject() 102f8b22f8fSZachary Turner : m_py_obj(nullptr) 1032c1f46dcSZachary Turner { 1042c1f46dcSZachary Turner } 1052c1f46dcSZachary Turner 106f8b22f8fSZachary Turner PythonObject(PyRefType type, PyObject *py_obj) 107f8b22f8fSZachary Turner : m_py_obj(nullptr) 1082c1f46dcSZachary Turner { 109f8b22f8fSZachary Turner Reset(type, py_obj); 1102c1f46dcSZachary Turner } 1112c1f46dcSZachary Turner 112f8b22f8fSZachary Turner PythonObject(const PythonObject &rhs) 113f8b22f8fSZachary Turner : m_py_obj(nullptr) 1142c1f46dcSZachary Turner { 115f8b22f8fSZachary Turner Reset(rhs); 1162c1f46dcSZachary Turner } 1172c1f46dcSZachary Turner 118edb35d95SEugene Zelenko virtual ~PythonObject() 119edb35d95SEugene Zelenko { 120edb35d95SEugene Zelenko Reset(); 121edb35d95SEugene Zelenko } 1222c1f46dcSZachary Turner 123f8b22f8fSZachary Turner void 124f8b22f8fSZachary Turner Reset() 1252c1f46dcSZachary Turner { 126f8b22f8fSZachary Turner // Avoid calling the virtual method since it's not necessary 127f8b22f8fSZachary Turner // to actually validate the type of the PyObject if we're 128f8b22f8fSZachary Turner // just setting to null. 1292c1f46dcSZachary Turner if (Py_IsInitialized()) 1302c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 131f8b22f8fSZachary Turner m_py_obj = nullptr; 1322c1f46dcSZachary Turner } 133f8b22f8fSZachary Turner 134f8b22f8fSZachary Turner void 135f8b22f8fSZachary Turner Reset(const PythonObject &rhs) 136f8b22f8fSZachary Turner { 137f8b22f8fSZachary Turner // Avoid calling the virtual method if it's not necessary 138f8b22f8fSZachary Turner // to actually validate the type of the PyObject. 13960c24f70SZachary Turner if (!rhs.IsValid()) 140f8b22f8fSZachary Turner Reset(); 141f8b22f8fSZachary Turner else 142f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, rhs.m_py_obj); 143f8b22f8fSZachary Turner } 144f8b22f8fSZachary Turner 145f8b22f8fSZachary Turner // PythonObject is implicitly convertible to PyObject *, which will call the 146f8b22f8fSZachary Turner // wrong overload. We want to explicitly disallow this, since a PyObject 147f8b22f8fSZachary Turner // *always* owns its reference. Therefore the overload which takes a 148f8b22f8fSZachary Turner // PyRefType doesn't make sense, and the copy constructor should be used. 149f8b22f8fSZachary Turner void 150f8b22f8fSZachary Turner Reset(PyRefType type, const PythonObject &ref) = delete; 151f8b22f8fSZachary Turner 152f8b22f8fSZachary Turner virtual void 153f8b22f8fSZachary Turner Reset(PyRefType type, PyObject *py_obj) 154f8b22f8fSZachary Turner { 155f8b22f8fSZachary Turner if (py_obj == m_py_obj) 156f8b22f8fSZachary Turner return; 157f8b22f8fSZachary Turner 158f8b22f8fSZachary Turner if (Py_IsInitialized()) 159f8b22f8fSZachary Turner Py_XDECREF(m_py_obj); 160f8b22f8fSZachary Turner 161f8b22f8fSZachary Turner m_py_obj = py_obj; 162f8b22f8fSZachary Turner 163f8b22f8fSZachary Turner // If this is a borrowed reference, we need to convert it to 164f8b22f8fSZachary Turner // an owned reference by incrementing it. If it is an owned 165f8b22f8fSZachary Turner // reference (for example the caller allocated it with PyDict_New() 166f8b22f8fSZachary Turner // then we must *not* increment it. 167f8b22f8fSZachary Turner if (Py_IsInitialized() && type == PyRefType::Borrowed) 168f8b22f8fSZachary Turner Py_XINCREF(m_py_obj); 1692c1f46dcSZachary Turner } 1702c1f46dcSZachary Turner 1712c1f46dcSZachary Turner void 1722c1f46dcSZachary Turner Dump () const 1732c1f46dcSZachary Turner { 1742c1f46dcSZachary Turner if (m_py_obj) 1752c1f46dcSZachary Turner _PyObject_Dump (m_py_obj); 1762c1f46dcSZachary Turner else 1772c1f46dcSZachary Turner puts ("NULL"); 1782c1f46dcSZachary Turner } 1792c1f46dcSZachary Turner 1802c1f46dcSZachary Turner void 1812c1f46dcSZachary Turner Dump (Stream &strm) const; 1822c1f46dcSZachary Turner 1832c1f46dcSZachary Turner PyObject* 1842c1f46dcSZachary Turner get() const 1852c1f46dcSZachary Turner { 1862c1f46dcSZachary Turner return m_py_obj; 1872c1f46dcSZachary Turner } 1882c1f46dcSZachary Turner 18960c24f70SZachary Turner PyObject* 19060c24f70SZachary Turner release() 19160c24f70SZachary Turner { 19260c24f70SZachary Turner PyObject *result = m_py_obj; 19360c24f70SZachary Turner m_py_obj = nullptr; 19460c24f70SZachary Turner return result; 19560c24f70SZachary Turner } 19660c24f70SZachary Turner 197f8b22f8fSZachary Turner PythonObject & 198f8b22f8fSZachary Turner operator=(const PythonObject &other) 1992c1f46dcSZachary Turner { 200f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, other.get()); 201f8b22f8fSZachary Turner return *this; 2022c1f46dcSZachary Turner } 2032c1f46dcSZachary Turner 2047841efbbSZachary Turner PyObjectType 2057841efbbSZachary Turner GetObjectType() const; 2067841efbbSZachary Turner 2077841efbbSZachary Turner PythonString 2087841efbbSZachary Turner Repr() const; 2097841efbbSZachary Turner 2107841efbbSZachary Turner PythonString 2117841efbbSZachary Turner Str() const; 2127841efbbSZachary Turner 2137841efbbSZachary Turner static PythonObject 21402bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict); 2157841efbbSZachary Turner 216b58fb2f4SZachary Turner template<typename T> 217b58fb2f4SZachary Turner static T 21802bf92d2SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict) 219b58fb2f4SZachary Turner { 220b58fb2f4SZachary Turner return ResolveNameWithDictionary(name, dict).AsType<T>(); 221b58fb2f4SZachary Turner } 222b58fb2f4SZachary Turner 2237841efbbSZachary Turner PythonObject 2247841efbbSZachary Turner ResolveName(llvm::StringRef name) const; 2257841efbbSZachary Turner 226b58fb2f4SZachary Turner template<typename T> 227b58fb2f4SZachary Turner T 228b58fb2f4SZachary Turner ResolveName(llvm::StringRef name) const 229b58fb2f4SZachary Turner { 230b58fb2f4SZachary Turner return ResolveName(name).AsType<T>(); 231b58fb2f4SZachary Turner } 232b58fb2f4SZachary Turner 2332c1f46dcSZachary Turner bool 2349c40264fSZachary Turner HasAttribute(llvm::StringRef attribute) const; 2359c40264fSZachary Turner 2367d6d218eSZachary Turner PythonObject 2377d6d218eSZachary Turner GetAttributeValue(llvm::StringRef attribute) const; 2387d6d218eSZachary Turner 2399c40264fSZachary Turner bool 240f8b22f8fSZachary Turner IsValid() const; 241f8b22f8fSZachary Turner 242f8b22f8fSZachary Turner bool 243f8b22f8fSZachary Turner IsAllocated() const; 244f8b22f8fSZachary Turner 245f8b22f8fSZachary Turner bool 246f8b22f8fSZachary Turner IsNone() const; 2472c1f46dcSZachary Turner 2487d6d218eSZachary Turner template<typename T> 2497d6d218eSZachary Turner T AsType() const 2507d6d218eSZachary Turner { 2517d6d218eSZachary Turner if (!T::Check(m_py_obj)) 2527d6d218eSZachary Turner return T(); 2537d6d218eSZachary Turner return T(PyRefType::Borrowed, m_py_obj); 2547d6d218eSZachary Turner } 2557d6d218eSZachary Turner 2567841efbbSZachary Turner StructuredData::ObjectSP 2577841efbbSZachary Turner CreateStructuredObject() const; 2582c1f46dcSZachary Turner 2592c1f46dcSZachary Turner protected: 2602c1f46dcSZachary Turner PyObject* m_py_obj; 2612c1f46dcSZachary Turner }; 2622c1f46dcSZachary Turner 2635a72c02bSZachary Turner class PythonBytes : public PythonObject 2645a72c02bSZachary Turner { 2655a72c02bSZachary Turner public: 2665a72c02bSZachary Turner PythonBytes(); 2675a72c02bSZachary Turner explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes); 2685a72c02bSZachary Turner PythonBytes(const uint8_t *bytes, size_t length); 2695a72c02bSZachary Turner PythonBytes(PyRefType type, PyObject *o); 2705a72c02bSZachary Turner PythonBytes(const PythonBytes &object); 2715a72c02bSZachary Turner 2725a72c02bSZachary Turner ~PythonBytes() override; 2735a72c02bSZachary Turner 2745a72c02bSZachary Turner static bool 2755a72c02bSZachary Turner Check(PyObject *py_obj); 2765a72c02bSZachary Turner 2775a72c02bSZachary Turner // Bring in the no-argument base class version 2785a72c02bSZachary Turner using PythonObject::Reset; 2795a72c02bSZachary Turner 2805a72c02bSZachary Turner void 2815a72c02bSZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 2825a72c02bSZachary Turner 2835a72c02bSZachary Turner llvm::ArrayRef<uint8_t> 2845a72c02bSZachary Turner GetBytes() const; 2855a72c02bSZachary Turner 2865a72c02bSZachary Turner size_t 2875a72c02bSZachary Turner GetSize() const; 2885a72c02bSZachary Turner 2895a72c02bSZachary Turner void 2905a72c02bSZachary Turner SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 2915a72c02bSZachary Turner 2925a72c02bSZachary Turner StructuredData::StringSP 2935a72c02bSZachary Turner CreateStructuredString() const; 2945a72c02bSZachary Turner }; 2955a72c02bSZachary Turner 2962c1f46dcSZachary Turner class PythonString : public PythonObject 2972c1f46dcSZachary Turner { 2982c1f46dcSZachary Turner public: 2992c1f46dcSZachary Turner PythonString(); 300f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 301f8b22f8fSZachary Turner explicit PythonString(const char *string); 30287f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 30387f47729SZachary Turner PythonString(const PythonString &object); 304edb35d95SEugene Zelenko 305f8b22f8fSZachary Turner ~PythonString() override; 3062c1f46dcSZachary Turner 30722c8efcdSZachary Turner static bool Check(PyObject *py_obj); 30822c8efcdSZachary Turner 309f8b22f8fSZachary Turner // Bring in the no-argument base class version 310f8b22f8fSZachary Turner using PythonObject::Reset; 311f8b22f8fSZachary Turner 312f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3132c1f46dcSZachary Turner 3142c1f46dcSZachary Turner llvm::StringRef 3152c1f46dcSZachary Turner GetString() const; 3162c1f46dcSZachary Turner 3172c1f46dcSZachary Turner size_t 3182c1f46dcSZachary Turner GetSize() const; 3192c1f46dcSZachary Turner 3202c1f46dcSZachary Turner void SetString(llvm::StringRef string); 3212c1f46dcSZachary Turner 3222c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 3232c1f46dcSZachary Turner }; 3242c1f46dcSZachary Turner 3252c1f46dcSZachary Turner class PythonInteger : public PythonObject 3262c1f46dcSZachary Turner { 3272c1f46dcSZachary Turner public: 3282c1f46dcSZachary Turner PythonInteger(); 32987f47729SZachary Turner explicit PythonInteger(int64_t value); 330f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 331f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 332edb35d95SEugene Zelenko 333f8b22f8fSZachary Turner ~PythonInteger() override; 3342c1f46dcSZachary Turner 33522c8efcdSZachary Turner static bool Check(PyObject *py_obj); 33622c8efcdSZachary Turner 337f8b22f8fSZachary Turner // Bring in the no-argument base class version 338f8b22f8fSZachary Turner using PythonObject::Reset; 339f8b22f8fSZachary Turner 340f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3412c1f46dcSZachary Turner 3422c1f46dcSZachary Turner int64_t GetInteger() const; 3432c1f46dcSZachary Turner 3442c1f46dcSZachary Turner void 3452c1f46dcSZachary Turner SetInteger (int64_t value); 3462c1f46dcSZachary Turner 3472c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 3482c1f46dcSZachary Turner }; 3492c1f46dcSZachary Turner 3502c1f46dcSZachary Turner class PythonList : public PythonObject 3512c1f46dcSZachary Turner { 3522c1f46dcSZachary Turner public: 353a1405147SZachary Turner PythonList() {} 35487f47729SZachary Turner explicit PythonList(PyInitialValue value); 35587f47729SZachary Turner explicit PythonList(int list_size); 356f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 357f8b22f8fSZachary Turner PythonList(const PythonList &list); 358edb35d95SEugene Zelenko 359f8b22f8fSZachary Turner ~PythonList() override; 3602c1f46dcSZachary Turner 36122c8efcdSZachary Turner static bool Check(PyObject *py_obj); 36222c8efcdSZachary Turner 363f8b22f8fSZachary Turner // Bring in the no-argument base class version 364f8b22f8fSZachary Turner using PythonObject::Reset; 365f8b22f8fSZachary Turner 366f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3672c1f46dcSZachary Turner 3682c1f46dcSZachary Turner uint32_t GetSize() const; 3692c1f46dcSZachary Turner 3702c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 3712c1f46dcSZachary Turner 372f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 3732c1f46dcSZachary Turner 374f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 3752c1f46dcSZachary Turner 3762c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 3772c1f46dcSZachary Turner }; 3782c1f46dcSZachary Turner 379a1405147SZachary Turner class PythonTuple : public PythonObject 380a1405147SZachary Turner { 381a1405147SZachary Turner public: 382a1405147SZachary Turner PythonTuple() {} 383a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 384a1405147SZachary Turner explicit PythonTuple(int tuple_size); 385a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 386a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 387a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 388a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject*> objects); 389a1405147SZachary Turner 390a1405147SZachary Turner ~PythonTuple() override; 391a1405147SZachary Turner 392a1405147SZachary Turner static bool Check(PyObject *py_obj); 393a1405147SZachary Turner 394a1405147SZachary Turner // Bring in the no-argument base class version 395a1405147SZachary Turner using PythonObject::Reset; 396a1405147SZachary Turner 397a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 398a1405147SZachary Turner 399a1405147SZachary Turner uint32_t GetSize() const; 400a1405147SZachary Turner 401a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 402a1405147SZachary Turner 403a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 404a1405147SZachary Turner 405a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 406a1405147SZachary Turner }; 407a1405147SZachary Turner 4082c1f46dcSZachary Turner class PythonDictionary : public PythonObject 4092c1f46dcSZachary Turner { 4102c1f46dcSZachary Turner public: 411a1405147SZachary Turner PythonDictionary() {} 41287f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 413f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 414f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 415edb35d95SEugene Zelenko 416f8b22f8fSZachary Turner ~PythonDictionary() override; 4172c1f46dcSZachary Turner 41822c8efcdSZachary Turner static bool Check(PyObject *py_obj); 41922c8efcdSZachary Turner 420f8b22f8fSZachary Turner // Bring in the no-argument base class version 421f8b22f8fSZachary Turner using PythonObject::Reset; 422f8b22f8fSZachary Turner 423f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4242c1f46dcSZachary Turner 4252c1f46dcSZachary Turner uint32_t GetSize() const; 4262c1f46dcSZachary Turner 427f8b22f8fSZachary Turner PythonList GetKeys() const; 4282c1f46dcSZachary Turner 429f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 430f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 4312c1f46dcSZachary Turner 4322c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 4332c1f46dcSZachary Turner }; 43487f47729SZachary Turner 4357841efbbSZachary Turner class PythonModule : public PythonObject 4367841efbbSZachary Turner { 4377841efbbSZachary Turner public: 4387841efbbSZachary Turner PythonModule(); 4397841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 4407841efbbSZachary Turner PythonModule(const PythonModule &dict); 4417841efbbSZachary Turner 4427841efbbSZachary Turner ~PythonModule() override; 4437841efbbSZachary Turner 4447841efbbSZachary Turner static bool Check(PyObject *py_obj); 4457841efbbSZachary Turner 446a1405147SZachary Turner static PythonModule 447a1405147SZachary Turner BuiltinsModule(); 448a1405147SZachary Turner 449a1405147SZachary Turner static PythonModule 450a1405147SZachary Turner MainModule(); 451a1405147SZachary Turner 452a1405147SZachary Turner static PythonModule 453a1405147SZachary Turner AddModule(llvm::StringRef module); 4547841efbbSZachary Turner 4552419f1d5SZachary Turner static PythonModule 4562419f1d5SZachary Turner ImportModule(llvm::StringRef module); 4572419f1d5SZachary Turner 4587841efbbSZachary Turner // Bring in the no-argument base class version 4597841efbbSZachary Turner using PythonObject::Reset; 4607841efbbSZachary Turner 4617841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4627841efbbSZachary Turner 4637841efbbSZachary Turner PythonDictionary GetDictionary() const; 4647841efbbSZachary Turner }; 4657841efbbSZachary Turner 466a1405147SZachary Turner class PythonCallable : public PythonObject 467a1405147SZachary Turner { 468a1405147SZachary Turner public: 469b58fb2f4SZachary Turner struct ArgInfo { 470b58fb2f4SZachary Turner size_t count; 471b58fb2f4SZachary Turner bool has_varargs : 1; 472b58fb2f4SZachary Turner bool has_kwargs : 1; 473b58fb2f4SZachary Turner }; 474b58fb2f4SZachary Turner 475a1405147SZachary Turner PythonCallable(); 476a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 477a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 478a1405147SZachary Turner 479a1405147SZachary Turner ~PythonCallable() override; 480a1405147SZachary Turner 481a1405147SZachary Turner static bool 482a1405147SZachary Turner Check(PyObject *py_obj); 483a1405147SZachary Turner 484a1405147SZachary Turner // Bring in the no-argument base class version 485a1405147SZachary Turner using PythonObject::Reset; 486a1405147SZachary Turner 487a1405147SZachary Turner void 488a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 489a1405147SZachary Turner 490b58fb2f4SZachary Turner ArgInfo 491b58fb2f4SZachary Turner GetNumArguments() const; 492b58fb2f4SZachary Turner 493b58fb2f4SZachary Turner PythonObject 494b58fb2f4SZachary Turner operator ()(); 495a1405147SZachary Turner 496a1405147SZachary Turner PythonObject 497a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 498a1405147SZachary Turner 499a1405147SZachary Turner PythonObject 500a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 501b58fb2f4SZachary Turner 502b58fb2f4SZachary Turner template<typename Arg, typename... Args> 503b58fb2f4SZachary Turner PythonObject 504b58fb2f4SZachary Turner operator ()(const Arg &arg, Args... args) 505b58fb2f4SZachary Turner { 506b58fb2f4SZachary Turner return operator()({ arg, args... }); 507b58fb2f4SZachary Turner } 508a1405147SZachary Turner }; 509a1405147SZachary Turner 510a1405147SZachary Turner 5119c40264fSZachary Turner class PythonFile : public PythonObject 5129c40264fSZachary Turner { 5139c40264fSZachary Turner public: 51432064024SZachary Turner PythonFile(); 515eda01c31SZachary Turner PythonFile(File &file, const char *mode); 516eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 5179c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 518edb35d95SEugene Zelenko 5199c40264fSZachary Turner ~PythonFile() override; 5209c40264fSZachary Turner 5219c40264fSZachary Turner static bool Check(PyObject *py_obj); 5229c40264fSZachary Turner 5239c40264fSZachary Turner using PythonObject::Reset; 5249c40264fSZachary Turner 5259c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 5269c40264fSZachary Turner void Reset(File &file, const char *mode); 527eda01c31SZachary Turner 528*744959b9SEnrico Granata static uint32_t GetOptionsFromMode(llvm::StringRef mode); 529*744959b9SEnrico Granata 530eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 5319c40264fSZachary Turner }; 5329c40264fSZachary Turner 5332c1f46dcSZachary Turner } // namespace lldb_private 5342c1f46dcSZachary Turner 535a281b42bSZachary Turner #endif 536a281b42bSZachary Turner 5372c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 538