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 132c1f46dcSZachary Turner // C Includes 142c1f46dcSZachary Turner // C++ Includes 152c1f46dcSZachary Turner // Other libraries and framework includes 162c1f46dcSZachary Turner // Project includes 172c1f46dcSZachary Turner #include "lldb/lldb-defines.h" 182c1f46dcSZachary Turner #include "lldb/Core/ConstString.h" 192c1f46dcSZachary Turner #include "lldb/Core/StructuredData.h" 202c1f46dcSZachary Turner #include "lldb/Core/Flags.h" 219c40264fSZachary Turner #include "lldb/Host/File.h" 222c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h" 232c1f46dcSZachary Turner 242c1f46dcSZachary Turner namespace lldb_private { 25edb35d95SEugene Zelenko 262c1f46dcSZachary Turner class PythonString; 272c1f46dcSZachary Turner class PythonList; 282c1f46dcSZachary Turner class PythonDictionary; 292c1f46dcSZachary Turner class PythonInteger; 302c1f46dcSZachary Turner 312c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic 322c1f46dcSZachary Turner { 332c1f46dcSZachary Turner public: 342c1f46dcSZachary Turner StructuredPythonObject() 352c1f46dcSZachary Turner : StructuredData::Generic() 362c1f46dcSZachary Turner { 372c1f46dcSZachary Turner } 382c1f46dcSZachary Turner 392c1f46dcSZachary Turner StructuredPythonObject(void *obj) 402c1f46dcSZachary Turner : StructuredData::Generic(obj) 412c1f46dcSZachary Turner { 422c1f46dcSZachary Turner Py_XINCREF(GetValue()); 432c1f46dcSZachary Turner } 442c1f46dcSZachary Turner 45edb35d95SEugene Zelenko ~StructuredPythonObject() override 462c1f46dcSZachary Turner { 472c1f46dcSZachary Turner if (Py_IsInitialized()) 482c1f46dcSZachary Turner Py_XDECREF(GetValue()); 492c1f46dcSZachary Turner SetValue(nullptr); 502c1f46dcSZachary Turner } 512c1f46dcSZachary Turner 522c1f46dcSZachary Turner bool 532c1f46dcSZachary Turner IsValid() const override 542c1f46dcSZachary Turner { 552c1f46dcSZachary Turner return GetValue() && GetValue() != Py_None; 562c1f46dcSZachary Turner } 572c1f46dcSZachary Turner 582c1f46dcSZachary Turner void Dump(Stream &s) const override; 592c1f46dcSZachary Turner 602c1f46dcSZachary Turner private: 612c1f46dcSZachary Turner DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject); 622c1f46dcSZachary Turner }; 632c1f46dcSZachary Turner 642c1f46dcSZachary Turner enum class PyObjectType 652c1f46dcSZachary Turner { 662c1f46dcSZachary Turner Unknown, 672c1f46dcSZachary Turner None, 682c1f46dcSZachary Turner Integer, 692c1f46dcSZachary Turner Dictionary, 702c1f46dcSZachary Turner List, 719c40264fSZachary Turner String, 727841efbbSZachary Turner Module, 73*a1405147SZachary Turner Callable, 74*a1405147SZachary Turner Tuple, 759c40264fSZachary Turner File 762c1f46dcSZachary Turner }; 772c1f46dcSZachary Turner 78f8b22f8fSZachary Turner enum class PyRefType 79f8b22f8fSZachary Turner { 80f8b22f8fSZachary Turner Borrowed, // We are not given ownership of the incoming PyObject. 81f8b22f8fSZachary Turner // We cannot safely hold it without calling Py_INCREF. 82f8b22f8fSZachary Turner Owned // We have ownership of the incoming PyObject. We should 83f8b22f8fSZachary Turner // not call Py_INCREF. 84f8b22f8fSZachary Turner }; 85f8b22f8fSZachary Turner 86f8b22f8fSZachary Turner enum class PyInitialValue 87f8b22f8fSZachary Turner { 88f8b22f8fSZachary Turner Invalid, 89f8b22f8fSZachary Turner Empty 90f8b22f8fSZachary Turner }; 91f8b22f8fSZachary Turner 922c1f46dcSZachary Turner class PythonObject 932c1f46dcSZachary Turner { 942c1f46dcSZachary Turner public: 95f8b22f8fSZachary Turner PythonObject() 96f8b22f8fSZachary Turner : m_py_obj(nullptr) 972c1f46dcSZachary Turner { 982c1f46dcSZachary Turner } 992c1f46dcSZachary Turner 100f8b22f8fSZachary Turner PythonObject(PyRefType type, PyObject *py_obj) 101f8b22f8fSZachary Turner : m_py_obj(nullptr) 1022c1f46dcSZachary Turner { 103f8b22f8fSZachary Turner Reset(type, py_obj); 1042c1f46dcSZachary Turner } 1052c1f46dcSZachary Turner 106f8b22f8fSZachary Turner PythonObject(const PythonObject &rhs) 107f8b22f8fSZachary Turner : m_py_obj(nullptr) 1082c1f46dcSZachary Turner { 109f8b22f8fSZachary Turner Reset(rhs); 1102c1f46dcSZachary Turner } 1112c1f46dcSZachary Turner 112edb35d95SEugene Zelenko virtual ~PythonObject() 113edb35d95SEugene Zelenko { 114edb35d95SEugene Zelenko Reset(); 115edb35d95SEugene Zelenko } 1162c1f46dcSZachary Turner 117f8b22f8fSZachary Turner void 118f8b22f8fSZachary Turner Reset() 1192c1f46dcSZachary Turner { 120f8b22f8fSZachary Turner // Avoid calling the virtual method since it's not necessary 121f8b22f8fSZachary Turner // to actually validate the type of the PyObject if we're 122f8b22f8fSZachary Turner // just setting to null. 1232c1f46dcSZachary Turner if (Py_IsInitialized()) 1242c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 125f8b22f8fSZachary Turner m_py_obj = nullptr; 1262c1f46dcSZachary Turner } 127f8b22f8fSZachary Turner 128f8b22f8fSZachary Turner void 129f8b22f8fSZachary Turner Reset(const PythonObject &rhs) 130f8b22f8fSZachary Turner { 131f8b22f8fSZachary Turner // Avoid calling the virtual method if it's not necessary 132f8b22f8fSZachary Turner // to actually validate the type of the PyObject. 13360c24f70SZachary Turner if (!rhs.IsValid()) 134f8b22f8fSZachary Turner Reset(); 135f8b22f8fSZachary Turner else 136f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, rhs.m_py_obj); 137f8b22f8fSZachary Turner } 138f8b22f8fSZachary Turner 139f8b22f8fSZachary Turner // PythonObject is implicitly convertible to PyObject *, which will call the 140f8b22f8fSZachary Turner // wrong overload. We want to explicitly disallow this, since a PyObject 141f8b22f8fSZachary Turner // *always* owns its reference. Therefore the overload which takes a 142f8b22f8fSZachary Turner // PyRefType doesn't make sense, and the copy constructor should be used. 143f8b22f8fSZachary Turner void 144f8b22f8fSZachary Turner Reset(PyRefType type, const PythonObject &ref) = delete; 145f8b22f8fSZachary Turner 146f8b22f8fSZachary Turner virtual void 147f8b22f8fSZachary Turner Reset(PyRefType type, PyObject *py_obj) 148f8b22f8fSZachary Turner { 149f8b22f8fSZachary Turner if (py_obj == m_py_obj) 150f8b22f8fSZachary Turner return; 151f8b22f8fSZachary Turner 152f8b22f8fSZachary Turner if (Py_IsInitialized()) 153f8b22f8fSZachary Turner Py_XDECREF(m_py_obj); 154f8b22f8fSZachary Turner 155f8b22f8fSZachary Turner m_py_obj = py_obj; 156f8b22f8fSZachary Turner 157f8b22f8fSZachary Turner // If this is a borrowed reference, we need to convert it to 158f8b22f8fSZachary Turner // an owned reference by incrementing it. If it is an owned 159f8b22f8fSZachary Turner // reference (for example the caller allocated it with PyDict_New() 160f8b22f8fSZachary Turner // then we must *not* increment it. 161f8b22f8fSZachary Turner if (Py_IsInitialized() && type == PyRefType::Borrowed) 162f8b22f8fSZachary Turner Py_XINCREF(m_py_obj); 1632c1f46dcSZachary Turner } 1642c1f46dcSZachary Turner 1652c1f46dcSZachary Turner void 1662c1f46dcSZachary Turner Dump () const 1672c1f46dcSZachary Turner { 1682c1f46dcSZachary Turner if (m_py_obj) 1692c1f46dcSZachary Turner _PyObject_Dump (m_py_obj); 1702c1f46dcSZachary Turner else 1712c1f46dcSZachary Turner puts ("NULL"); 1722c1f46dcSZachary Turner } 1732c1f46dcSZachary Turner 1742c1f46dcSZachary Turner void 1752c1f46dcSZachary Turner Dump (Stream &strm) const; 1762c1f46dcSZachary Turner 1772c1f46dcSZachary Turner PyObject* 1782c1f46dcSZachary Turner get() const 1792c1f46dcSZachary Turner { 1802c1f46dcSZachary Turner return m_py_obj; 1812c1f46dcSZachary Turner } 1822c1f46dcSZachary Turner 18360c24f70SZachary Turner PyObject* 18460c24f70SZachary Turner release() 18560c24f70SZachary Turner { 18660c24f70SZachary Turner PyObject *result = m_py_obj; 18760c24f70SZachary Turner m_py_obj = nullptr; 18860c24f70SZachary Turner return result; 18960c24f70SZachary Turner } 19060c24f70SZachary Turner 191f8b22f8fSZachary Turner PythonObject & 192f8b22f8fSZachary Turner operator=(const PythonObject &other) 1932c1f46dcSZachary Turner { 194f8b22f8fSZachary Turner Reset(PyRefType::Borrowed, other.get()); 195f8b22f8fSZachary Turner return *this; 1962c1f46dcSZachary Turner } 1972c1f46dcSZachary Turner 1987841efbbSZachary Turner PyObjectType 1997841efbbSZachary Turner GetObjectType() const; 2007841efbbSZachary Turner 2017841efbbSZachary Turner PythonString 2027841efbbSZachary Turner Repr() const; 2037841efbbSZachary Turner 2047841efbbSZachary Turner PythonString 2057841efbbSZachary Turner Str() const; 2067841efbbSZachary Turner 2077841efbbSZachary Turner static PythonObject 208*a1405147SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, PythonDictionary dict); 2097841efbbSZachary Turner 2107841efbbSZachary Turner PythonObject 2117841efbbSZachary Turner ResolveName(llvm::StringRef name) const; 2127841efbbSZachary Turner 2132c1f46dcSZachary Turner bool 2149c40264fSZachary Turner HasAttribute(llvm::StringRef attribute) const; 2159c40264fSZachary Turner 2167d6d218eSZachary Turner PythonObject 2177d6d218eSZachary Turner GetAttributeValue(llvm::StringRef attribute) const; 2187d6d218eSZachary Turner 2199c40264fSZachary Turner bool 220f8b22f8fSZachary Turner IsValid() const; 221f8b22f8fSZachary Turner 222f8b22f8fSZachary Turner bool 223f8b22f8fSZachary Turner IsAllocated() const; 224f8b22f8fSZachary Turner 225f8b22f8fSZachary Turner bool 226f8b22f8fSZachary Turner IsNone() const; 2272c1f46dcSZachary Turner 2287d6d218eSZachary Turner template<typename T> 2297d6d218eSZachary Turner T AsType() const 2307d6d218eSZachary Turner { 2317d6d218eSZachary Turner if (!T::Check(m_py_obj)) 2327d6d218eSZachary Turner return T(); 2337d6d218eSZachary Turner return T(PyRefType::Borrowed, m_py_obj); 2347d6d218eSZachary Turner } 2357d6d218eSZachary Turner 2367841efbbSZachary Turner StructuredData::ObjectSP 2377841efbbSZachary Turner CreateStructuredObject() const; 2382c1f46dcSZachary Turner 2392c1f46dcSZachary Turner protected: 2402c1f46dcSZachary Turner PyObject* m_py_obj; 2412c1f46dcSZachary Turner }; 2422c1f46dcSZachary Turner 2432c1f46dcSZachary Turner class PythonString : public PythonObject 2442c1f46dcSZachary Turner { 2452c1f46dcSZachary Turner public: 2462c1f46dcSZachary Turner PythonString(); 247f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 248f8b22f8fSZachary Turner explicit PythonString(const char *string); 24987f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 25087f47729SZachary Turner PythonString(const PythonString &object); 251edb35d95SEugene Zelenko 252f8b22f8fSZachary Turner ~PythonString() override; 2532c1f46dcSZachary Turner 25422c8efcdSZachary Turner static bool Check(PyObject *py_obj); 25522c8efcdSZachary Turner 256f8b22f8fSZachary Turner // Bring in the no-argument base class version 257f8b22f8fSZachary Turner using PythonObject::Reset; 258f8b22f8fSZachary Turner 259f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 2602c1f46dcSZachary Turner 2612c1f46dcSZachary Turner llvm::StringRef 2622c1f46dcSZachary Turner GetString() const; 2632c1f46dcSZachary Turner 2642c1f46dcSZachary Turner size_t 2652c1f46dcSZachary Turner GetSize() const; 2662c1f46dcSZachary Turner 2672c1f46dcSZachary Turner void SetString(llvm::StringRef string); 2682c1f46dcSZachary Turner 2692c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 2702c1f46dcSZachary Turner }; 2712c1f46dcSZachary Turner 2722c1f46dcSZachary Turner class PythonInteger : public PythonObject 2732c1f46dcSZachary Turner { 2742c1f46dcSZachary Turner public: 2752c1f46dcSZachary Turner PythonInteger(); 27687f47729SZachary Turner explicit PythonInteger(int64_t value); 277f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 278f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 279edb35d95SEugene Zelenko 280f8b22f8fSZachary Turner ~PythonInteger() override; 2812c1f46dcSZachary Turner 28222c8efcdSZachary Turner static bool Check(PyObject *py_obj); 28322c8efcdSZachary Turner 284f8b22f8fSZachary Turner // Bring in the no-argument base class version 285f8b22f8fSZachary Turner using PythonObject::Reset; 286f8b22f8fSZachary Turner 287f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 2882c1f46dcSZachary Turner 2892c1f46dcSZachary Turner int64_t GetInteger() const; 2902c1f46dcSZachary Turner 2912c1f46dcSZachary Turner void 2922c1f46dcSZachary Turner SetInteger (int64_t value); 2932c1f46dcSZachary Turner 2942c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 2952c1f46dcSZachary Turner }; 2962c1f46dcSZachary Turner 2972c1f46dcSZachary Turner class PythonList : public PythonObject 2982c1f46dcSZachary Turner { 2992c1f46dcSZachary Turner public: 300*a1405147SZachary Turner PythonList() {} 30187f47729SZachary Turner explicit PythonList(PyInitialValue value); 30287f47729SZachary Turner explicit PythonList(int list_size); 303f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 304f8b22f8fSZachary Turner PythonList(const PythonList &list); 305edb35d95SEugene Zelenko 306f8b22f8fSZachary Turner ~PythonList() override; 3072c1f46dcSZachary Turner 30822c8efcdSZachary Turner static bool Check(PyObject *py_obj); 30922c8efcdSZachary Turner 310f8b22f8fSZachary Turner // Bring in the no-argument base class version 311f8b22f8fSZachary Turner using PythonObject::Reset; 312f8b22f8fSZachary Turner 313f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3142c1f46dcSZachary Turner 3152c1f46dcSZachary Turner uint32_t GetSize() const; 3162c1f46dcSZachary Turner 3172c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 3182c1f46dcSZachary Turner 319f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 3202c1f46dcSZachary Turner 321f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 3222c1f46dcSZachary Turner 3232c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 3242c1f46dcSZachary Turner }; 3252c1f46dcSZachary Turner 326*a1405147SZachary Turner class PythonTuple : public PythonObject 327*a1405147SZachary Turner { 328*a1405147SZachary Turner public: 329*a1405147SZachary Turner PythonTuple() {} 330*a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 331*a1405147SZachary Turner explicit PythonTuple(int tuple_size); 332*a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 333*a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 334*a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 335*a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject*> objects); 336*a1405147SZachary Turner 337*a1405147SZachary Turner ~PythonTuple() override; 338*a1405147SZachary Turner 339*a1405147SZachary Turner static bool Check(PyObject *py_obj); 340*a1405147SZachary Turner 341*a1405147SZachary Turner // Bring in the no-argument base class version 342*a1405147SZachary Turner using PythonObject::Reset; 343*a1405147SZachary Turner 344*a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 345*a1405147SZachary Turner 346*a1405147SZachary Turner uint32_t GetSize() const; 347*a1405147SZachary Turner 348*a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 349*a1405147SZachary Turner 350*a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 351*a1405147SZachary Turner 352*a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 353*a1405147SZachary Turner }; 354*a1405147SZachary Turner 3552c1f46dcSZachary Turner class PythonDictionary : public PythonObject 3562c1f46dcSZachary Turner { 3572c1f46dcSZachary Turner public: 358*a1405147SZachary Turner PythonDictionary() {} 35987f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 360f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 361f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 362edb35d95SEugene Zelenko 363f8b22f8fSZachary Turner ~PythonDictionary() 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 374f8b22f8fSZachary Turner PythonList GetKeys() const; 3752c1f46dcSZachary Turner 376f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 377f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 3782c1f46dcSZachary Turner 3792c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 3802c1f46dcSZachary Turner }; 38187f47729SZachary Turner 3827841efbbSZachary Turner class PythonModule : public PythonObject 3837841efbbSZachary Turner { 3847841efbbSZachary Turner public: 3857841efbbSZachary Turner PythonModule(); 3867841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 3877841efbbSZachary Turner PythonModule(const PythonModule &dict); 3887841efbbSZachary Turner 3897841efbbSZachary Turner ~PythonModule() override; 3907841efbbSZachary Turner 3917841efbbSZachary Turner static bool Check(PyObject *py_obj); 3927841efbbSZachary Turner 393*a1405147SZachary Turner static PythonModule 394*a1405147SZachary Turner BuiltinsModule(); 395*a1405147SZachary Turner 396*a1405147SZachary Turner static PythonModule 397*a1405147SZachary Turner MainModule(); 398*a1405147SZachary Turner 399*a1405147SZachary Turner static PythonModule 400*a1405147SZachary Turner AddModule(llvm::StringRef module); 4017841efbbSZachary Turner 4027841efbbSZachary Turner // Bring in the no-argument base class version 4037841efbbSZachary Turner using PythonObject::Reset; 4047841efbbSZachary Turner 4057841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4067841efbbSZachary Turner 4077841efbbSZachary Turner PythonDictionary GetDictionary() const; 4087841efbbSZachary Turner }; 4097841efbbSZachary Turner 410*a1405147SZachary Turner class PythonCallable : public PythonObject 411*a1405147SZachary Turner { 412*a1405147SZachary Turner public: 413*a1405147SZachary Turner PythonCallable(); 414*a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 415*a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 416*a1405147SZachary Turner 417*a1405147SZachary Turner ~PythonCallable() override; 418*a1405147SZachary Turner 419*a1405147SZachary Turner static bool 420*a1405147SZachary Turner Check(PyObject *py_obj); 421*a1405147SZachary Turner 422*a1405147SZachary Turner // Bring in the no-argument base class version 423*a1405147SZachary Turner using PythonObject::Reset; 424*a1405147SZachary Turner 425*a1405147SZachary Turner void 426*a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 427*a1405147SZachary Turner 428*a1405147SZachary Turner void 429*a1405147SZachary Turner GetNumArguments(size_t &num_args, bool &has_varargs, bool &has_kwargs) const; 430*a1405147SZachary Turner 431*a1405147SZachary Turner PythonObject 432*a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 433*a1405147SZachary Turner 434*a1405147SZachary Turner PythonObject 435*a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 436*a1405147SZachary Turner }; 437*a1405147SZachary Turner 438*a1405147SZachary Turner 4399c40264fSZachary Turner class PythonFile : public PythonObject 4409c40264fSZachary Turner { 4419c40264fSZachary Turner public: 44232064024SZachary Turner PythonFile(); 443eda01c31SZachary Turner PythonFile(File &file, const char *mode); 444eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 4459c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 446edb35d95SEugene Zelenko 4479c40264fSZachary Turner ~PythonFile() override; 4489c40264fSZachary Turner 4499c40264fSZachary Turner static bool Check(PyObject *py_obj); 4509c40264fSZachary Turner 4519c40264fSZachary Turner using PythonObject::Reset; 4529c40264fSZachary Turner 4539c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4549c40264fSZachary Turner void Reset(File &file, const char *mode); 455eda01c31SZachary Turner 456eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 4579c40264fSZachary Turner }; 4589c40264fSZachary Turner 4592c1f46dcSZachary Turner } // namespace lldb_private 4602c1f46dcSZachary Turner 4612c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 462