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, 73a1405147SZachary Turner Callable, 74a1405147SZachary 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 208a1405147SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, PythonDictionary dict); 2097841efbbSZachary Turner 210*b58fb2f4SZachary Turner template<typename T> 211*b58fb2f4SZachary Turner static T 212*b58fb2f4SZachary Turner ResolveNameWithDictionary(llvm::StringRef name, PythonDictionary dict) 213*b58fb2f4SZachary Turner { 214*b58fb2f4SZachary Turner return ResolveNameWithDictionary(name, dict).AsType<T>(); 215*b58fb2f4SZachary Turner } 216*b58fb2f4SZachary Turner 2177841efbbSZachary Turner PythonObject 2187841efbbSZachary Turner ResolveName(llvm::StringRef name) const; 2197841efbbSZachary Turner 220*b58fb2f4SZachary Turner template<typename T> 221*b58fb2f4SZachary Turner T 222*b58fb2f4SZachary Turner ResolveName(llvm::StringRef name) const 223*b58fb2f4SZachary Turner { 224*b58fb2f4SZachary Turner return ResolveName(name).AsType<T>(); 225*b58fb2f4SZachary Turner } 226*b58fb2f4SZachary Turner 2272c1f46dcSZachary Turner bool 2289c40264fSZachary Turner HasAttribute(llvm::StringRef attribute) const; 2299c40264fSZachary Turner 2307d6d218eSZachary Turner PythonObject 2317d6d218eSZachary Turner GetAttributeValue(llvm::StringRef attribute) const; 2327d6d218eSZachary Turner 2339c40264fSZachary Turner bool 234f8b22f8fSZachary Turner IsValid() const; 235f8b22f8fSZachary Turner 236f8b22f8fSZachary Turner bool 237f8b22f8fSZachary Turner IsAllocated() const; 238f8b22f8fSZachary Turner 239f8b22f8fSZachary Turner bool 240f8b22f8fSZachary Turner IsNone() const; 2412c1f46dcSZachary Turner 2427d6d218eSZachary Turner template<typename T> 2437d6d218eSZachary Turner T AsType() const 2447d6d218eSZachary Turner { 2457d6d218eSZachary Turner if (!T::Check(m_py_obj)) 2467d6d218eSZachary Turner return T(); 2477d6d218eSZachary Turner return T(PyRefType::Borrowed, m_py_obj); 2487d6d218eSZachary Turner } 2497d6d218eSZachary Turner 2507841efbbSZachary Turner StructuredData::ObjectSP 2517841efbbSZachary Turner CreateStructuredObject() const; 2522c1f46dcSZachary Turner 2532c1f46dcSZachary Turner protected: 2542c1f46dcSZachary Turner PyObject* m_py_obj; 2552c1f46dcSZachary Turner }; 2562c1f46dcSZachary Turner 2572c1f46dcSZachary Turner class PythonString : public PythonObject 2582c1f46dcSZachary Turner { 2592c1f46dcSZachary Turner public: 2602c1f46dcSZachary Turner PythonString(); 261f8b22f8fSZachary Turner explicit PythonString(llvm::StringRef string); 262f8b22f8fSZachary Turner explicit PythonString(const char *string); 26387f47729SZachary Turner PythonString(PyRefType type, PyObject *o); 26487f47729SZachary Turner PythonString(const PythonString &object); 265edb35d95SEugene Zelenko 266f8b22f8fSZachary Turner ~PythonString() override; 2672c1f46dcSZachary Turner 26822c8efcdSZachary Turner static bool Check(PyObject *py_obj); 26922c8efcdSZachary Turner 270f8b22f8fSZachary Turner // Bring in the no-argument base class version 271f8b22f8fSZachary Turner using PythonObject::Reset; 272f8b22f8fSZachary Turner 273f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 2742c1f46dcSZachary Turner 2752c1f46dcSZachary Turner llvm::StringRef 2762c1f46dcSZachary Turner GetString() const; 2772c1f46dcSZachary Turner 2782c1f46dcSZachary Turner size_t 2792c1f46dcSZachary Turner GetSize() const; 2802c1f46dcSZachary Turner 2812c1f46dcSZachary Turner void SetString(llvm::StringRef string); 2822c1f46dcSZachary Turner 2832c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 2842c1f46dcSZachary Turner }; 2852c1f46dcSZachary Turner 2862c1f46dcSZachary Turner class PythonInteger : public PythonObject 2872c1f46dcSZachary Turner { 2882c1f46dcSZachary Turner public: 2892c1f46dcSZachary Turner PythonInteger(); 29087f47729SZachary Turner explicit PythonInteger(int64_t value); 291f8b22f8fSZachary Turner PythonInteger(PyRefType type, PyObject *o); 292f8b22f8fSZachary Turner PythonInteger(const PythonInteger &object); 293edb35d95SEugene Zelenko 294f8b22f8fSZachary Turner ~PythonInteger() override; 2952c1f46dcSZachary Turner 29622c8efcdSZachary Turner static bool Check(PyObject *py_obj); 29722c8efcdSZachary Turner 298f8b22f8fSZachary Turner // Bring in the no-argument base class version 299f8b22f8fSZachary Turner using PythonObject::Reset; 300f8b22f8fSZachary Turner 301f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3022c1f46dcSZachary Turner 3032c1f46dcSZachary Turner int64_t GetInteger() const; 3042c1f46dcSZachary Turner 3052c1f46dcSZachary Turner void 3062c1f46dcSZachary Turner SetInteger (int64_t value); 3072c1f46dcSZachary Turner 3082c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 3092c1f46dcSZachary Turner }; 3102c1f46dcSZachary Turner 3112c1f46dcSZachary Turner class PythonList : public PythonObject 3122c1f46dcSZachary Turner { 3132c1f46dcSZachary Turner public: 314a1405147SZachary Turner PythonList() {} 31587f47729SZachary Turner explicit PythonList(PyInitialValue value); 31687f47729SZachary Turner explicit PythonList(int list_size); 317f8b22f8fSZachary Turner PythonList(PyRefType type, PyObject *o); 318f8b22f8fSZachary Turner PythonList(const PythonList &list); 319edb35d95SEugene Zelenko 320f8b22f8fSZachary Turner ~PythonList() override; 3212c1f46dcSZachary Turner 32222c8efcdSZachary Turner static bool Check(PyObject *py_obj); 32322c8efcdSZachary Turner 324f8b22f8fSZachary Turner // Bring in the no-argument base class version 325f8b22f8fSZachary Turner using PythonObject::Reset; 326f8b22f8fSZachary Turner 327f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3282c1f46dcSZachary Turner 3292c1f46dcSZachary Turner uint32_t GetSize() const; 3302c1f46dcSZachary Turner 3312c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 3322c1f46dcSZachary Turner 333f8b22f8fSZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 3342c1f46dcSZachary Turner 335f8b22f8fSZachary Turner void AppendItem(const PythonObject &object); 3362c1f46dcSZachary Turner 3372c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 3382c1f46dcSZachary Turner }; 3392c1f46dcSZachary Turner 340a1405147SZachary Turner class PythonTuple : public PythonObject 341a1405147SZachary Turner { 342a1405147SZachary Turner public: 343a1405147SZachary Turner PythonTuple() {} 344a1405147SZachary Turner explicit PythonTuple(PyInitialValue value); 345a1405147SZachary Turner explicit PythonTuple(int tuple_size); 346a1405147SZachary Turner PythonTuple(PyRefType type, PyObject *o); 347a1405147SZachary Turner PythonTuple(const PythonTuple &tuple); 348a1405147SZachary Turner PythonTuple(std::initializer_list<PythonObject> objects); 349a1405147SZachary Turner PythonTuple(std::initializer_list<PyObject*> objects); 350a1405147SZachary Turner 351a1405147SZachary Turner ~PythonTuple() override; 352a1405147SZachary Turner 353a1405147SZachary Turner static bool Check(PyObject *py_obj); 354a1405147SZachary Turner 355a1405147SZachary Turner // Bring in the no-argument base class version 356a1405147SZachary Turner using PythonObject::Reset; 357a1405147SZachary Turner 358a1405147SZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 359a1405147SZachary Turner 360a1405147SZachary Turner uint32_t GetSize() const; 361a1405147SZachary Turner 362a1405147SZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 363a1405147SZachary Turner 364a1405147SZachary Turner void SetItemAtIndex(uint32_t index, const PythonObject &object); 365a1405147SZachary Turner 366a1405147SZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 367a1405147SZachary Turner }; 368a1405147SZachary Turner 3692c1f46dcSZachary Turner class PythonDictionary : public PythonObject 3702c1f46dcSZachary Turner { 3712c1f46dcSZachary Turner public: 372a1405147SZachary Turner PythonDictionary() {} 37387f47729SZachary Turner explicit PythonDictionary(PyInitialValue value); 374f8b22f8fSZachary Turner PythonDictionary(PyRefType type, PyObject *o); 375f8b22f8fSZachary Turner PythonDictionary(const PythonDictionary &dict); 376edb35d95SEugene Zelenko 377f8b22f8fSZachary Turner ~PythonDictionary() override; 3782c1f46dcSZachary Turner 37922c8efcdSZachary Turner static bool Check(PyObject *py_obj); 38022c8efcdSZachary Turner 381f8b22f8fSZachary Turner // Bring in the no-argument base class version 382f8b22f8fSZachary Turner using PythonObject::Reset; 383f8b22f8fSZachary Turner 384f8b22f8fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 3852c1f46dcSZachary Turner 3862c1f46dcSZachary Turner uint32_t GetSize() const; 3872c1f46dcSZachary Turner 388f8b22f8fSZachary Turner PythonList GetKeys() const; 3892c1f46dcSZachary Turner 390f8b22f8fSZachary Turner PythonObject GetItemForKey(const PythonObject &key) const; 391f8b22f8fSZachary Turner void SetItemForKey(const PythonObject &key, const PythonObject &value); 3922c1f46dcSZachary Turner 3932c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 3942c1f46dcSZachary Turner }; 39587f47729SZachary Turner 3967841efbbSZachary Turner class PythonModule : public PythonObject 3977841efbbSZachary Turner { 3987841efbbSZachary Turner public: 3997841efbbSZachary Turner PythonModule(); 4007841efbbSZachary Turner PythonModule(PyRefType type, PyObject *o); 4017841efbbSZachary Turner PythonModule(const PythonModule &dict); 4027841efbbSZachary Turner 4037841efbbSZachary Turner ~PythonModule() override; 4047841efbbSZachary Turner 4057841efbbSZachary Turner static bool Check(PyObject *py_obj); 4067841efbbSZachary Turner 407a1405147SZachary Turner static PythonModule 408a1405147SZachary Turner BuiltinsModule(); 409a1405147SZachary Turner 410a1405147SZachary Turner static PythonModule 411a1405147SZachary Turner MainModule(); 412a1405147SZachary Turner 413a1405147SZachary Turner static PythonModule 414a1405147SZachary Turner AddModule(llvm::StringRef module); 4157841efbbSZachary Turner 4167841efbbSZachary Turner // Bring in the no-argument base class version 4177841efbbSZachary Turner using PythonObject::Reset; 4187841efbbSZachary Turner 4197841efbbSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4207841efbbSZachary Turner 4217841efbbSZachary Turner PythonDictionary GetDictionary() const; 4227841efbbSZachary Turner }; 4237841efbbSZachary Turner 424a1405147SZachary Turner class PythonCallable : public PythonObject 425a1405147SZachary Turner { 426a1405147SZachary Turner public: 427*b58fb2f4SZachary Turner struct ArgInfo { 428*b58fb2f4SZachary Turner size_t count; 429*b58fb2f4SZachary Turner bool has_varargs : 1; 430*b58fb2f4SZachary Turner bool has_kwargs : 1; 431*b58fb2f4SZachary Turner }; 432*b58fb2f4SZachary Turner 433a1405147SZachary Turner PythonCallable(); 434a1405147SZachary Turner PythonCallable(PyRefType type, PyObject *o); 435a1405147SZachary Turner PythonCallable(const PythonCallable &dict); 436a1405147SZachary Turner 437a1405147SZachary Turner ~PythonCallable() override; 438a1405147SZachary Turner 439a1405147SZachary Turner static bool 440a1405147SZachary Turner Check(PyObject *py_obj); 441a1405147SZachary Turner 442a1405147SZachary Turner // Bring in the no-argument base class version 443a1405147SZachary Turner using PythonObject::Reset; 444a1405147SZachary Turner 445a1405147SZachary Turner void 446a1405147SZachary Turner Reset(PyRefType type, PyObject *py_obj) override; 447a1405147SZachary Turner 448*b58fb2f4SZachary Turner ArgInfo 449*b58fb2f4SZachary Turner GetNumArguments() const; 450*b58fb2f4SZachary Turner 451*b58fb2f4SZachary Turner PythonObject 452*b58fb2f4SZachary Turner operator ()(); 453a1405147SZachary Turner 454a1405147SZachary Turner PythonObject 455a1405147SZachary Turner operator ()(std::initializer_list<PyObject*> args); 456a1405147SZachary Turner 457a1405147SZachary Turner PythonObject 458a1405147SZachary Turner operator ()(std::initializer_list<PythonObject> args); 459*b58fb2f4SZachary Turner 460*b58fb2f4SZachary Turner template<typename Arg, typename... Args> 461*b58fb2f4SZachary Turner PythonObject 462*b58fb2f4SZachary Turner operator ()(const Arg &arg, Args... args) 463*b58fb2f4SZachary Turner { 464*b58fb2f4SZachary Turner return operator()({ arg, args... }); 465*b58fb2f4SZachary Turner } 466a1405147SZachary Turner }; 467a1405147SZachary Turner 468a1405147SZachary Turner 4699c40264fSZachary Turner class PythonFile : public PythonObject 4709c40264fSZachary Turner { 4719c40264fSZachary Turner public: 47232064024SZachary Turner PythonFile(); 473eda01c31SZachary Turner PythonFile(File &file, const char *mode); 474eda01c31SZachary Turner PythonFile(const char *path, const char *mode); 4759c40264fSZachary Turner PythonFile(PyRefType type, PyObject *o); 476edb35d95SEugene Zelenko 4779c40264fSZachary Turner ~PythonFile() override; 4789c40264fSZachary Turner 4799c40264fSZachary Turner static bool Check(PyObject *py_obj); 4809c40264fSZachary Turner 4819c40264fSZachary Turner using PythonObject::Reset; 4829c40264fSZachary Turner 4839c40264fSZachary Turner void Reset(PyRefType type, PyObject *py_obj) override; 4849c40264fSZachary Turner void Reset(File &file, const char *mode); 485eda01c31SZachary Turner 486eda01c31SZachary Turner bool GetUnderlyingFile(File &file) const; 4879c40264fSZachary Turner }; 4889c40264fSZachary Turner 4892c1f46dcSZachary Turner } // namespace lldb_private 4902c1f46dcSZachary Turner 4912c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 492