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