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 1541de9a97SKate Stone // LLDB Python header must be included first 1641de9a97SKate Stone #include "lldb-python.h" 1741de9a97SKate 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/Flags.h" 239ba9dfddSPavel Labath #include "lldb/Core/StructuredData.h" 249c40264fSZachary Turner #include "lldb/Host/File.h" 252c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h" 26*bf9a7730SZachary Turner #include "lldb/Utility/ConstString.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 39b9c1b51eSKate Stone class StructuredPythonObject : public StructuredData::Generic { 402c1f46dcSZachary Turner public: 41b9c1b51eSKate Stone StructuredPythonObject() : StructuredData::Generic() {} 422c1f46dcSZachary Turner 43b9c1b51eSKate Stone StructuredPythonObject(void *obj) : StructuredData::Generic(obj) { 442c1f46dcSZachary Turner Py_XINCREF(GetValue()); 452c1f46dcSZachary Turner } 462c1f46dcSZachary Turner 47b9c1b51eSKate Stone ~StructuredPythonObject() override { 482c1f46dcSZachary Turner if (Py_IsInitialized()) 492c1f46dcSZachary Turner Py_XDECREF(GetValue()); 502c1f46dcSZachary Turner SetValue(nullptr); 512c1f46dcSZachary Turner } 522c1f46dcSZachary Turner 53b9c1b51eSKate Stone bool IsValid() const override { return GetValue() && GetValue() != Py_None; } 542c1f46dcSZachary Turner 55d9c9da53SJason Molenda void Dump(Stream &s, bool pretty_print = true) const override; 562c1f46dcSZachary Turner 572c1f46dcSZachary Turner private: 582c1f46dcSZachary Turner DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject); 592c1f46dcSZachary Turner }; 602c1f46dcSZachary Turner 61b9c1b51eSKate Stone enum class PyObjectType { 622c1f46dcSZachary Turner Unknown, 632c1f46dcSZachary Turner None, 642c1f46dcSZachary Turner Integer, 652c1f46dcSZachary Turner Dictionary, 662c1f46dcSZachary Turner List, 679c40264fSZachary Turner String, 685a72c02bSZachary Turner Bytes, 69f9d6d204SZachary Turner ByteArray, 707841efbbSZachary Turner Module, 71a1405147SZachary Turner Callable, 72a1405147SZachary Turner Tuple, 739c40264fSZachary Turner File 742c1f46dcSZachary Turner }; 752c1f46dcSZachary Turner 76b9c1b51eSKate Stone enum class PyRefType { 77f8b22f8fSZachary Turner Borrowed, // We are not given ownership of the incoming PyObject. 78f8b22f8fSZachary Turner // We cannot safely hold it without calling Py_INCREF. 79f8b22f8fSZachary Turner Owned // We have ownership of the incoming PyObject. We should 80f8b22f8fSZachary Turner // not call Py_INCREF. 81f8b22f8fSZachary Turner }; 82f8b22f8fSZachary Turner 83b9c1b51eSKate Stone enum class PyInitialValue { Invalid, Empty }; 84f8b22f8fSZachary Turner 85b9c1b51eSKate Stone class PythonObject { 862c1f46dcSZachary Turner public: 87b9c1b51eSKate Stone PythonObject() : m_py_obj(nullptr) {} 882c1f46dcSZachary Turner 89b9c1b51eSKate Stone PythonObject(PyRefType type, PyObject *py_obj) : m_py_obj(nullptr) { 90f8b22f8fSZachary Turner Reset(type, py_obj); 912c1f46dcSZachary Turner } 922c1f46dcSZachary Turner 93b9c1b51eSKate Stone PythonObject(const PythonObject &rhs) : m_py_obj(nullptr) { Reset(rhs); } 942c1f46dcSZachary Turner 95b9c1b51eSKate Stone virtual ~PythonObject() { Reset(); } 962c1f46dcSZachary Turner 97b9c1b51eSKate Stone void Reset() { 98f8b22f8fSZachary Turner // Avoid calling the virtual method since it's not necessary 99f8b22f8fSZachary Turner // to actually validate the type of the PyObject if we're 100f8b22f8fSZachary Turner // just setting to null. 1012c1f46dcSZachary Turner if (Py_IsInitialized()) 1022c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 103f8b22f8fSZachary Turner m_py_obj = nullptr; 1042c1f46dcSZachary Turner } 105f8b22f8fSZachary Turner 106b9c1b51eSKate Stone void Reset(const PythonObject &rhs) { 107f8b22f8fSZachary Turner // Avoid calling the virtual method if it's not necessary 108f8b22f8fSZachary Turner // to actually validate the type of the PyObject. 10960c24f70SZachary Turner if (!rhs.IsValid()) 110f8b22f8fSZachary Turner Reset(); 111f8b22f8fSZachary Turner else 112f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, rhs.m_py_obj); 113f8b22f8fSZachary Turner } 114f8b22f8fSZachary Turner 115f8b22f8fSZachary Turner // PythonObject is implicitly convertible to PyObject *, which will call the 116f8b22f8fSZachary Turner // wrong overload. We want to explicitly disallow this, since a PyObject 117f8b22f8fSZachary Turner // *always* owns its reference. Therefore the overload which takes a 118f8b22f8fSZachary Turner // PyRefType doesn't make sense, and the copy constructor should be used. 119b9c1b51eSKate Stone void Reset(PyRefType type, const PythonObject &ref) = delete; 120f8b22f8fSZachary Turner 121b9c1b51eSKate Stone virtual void Reset(PyRefType type, PyObject *py_obj) { 122f8b22f8fSZachary Turner if (py_obj == m_py_obj) 123f8b22f8fSZachary Turner return; 124f8b22f8fSZachary Turner 125f8b22f8fSZachary Turner if (Py_IsInitialized()) 126f8b22f8fSZachary Turner Py_XDECREF(m_py_obj); 127f8b22f8fSZachary Turner 128f8b22f8fSZachary Turner m_py_obj = py_obj; 129f8b22f8fSZachary Turner 130f8b22f8fSZachary Turner // If this is a borrowed reference, we need to convert it to 131f8b22f8fSZachary Turner // an owned reference by incrementing it. If it is an owned 132f8b22f8fSZachary Turner // reference (for example the caller allocated it with PyDict_New() 133f8b22f8fSZachary Turner // then we must *not* increment it. 134f8b22f8fSZachary Turner if (Py_IsInitialized() && type == PyRefType::Borrowed) 135f8b22f8fSZachary Turner Py_XINCREF(m_py_obj); 1362c1f46dcSZachary Turner } 1372c1f46dcSZachary Turner 138b9c1b51eSKate Stone void Dump() const { 1392c1f46dcSZachary Turner if (m_py_obj) 1402c1f46dcSZachary Turner _PyObject_Dump(m_py_obj); 1412c1f46dcSZachary Turner else 1422c1f46dcSZachary Turner puts("NULL"); 1432c1f46dcSZachary Turner } 1442c1f46dcSZachary Turner 145b9c1b51eSKate Stone void Dump(Stream &strm) const; 1462c1f46dcSZachary Turner 147b9c1b51eSKate Stone PyObject *get() const { return m_py_obj; } 1482c1f46dcSZachary Turner 149b9c1b51eSKate Stone PyObject *release() { 15060c24f70SZachary Turner PyObject *result = m_py_obj; 15160c24f70SZachary Turner m_py_obj = nullptr; 15260c24f70SZachary Turner return result; 15360c24f70SZachary Turner } 15460c24f70SZachary Turner 155b9c1b51eSKate Stone PythonObject &operator=(const PythonObject &other) { 156f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, other.get()); 157f8b22f8fSZachary Turner return *this; 1582c1f46dcSZachary Turner } 1592c1f46dcSZachary Turner 160b9c1b51eSKate Stone PyObjectType GetObjectType() const; 1617841efbbSZachary Turner 162b9c1b51eSKate Stone PythonString Repr() const; 1637841efbbSZachary Turner 164b9c1b51eSKate Stone PythonString Str() const; 1657841efbbSZachary Turner 166b9c1b51eSKate Stone static PythonObject ResolveNameWithDictionary(llvm::StringRef name, 167b9c1b51eSKate Stone const PythonDictionary &dict); 1687841efbbSZachary Turner 169b58fb2f4SZachary Turner template <typename T> 170b9c1b51eSKate Stone static T ResolveNameWithDictionary(llvm::StringRef name, 171b9c1b51eSKate Stone const PythonDictionary &dict) { 172b58fb2f4SZachary Turner return ResolveNameWithDictionary(name, dict).AsType<T>(); 173b58fb2f4SZachary Turner } 174b58fb2f4SZachary Turner 175b9c1b51eSKate Stone PythonObject ResolveName(llvm::StringRef name) const; 1767841efbbSZachary Turner 177b9c1b51eSKate Stone template <typename T> T ResolveName(llvm::StringRef name) const { 178b58fb2f4SZachary Turner return ResolveName(name).AsType<T>(); 179b58fb2f4SZachary Turner } 180b58fb2f4SZachary Turner 181b9c1b51eSKate Stone bool HasAttribute(llvm::StringRef attribute) const; 1829c40264fSZachary Turner 183b9c1b51eSKate Stone PythonObject GetAttributeValue(llvm::StringRef attribute) const; 1847d6d218eSZachary Turner 185b9c1b51eSKate Stone bool IsValid() const; 186f8b22f8fSZachary Turner 187b9c1b51eSKate Stone bool IsAllocated() const; 188f8b22f8fSZachary Turner 189b9c1b51eSKate Stone bool IsNone() const; 1902c1f46dcSZachary Turner 191b9c1b51eSKate Stone template <typename T> T AsType() const { 1927d6d218eSZachary Turner if (!T::Check(m_py_obj)) 1937d6d218eSZachary Turner return T(); 1947d6d218eSZachary Turner return T(PyRefType::Borrowed, m_py_obj); 1957d6d218eSZachary Turner } 1967d6d218eSZachary Turner 197b9c1b51eSKate Stone StructuredData::ObjectSP CreateStructuredObject() const; 1982c1f46dcSZachary Turner 1992c1f46dcSZachary Turner protected: 2002c1f46dcSZachary Turner PyObject *m_py_obj; 2012c1f46dcSZachary Turner }; 2022c1f46dcSZachary Turner 203b9c1b51eSKate Stone class PythonBytes : public PythonObject { 2045a72c02bSZachary Turner public: 2055a72c02bSZachary Turner PythonBytes(); 2065a72c02bSZachary Turner explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes); 2075a72c02bSZachary Turner PythonBytes(const uint8_t *bytes, size_t length); 2085a72c02bSZachary Turner PythonBytes(PyRefType type, PyObject *o); 2095a72c02bSZachary Turner PythonBytes(const PythonBytes &object); 2105a72c02bSZachary Turner 2115a72c02bSZachary Turner ~PythonBytes() override; 2125a72c02bSZachary Turner 213b9c1b51eSKate Stone static bool Check(PyObject *py_obj); 2145a72c02bSZachary Turner 2155a72c02bSZachary Turner // Bring in the no-argument base class version 2165a72c02bSZachary Turner using PythonObject::Reset; 2175a72c02bSZachary Turner 218b9c1b51eSKate Stone void Reset(PyRefType type, PyObject *py_obj) override; 2195a72c02bSZachary Turner 220b9c1b51eSKate Stone llvm::ArrayRef<uint8_t> GetBytes() const; 2215a72c02bSZachary Turner 222b9c1b51eSKate Stone size_t GetSize() const; 2235a72c02bSZachary Turner 224b9c1b51eSKate Stone void SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 2255a72c02bSZachary Turner 226b9c1b51eSKate Stone StructuredData::StringSP CreateStructuredString() const; 2275a72c02bSZachary Turner }; 2285a72c02bSZachary Turner 229b9c1b51eSKate Stone class PythonByteArray : public PythonObject { 230f9d6d204SZachary Turner public: 231f9d6d204SZachary Turner PythonByteArray(); 232f9d6d204SZachary Turner explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes); 233f9d6d204SZachary Turner PythonByteArray(const uint8_t *bytes, size_t length); 234f9d6d204SZachary Turner PythonByteArray(PyRefType type, PyObject *o); 235f9d6d204SZachary Turner PythonByteArray(const PythonBytes &object); 236f9d6d204SZachary Turner 237f9d6d204SZachary Turner ~PythonByteArray() override; 238f9d6d204SZachary Turner 239b9c1b51eSKate Stone static bool Check(PyObject *py_obj); 240f9d6d204SZachary Turner 241f9d6d204SZachary Turner // Bring in the no-argument base class version 242f9d6d204SZachary Turner using PythonObject::Reset; 243f9d6d204SZachary Turner 244b9c1b51eSKate Stone void Reset(PyRefType type, PyObject *py_obj) override; 245f9d6d204SZachary Turner 246b9c1b51eSKate Stone llvm::ArrayRef<uint8_t> GetBytes() const; 247f9d6d204SZachary Turner 248b9c1b51eSKate Stone size_t GetSize() const; 249f9d6d204SZachary Turner 250b9c1b51eSKate Stone void SetBytes(llvm::ArrayRef<uint8_t> stringbytes); 251f9d6d204SZachary Turner 252b9c1b51eSKate Stone StructuredData::StringSP CreateStructuredString() const; 253f9d6d204SZachary Turner }; 254f9d6d204SZachary Turner 255b9c1b51eSKate Stone class PythonString : public PythonObject { 2562c1f46dcSZachary Turner public: 2572c1f46dcSZachary Turner PythonString(); 258f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 259f8b22f8fSZachary Turner explicit PythonString(const char *string); 26087f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 26187f47729SZachary Turner PythonString(const PythonString &object); 262edb35d95SEugene Zelenko 263f8b22f8fSZachary Turner ~PythonString() override; 2642c1f46dcSZachary Turner 26522c8efcdSZachary Turner static bool Check(PyObject *py_obj); 26622c8efcdSZachary Turner 267f8b22f8fSZachary Turner // Bring in the no-argument base class version 268f8b22f8fSZachary Turner using PythonObject::Reset; 269f8b22f8fSZachary Turner 270f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 2712c1f46dcSZachary Turner 272b9c1b51eSKate Stone llvm::StringRef GetString() const; 2732c1f46dcSZachary Turner 274b9c1b51eSKate Stone size_t GetSize() const; 2752c1f46dcSZachary Turner 2762c1f46dcSZachary Turner void SetString(llvm::StringRef string); 2772c1f46dcSZachary Turner 2782c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 2792c1f46dcSZachary Turner }; 2802c1f46dcSZachary Turner 281b9c1b51eSKate Stone class PythonInteger : public PythonObject { 2822c1f46dcSZachary Turner public: 2832c1f46dcSZachary Turner PythonInteger(); 28487f47729SZachary Turner explicit PythonInteger(int64_t value); 285f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 286f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 287edb35d95SEugene Zelenko 288f8b22f8fSZachary Turner ~PythonInteger() override; 2892c1f46dcSZachary Turner 29022c8efcdSZachary Turner static bool Check(PyObject *py_obj); 29122c8efcdSZachary Turner 292f8b22f8fSZachary Turner // Bring in the no-argument base class version 293f8b22f8fSZachary Turner using PythonObject::Reset; 294f8b22f8fSZachary Turner 295f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 2962c1f46dcSZachary Turner 2972c1f46dcSZachary Turner int64_t GetInteger() const; 2982c1f46dcSZachary Turner 299b9c1b51eSKate Stone void SetInteger(int64_t value); 3002c1f46dcSZachary Turner 3012c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 3022c1f46dcSZachary Turner }; 3032c1f46dcSZachary Turner 304b9c1b51eSKate Stone class PythonList : public PythonObject { 3052c1f46dcSZachary Turner public: 306a1405147SZachary Turner PythonList() {} 30787f47729SZachary Turner explicit PythonList(PyInitialValue value); 30887f47729SZachary Turner explicit PythonList(int list_size); 309f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 310f8b22f8fSZachary Turner PythonList(const PythonList &list); 311edb35d95SEugene Zelenko 312f8b22f8fSZachary Turner ~PythonList() override; 3132c1f46dcSZachary Turner 31422c8efcdSZachary Turner static bool Check(PyObject *py_obj); 31522c8efcdSZachary Turner 316f8b22f8fSZachary Turner // Bring in the no-argument base class version 317f8b22f8fSZachary Turner using PythonObject::Reset; 318f8b22f8fSZachary Turner 319f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3202c1f46dcSZachary Turner 3212c1f46dcSZachary Turner uint32_t GetSize() const; 3222c1f46dcSZachary Turner 3232c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 3242c1f46dcSZachary Turner 325f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 3262c1f46dcSZachary Turner 327f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 3282c1f46dcSZachary Turner 3292c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 3302c1f46dcSZachary Turner }; 3312c1f46dcSZachary Turner 332b9c1b51eSKate Stone class PythonTuple : public PythonObject { 333a1405147SZachary Turner public: 334a1405147SZachary Turner PythonTuple() {} 335a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 336a1405147SZachary Turner explicit PythonTuple(int tuple_size); 337a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 338a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 339a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 340a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject *> objects); 341a1405147SZachary Turner 342a1405147SZachary Turner ~PythonTuple() override; 343a1405147SZachary Turner 344a1405147SZachary Turner static bool Check(PyObject *py_obj); 345a1405147SZachary Turner 346a1405147SZachary Turner // Bring in the no-argument base class version 347a1405147SZachary Turner using PythonObject::Reset; 348a1405147SZachary Turner 349a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 350a1405147SZachary Turner 351a1405147SZachary Turner uint32_t GetSize() const; 352a1405147SZachary Turner 353a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 354a1405147SZachary Turner 355a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 356a1405147SZachary Turner 357a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 358a1405147SZachary Turner }; 359a1405147SZachary Turner 360b9c1b51eSKate Stone class PythonDictionary : public PythonObject { 3612c1f46dcSZachary Turner public: 362a1405147SZachary Turner PythonDictionary() {} 36387f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 364f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 365f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 366edb35d95SEugene Zelenko 367f8b22f8fSZachary Turner ~PythonDictionary() override; 3682c1f46dcSZachary Turner 36922c8efcdSZachary Turner static bool Check(PyObject *py_obj); 37022c8efcdSZachary Turner 371f8b22f8fSZachary Turner // Bring in the no-argument base class version 372f8b22f8fSZachary Turner using PythonObject::Reset; 373f8b22f8fSZachary Turner 374f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3752c1f46dcSZachary Turner 3762c1f46dcSZachary Turner uint32_t GetSize() const; 3772c1f46dcSZachary Turner 378f8b22f8fSZachary Turner PythonList GetKeys() const; 3792c1f46dcSZachary Turner 380f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 381f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 3822c1f46dcSZachary Turner 3832c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 3842c1f46dcSZachary Turner }; 38587f47729SZachary Turner 386b9c1b51eSKate Stone class PythonModule : public PythonObject { 3877841efbbSZachary Turner public: 3887841efbbSZachary Turner PythonModule(); 3897841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 3907841efbbSZachary Turner PythonModule(const PythonModule &dict); 3917841efbbSZachary Turner 3927841efbbSZachary Turner ~PythonModule() override; 3937841efbbSZachary Turner 3947841efbbSZachary Turner static bool Check(PyObject *py_obj); 3957841efbbSZachary Turner 396b9c1b51eSKate Stone static PythonModule BuiltinsModule(); 397a1405147SZachary Turner 398b9c1b51eSKate Stone static PythonModule MainModule(); 399a1405147SZachary Turner 400b9c1b51eSKate Stone static PythonModule AddModule(llvm::StringRef module); 4017841efbbSZachary Turner 402b9c1b51eSKate Stone static PythonModule ImportModule(llvm::StringRef module); 4032419f1d5SZachary Turner 4047841efbbSZachary Turner // Bring in the no-argument base class version 4057841efbbSZachary Turner using PythonObject::Reset; 4067841efbbSZachary Turner 4077841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4087841efbbSZachary Turner 4097841efbbSZachary Turner PythonDictionary GetDictionary() const; 4107841efbbSZachary Turner }; 4117841efbbSZachary Turner 412b9c1b51eSKate Stone class PythonCallable : public PythonObject { 413a1405147SZachary Turner public: 414b58fb2f4SZachary Turner struct ArgInfo { 415b58fb2f4SZachary Turner size_t count; 416a5d6765cSEnrico Granata bool is_bound_method : 1; 417b58fb2f4SZachary Turner bool has_varargs : 1; 418b58fb2f4SZachary Turner bool has_kwargs : 1; 419b58fb2f4SZachary Turner }; 420b58fb2f4SZachary Turner 421a1405147SZachary Turner PythonCallable(); 422a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 423a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 424a1405147SZachary Turner 425a1405147SZachary Turner ~PythonCallable() override; 426a1405147SZachary Turner 427b9c1b51eSKate Stone 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 432b9c1b51eSKate Stone void Reset(PyRefType type, PyObject *py_obj) override; 433a1405147SZachary Turner 434b9c1b51eSKate Stone ArgInfo GetNumArguments() const; 435b58fb2f4SZachary Turner 436b9c1b51eSKate Stone PythonObject operator()(); 437a1405147SZachary Turner 438b9c1b51eSKate Stone PythonObject operator()(std::initializer_list<PyObject *> args); 439a1405147SZachary Turner 440b9c1b51eSKate Stone PythonObject operator()(std::initializer_list<PythonObject> args); 441b58fb2f4SZachary Turner 442b58fb2f4SZachary Turner template <typename Arg, typename... Args> 443b9c1b51eSKate Stone PythonObject operator()(const Arg &arg, Args... args) { 444b58fb2f4SZachary Turner return operator()({arg, args...}); 445b58fb2f4SZachary Turner } 446a1405147SZachary Turner }; 447a1405147SZachary Turner 448b9c1b51eSKate Stone class PythonFile : public PythonObject { 4499c40264fSZachary Turner public: 45032064024SZachary Turner PythonFile(); 451eda01c31SZachary Turner PythonFile(File &file, const char *mode); 452eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 4539c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 454edb35d95SEugene Zelenko 4559c40264fSZachary Turner ~PythonFile() override; 4569c40264fSZachary Turner 4579c40264fSZachary Turner static bool Check(PyObject *py_obj); 4589c40264fSZachary Turner 4599c40264fSZachary Turner using PythonObject::Reset; 4609c40264fSZachary Turner 4619c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4629c40264fSZachary Turner void Reset(File &file, const char *mode); 463eda01c31SZachary Turner 464744959b9SEnrico Granata static uint32_t GetOptionsFromMode(llvm::StringRef mode); 465744959b9SEnrico Granata 466eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 4679c40264fSZachary Turner }; 4689c40264fSZachary Turner 4692c1f46dcSZachary Turner } // namespace lldb_private 4702c1f46dcSZachary Turner 471a281b42bSZachary Turner #endif 472a281b42bSZachary Turner 4732c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 474