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 
15*41de9a97SKate Stone // LLDB Python header must be included first
16*41de9a97SKate Stone #include "lldb-python.h"
17*41de9a97SKate 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/ConstString.h"
232c1f46dcSZachary Turner #include "lldb/Core/Flags.h"
249ba9dfddSPavel Labath #include "lldb/Core/StructuredData.h"
259c40264fSZachary Turner #include "lldb/Host/File.h"
262c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.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 
392c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic
402c1f46dcSZachary Turner {
412c1f46dcSZachary Turner public:
422c1f46dcSZachary Turner     StructuredPythonObject()
432c1f46dcSZachary Turner         : StructuredData::Generic()
442c1f46dcSZachary Turner     {
452c1f46dcSZachary Turner     }
462c1f46dcSZachary Turner 
472c1f46dcSZachary Turner     StructuredPythonObject(void *obj)
482c1f46dcSZachary Turner         : StructuredData::Generic(obj)
492c1f46dcSZachary Turner     {
502c1f46dcSZachary Turner         Py_XINCREF(GetValue());
512c1f46dcSZachary Turner     }
522c1f46dcSZachary Turner 
53edb35d95SEugene Zelenko     ~StructuredPythonObject() override
542c1f46dcSZachary Turner     {
552c1f46dcSZachary Turner         if (Py_IsInitialized())
562c1f46dcSZachary Turner             Py_XDECREF(GetValue());
572c1f46dcSZachary Turner         SetValue(nullptr);
582c1f46dcSZachary Turner     }
592c1f46dcSZachary Turner 
602c1f46dcSZachary Turner     bool
612c1f46dcSZachary Turner     IsValid() const override
622c1f46dcSZachary Turner     {
632c1f46dcSZachary Turner         return GetValue() && GetValue() != Py_None;
642c1f46dcSZachary Turner     }
652c1f46dcSZachary Turner 
66d9c9da53SJason Molenda     void Dump(Stream &s, bool pretty_print = true) const override;
672c1f46dcSZachary Turner 
682c1f46dcSZachary Turner private:
692c1f46dcSZachary Turner     DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
702c1f46dcSZachary Turner };
712c1f46dcSZachary Turner 
722c1f46dcSZachary Turner enum class PyObjectType
732c1f46dcSZachary Turner {
742c1f46dcSZachary Turner     Unknown,
752c1f46dcSZachary Turner     None,
762c1f46dcSZachary Turner     Integer,
772c1f46dcSZachary Turner     Dictionary,
782c1f46dcSZachary Turner     List,
799c40264fSZachary Turner     String,
805a72c02bSZachary Turner     Bytes,
81f9d6d204SZachary Turner     ByteArray,
827841efbbSZachary Turner     Module,
83a1405147SZachary Turner     Callable,
84a1405147SZachary Turner     Tuple,
859c40264fSZachary Turner     File
862c1f46dcSZachary Turner };
872c1f46dcSZachary Turner 
88f8b22f8fSZachary Turner enum class PyRefType
89f8b22f8fSZachary Turner {
90f8b22f8fSZachary Turner     Borrowed, // We are not given ownership of the incoming PyObject.
91f8b22f8fSZachary Turner               // We cannot safely hold it without calling Py_INCREF.
92f8b22f8fSZachary Turner     Owned     // We have ownership of the incoming PyObject.  We should
93f8b22f8fSZachary Turner               // not call Py_INCREF.
94f8b22f8fSZachary Turner };
95f8b22f8fSZachary Turner 
96f8b22f8fSZachary Turner enum class PyInitialValue
97f8b22f8fSZachary Turner {
98f8b22f8fSZachary Turner     Invalid,
99f8b22f8fSZachary Turner     Empty
100f8b22f8fSZachary Turner };
101f8b22f8fSZachary Turner 
1022c1f46dcSZachary Turner class PythonObject
1032c1f46dcSZachary Turner {
1042c1f46dcSZachary Turner public:
105f8b22f8fSZachary Turner     PythonObject()
106f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1072c1f46dcSZachary Turner     {
1082c1f46dcSZachary Turner     }
1092c1f46dcSZachary Turner 
110f8b22f8fSZachary Turner     PythonObject(PyRefType type, PyObject *py_obj)
111f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1122c1f46dcSZachary Turner     {
113f8b22f8fSZachary Turner         Reset(type, py_obj);
1142c1f46dcSZachary Turner     }
1152c1f46dcSZachary Turner 
116f8b22f8fSZachary Turner     PythonObject(const PythonObject &rhs)
117f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1182c1f46dcSZachary Turner     {
119f8b22f8fSZachary Turner         Reset(rhs);
1202c1f46dcSZachary Turner     }
1212c1f46dcSZachary Turner 
122edb35d95SEugene Zelenko     virtual ~PythonObject()
123edb35d95SEugene Zelenko     {
124edb35d95SEugene Zelenko         Reset();
125edb35d95SEugene Zelenko     }
1262c1f46dcSZachary Turner 
127f8b22f8fSZachary Turner     void
128f8b22f8fSZachary Turner     Reset()
1292c1f46dcSZachary Turner     {
130f8b22f8fSZachary Turner         // Avoid calling the virtual method since it's not necessary
131f8b22f8fSZachary Turner         // to actually validate the type of the PyObject if we're
132f8b22f8fSZachary Turner         // just setting to null.
1332c1f46dcSZachary Turner         if (Py_IsInitialized())
1342c1f46dcSZachary Turner             Py_XDECREF(m_py_obj);
135f8b22f8fSZachary Turner         m_py_obj = nullptr;
1362c1f46dcSZachary Turner     }
137f8b22f8fSZachary Turner 
138f8b22f8fSZachary Turner     void
139f8b22f8fSZachary Turner     Reset(const PythonObject &rhs)
140f8b22f8fSZachary Turner     {
141f8b22f8fSZachary Turner         // Avoid calling the virtual method if it's not necessary
142f8b22f8fSZachary Turner         // to actually validate the type of the PyObject.
14360c24f70SZachary Turner         if (!rhs.IsValid())
144f8b22f8fSZachary Turner             Reset();
145f8b22f8fSZachary Turner         else
146f8b22f8fSZachary Turner             Reset(PyRefType::Borrowed, rhs.m_py_obj);
147f8b22f8fSZachary Turner     }
148f8b22f8fSZachary Turner 
149f8b22f8fSZachary Turner     // PythonObject is implicitly convertible to PyObject *, which will call the
150f8b22f8fSZachary Turner     // wrong overload.  We want to explicitly disallow this, since a PyObject
151f8b22f8fSZachary Turner     // *always* owns its reference.  Therefore the overload which takes a
152f8b22f8fSZachary Turner     // PyRefType doesn't make sense, and the copy constructor should be used.
153f8b22f8fSZachary Turner     void
154f8b22f8fSZachary Turner     Reset(PyRefType type, const PythonObject &ref) = delete;
155f8b22f8fSZachary Turner 
156f8b22f8fSZachary Turner     virtual void
157f8b22f8fSZachary Turner     Reset(PyRefType type, PyObject *py_obj)
158f8b22f8fSZachary Turner     {
159f8b22f8fSZachary Turner         if (py_obj == m_py_obj)
160f8b22f8fSZachary Turner             return;
161f8b22f8fSZachary Turner 
162f8b22f8fSZachary Turner         if (Py_IsInitialized())
163f8b22f8fSZachary Turner             Py_XDECREF(m_py_obj);
164f8b22f8fSZachary Turner 
165f8b22f8fSZachary Turner         m_py_obj = py_obj;
166f8b22f8fSZachary Turner 
167f8b22f8fSZachary Turner         // If this is a borrowed reference, we need to convert it to
168f8b22f8fSZachary Turner         // an owned reference by incrementing it.  If it is an owned
169f8b22f8fSZachary Turner         // reference (for example the caller allocated it with PyDict_New()
170f8b22f8fSZachary Turner         // then we must *not* increment it.
171f8b22f8fSZachary Turner         if (Py_IsInitialized() && type == PyRefType::Borrowed)
172f8b22f8fSZachary Turner             Py_XINCREF(m_py_obj);
1732c1f46dcSZachary Turner     }
1742c1f46dcSZachary Turner 
1752c1f46dcSZachary Turner     void
1762c1f46dcSZachary Turner     Dump () const
1772c1f46dcSZachary Turner     {
1782c1f46dcSZachary Turner         if (m_py_obj)
1792c1f46dcSZachary Turner             _PyObject_Dump (m_py_obj);
1802c1f46dcSZachary Turner         else
1812c1f46dcSZachary Turner             puts ("NULL");
1822c1f46dcSZachary Turner     }
1832c1f46dcSZachary Turner 
1842c1f46dcSZachary Turner     void
1852c1f46dcSZachary Turner     Dump (Stream &strm) const;
1862c1f46dcSZachary Turner 
1872c1f46dcSZachary Turner     PyObject*
1882c1f46dcSZachary Turner     get() const
1892c1f46dcSZachary Turner     {
1902c1f46dcSZachary Turner         return m_py_obj;
1912c1f46dcSZachary Turner     }
1922c1f46dcSZachary Turner 
19360c24f70SZachary Turner     PyObject*
19460c24f70SZachary Turner     release()
19560c24f70SZachary Turner     {
19660c24f70SZachary Turner         PyObject *result = m_py_obj;
19760c24f70SZachary Turner         m_py_obj = nullptr;
19860c24f70SZachary Turner         return result;
19960c24f70SZachary Turner     }
20060c24f70SZachary Turner 
201f8b22f8fSZachary Turner     PythonObject &
202f8b22f8fSZachary Turner     operator=(const PythonObject &other)
2032c1f46dcSZachary Turner     {
204f8b22f8fSZachary Turner         Reset(PyRefType::Borrowed, other.get());
205f8b22f8fSZachary Turner         return *this;
2062c1f46dcSZachary Turner     }
2072c1f46dcSZachary Turner 
2087841efbbSZachary Turner     PyObjectType
2097841efbbSZachary Turner     GetObjectType() const;
2107841efbbSZachary Turner 
2117841efbbSZachary Turner     PythonString
2127841efbbSZachary Turner     Repr() const;
2137841efbbSZachary Turner 
2147841efbbSZachary Turner     PythonString
2157841efbbSZachary Turner     Str() const;
2167841efbbSZachary Turner 
2177841efbbSZachary Turner     static PythonObject
21802bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict);
2197841efbbSZachary Turner 
220b58fb2f4SZachary Turner     template<typename T>
221b58fb2f4SZachary Turner     static T
22202bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict)
223b58fb2f4SZachary Turner     {
224b58fb2f4SZachary Turner         return ResolveNameWithDictionary(name, dict).AsType<T>();
225b58fb2f4SZachary Turner     }
226b58fb2f4SZachary Turner 
2277841efbbSZachary Turner     PythonObject
2287841efbbSZachary Turner     ResolveName(llvm::StringRef name) const;
2297841efbbSZachary Turner 
230b58fb2f4SZachary Turner     template<typename T>
231b58fb2f4SZachary Turner     T
232b58fb2f4SZachary Turner     ResolveName(llvm::StringRef name) const
233b58fb2f4SZachary Turner     {
234b58fb2f4SZachary Turner         return ResolveName(name).AsType<T>();
235b58fb2f4SZachary Turner     }
236b58fb2f4SZachary Turner 
2372c1f46dcSZachary Turner     bool
2389c40264fSZachary Turner     HasAttribute(llvm::StringRef attribute) const;
2399c40264fSZachary Turner 
2407d6d218eSZachary Turner     PythonObject
2417d6d218eSZachary Turner     GetAttributeValue(llvm::StringRef attribute) const;
2427d6d218eSZachary Turner 
2439c40264fSZachary Turner     bool
244f8b22f8fSZachary Turner     IsValid() const;
245f8b22f8fSZachary Turner 
246f8b22f8fSZachary Turner     bool
247f8b22f8fSZachary Turner     IsAllocated() const;
248f8b22f8fSZachary Turner 
249f8b22f8fSZachary Turner     bool
250f8b22f8fSZachary Turner     IsNone() const;
2512c1f46dcSZachary Turner 
2527d6d218eSZachary Turner     template<typename T>
2537d6d218eSZachary Turner     T AsType() const
2547d6d218eSZachary Turner     {
2557d6d218eSZachary Turner         if (!T::Check(m_py_obj))
2567d6d218eSZachary Turner             return T();
2577d6d218eSZachary Turner         return T(PyRefType::Borrowed, m_py_obj);
2587d6d218eSZachary Turner     }
2597d6d218eSZachary Turner 
2607841efbbSZachary Turner     StructuredData::ObjectSP
2617841efbbSZachary Turner     CreateStructuredObject() const;
2622c1f46dcSZachary Turner 
2632c1f46dcSZachary Turner protected:
2642c1f46dcSZachary Turner     PyObject* m_py_obj;
2652c1f46dcSZachary Turner };
2662c1f46dcSZachary Turner 
2675a72c02bSZachary Turner class PythonBytes : public PythonObject
2685a72c02bSZachary Turner {
2695a72c02bSZachary Turner public:
2705a72c02bSZachary Turner     PythonBytes();
2715a72c02bSZachary Turner     explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
2725a72c02bSZachary Turner     PythonBytes(const uint8_t *bytes, size_t length);
2735a72c02bSZachary Turner     PythonBytes(PyRefType type, PyObject *o);
2745a72c02bSZachary Turner     PythonBytes(const PythonBytes &object);
2755a72c02bSZachary Turner 
2765a72c02bSZachary Turner     ~PythonBytes() override;
2775a72c02bSZachary Turner 
2785a72c02bSZachary Turner     static bool
2795a72c02bSZachary Turner     Check(PyObject *py_obj);
2805a72c02bSZachary Turner 
2815a72c02bSZachary Turner     // Bring in the no-argument base class version
2825a72c02bSZachary Turner     using PythonObject::Reset;
2835a72c02bSZachary Turner 
2845a72c02bSZachary Turner     void
2855a72c02bSZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
2865a72c02bSZachary Turner 
2875a72c02bSZachary Turner     llvm::ArrayRef<uint8_t>
2885a72c02bSZachary Turner     GetBytes() const;
2895a72c02bSZachary Turner 
2905a72c02bSZachary Turner     size_t
2915a72c02bSZachary Turner     GetSize() const;
2925a72c02bSZachary Turner 
2935a72c02bSZachary Turner     void
2945a72c02bSZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2955a72c02bSZachary Turner 
2965a72c02bSZachary Turner     StructuredData::StringSP
2975a72c02bSZachary Turner     CreateStructuredString() const;
2985a72c02bSZachary Turner };
2995a72c02bSZachary Turner 
300f9d6d204SZachary Turner class PythonByteArray : public PythonObject
301f9d6d204SZachary Turner {
302f9d6d204SZachary Turner public:
303f9d6d204SZachary Turner     PythonByteArray();
304f9d6d204SZachary Turner     explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
305f9d6d204SZachary Turner     PythonByteArray(const uint8_t *bytes, size_t length);
306f9d6d204SZachary Turner     PythonByteArray(PyRefType type, PyObject *o);
307f9d6d204SZachary Turner     PythonByteArray(const PythonBytes &object);
308f9d6d204SZachary Turner 
309f9d6d204SZachary Turner     ~PythonByteArray() override;
310f9d6d204SZachary Turner 
311f9d6d204SZachary Turner     static bool
312f9d6d204SZachary Turner     Check(PyObject *py_obj);
313f9d6d204SZachary Turner 
314f9d6d204SZachary Turner     // Bring in the no-argument base class version
315f9d6d204SZachary Turner     using PythonObject::Reset;
316f9d6d204SZachary Turner 
317f9d6d204SZachary Turner     void
318f9d6d204SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
319f9d6d204SZachary Turner 
320f9d6d204SZachary Turner     llvm::ArrayRef<uint8_t>
321f9d6d204SZachary Turner     GetBytes() const;
322f9d6d204SZachary Turner 
323f9d6d204SZachary Turner     size_t
324f9d6d204SZachary Turner     GetSize() const;
325f9d6d204SZachary Turner 
326f9d6d204SZachary Turner     void
327f9d6d204SZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
328f9d6d204SZachary Turner 
329f9d6d204SZachary Turner     StructuredData::StringSP
330f9d6d204SZachary Turner     CreateStructuredString() const;
331f9d6d204SZachary Turner };
332f9d6d204SZachary Turner 
3332c1f46dcSZachary Turner class PythonString : public PythonObject
3342c1f46dcSZachary Turner {
3352c1f46dcSZachary Turner public:
3362c1f46dcSZachary Turner     PythonString();
337f8b22f8fSZachary Turner     explicit PythonString(llvm::StringRef string);
338f8b22f8fSZachary Turner     explicit PythonString(const char *string);
33987f47729SZachary Turner     PythonString(PyRefType type, PyObject *o);
34087f47729SZachary Turner     PythonString(const PythonString &object);
341edb35d95SEugene Zelenko 
342f8b22f8fSZachary Turner     ~PythonString() override;
3432c1f46dcSZachary Turner 
34422c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
34522c8efcdSZachary Turner 
346f8b22f8fSZachary Turner     // Bring in the no-argument base class version
347f8b22f8fSZachary Turner     using PythonObject::Reset;
348f8b22f8fSZachary Turner 
349f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3502c1f46dcSZachary Turner 
3512c1f46dcSZachary Turner     llvm::StringRef
3522c1f46dcSZachary Turner     GetString() const;
3532c1f46dcSZachary Turner 
3542c1f46dcSZachary Turner     size_t
3552c1f46dcSZachary Turner     GetSize() const;
3562c1f46dcSZachary Turner 
3572c1f46dcSZachary Turner     void SetString(llvm::StringRef string);
3582c1f46dcSZachary Turner 
3592c1f46dcSZachary Turner     StructuredData::StringSP CreateStructuredString() const;
3602c1f46dcSZachary Turner };
3612c1f46dcSZachary Turner 
3622c1f46dcSZachary Turner class PythonInteger : public PythonObject
3632c1f46dcSZachary Turner {
3642c1f46dcSZachary Turner public:
3652c1f46dcSZachary Turner     PythonInteger();
36687f47729SZachary Turner     explicit PythonInteger(int64_t value);
367f8b22f8fSZachary Turner     PythonInteger(PyRefType type, PyObject *o);
368f8b22f8fSZachary Turner     PythonInteger(const PythonInteger &object);
369edb35d95SEugene Zelenko 
370f8b22f8fSZachary Turner     ~PythonInteger() override;
3712c1f46dcSZachary Turner 
37222c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
37322c8efcdSZachary Turner 
374f8b22f8fSZachary Turner     // Bring in the no-argument base class version
375f8b22f8fSZachary Turner     using PythonObject::Reset;
376f8b22f8fSZachary Turner 
377f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3782c1f46dcSZachary Turner 
3792c1f46dcSZachary Turner     int64_t GetInteger() const;
3802c1f46dcSZachary Turner 
3812c1f46dcSZachary Turner     void
3822c1f46dcSZachary Turner     SetInteger (int64_t value);
3832c1f46dcSZachary Turner 
3842c1f46dcSZachary Turner     StructuredData::IntegerSP CreateStructuredInteger() const;
3852c1f46dcSZachary Turner };
3862c1f46dcSZachary Turner 
3872c1f46dcSZachary Turner class PythonList : public PythonObject
3882c1f46dcSZachary Turner {
3892c1f46dcSZachary Turner public:
390a1405147SZachary Turner     PythonList() {}
39187f47729SZachary Turner     explicit PythonList(PyInitialValue value);
39287f47729SZachary Turner     explicit PythonList(int list_size);
393f8b22f8fSZachary Turner     PythonList(PyRefType type, PyObject *o);
394f8b22f8fSZachary Turner     PythonList(const PythonList &list);
395edb35d95SEugene Zelenko 
396f8b22f8fSZachary Turner     ~PythonList() override;
3972c1f46dcSZachary Turner 
39822c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
39922c8efcdSZachary Turner 
400f8b22f8fSZachary Turner     // Bring in the no-argument base class version
401f8b22f8fSZachary Turner     using PythonObject::Reset;
402f8b22f8fSZachary Turner 
403f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4042c1f46dcSZachary Turner 
4052c1f46dcSZachary Turner     uint32_t GetSize() const;
4062c1f46dcSZachary Turner 
4072c1f46dcSZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
4082c1f46dcSZachary Turner 
409f8b22f8fSZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
4102c1f46dcSZachary Turner 
411f8b22f8fSZachary Turner     void AppendItem(const PythonObject &object);
4122c1f46dcSZachary Turner 
4132c1f46dcSZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
4142c1f46dcSZachary Turner };
4152c1f46dcSZachary Turner 
416a1405147SZachary Turner class PythonTuple : public PythonObject
417a1405147SZachary Turner {
418a1405147SZachary Turner public:
419a1405147SZachary Turner     PythonTuple() {}
420a1405147SZachary Turner     explicit PythonTuple(PyInitialValue value);
421a1405147SZachary Turner     explicit PythonTuple(int tuple_size);
422a1405147SZachary Turner     PythonTuple(PyRefType type, PyObject *o);
423a1405147SZachary Turner     PythonTuple(const PythonTuple &tuple);
424a1405147SZachary Turner     PythonTuple(std::initializer_list<PythonObject> objects);
425a1405147SZachary Turner     PythonTuple(std::initializer_list<PyObject*> objects);
426a1405147SZachary Turner 
427a1405147SZachary Turner     ~PythonTuple() override;
428a1405147SZachary Turner 
429a1405147SZachary Turner     static bool Check(PyObject *py_obj);
430a1405147SZachary Turner 
431a1405147SZachary Turner     // Bring in the no-argument base class version
432a1405147SZachary Turner     using PythonObject::Reset;
433a1405147SZachary Turner 
434a1405147SZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
435a1405147SZachary Turner 
436a1405147SZachary Turner     uint32_t GetSize() const;
437a1405147SZachary Turner 
438a1405147SZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
439a1405147SZachary Turner 
440a1405147SZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
441a1405147SZachary Turner 
442a1405147SZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
443a1405147SZachary Turner };
444a1405147SZachary Turner 
4452c1f46dcSZachary Turner class PythonDictionary : public PythonObject
4462c1f46dcSZachary Turner {
4472c1f46dcSZachary Turner public:
448a1405147SZachary Turner     PythonDictionary() {}
44987f47729SZachary Turner     explicit PythonDictionary(PyInitialValue value);
450f8b22f8fSZachary Turner     PythonDictionary(PyRefType type, PyObject *o);
451f8b22f8fSZachary Turner     PythonDictionary(const PythonDictionary &dict);
452edb35d95SEugene Zelenko 
453f8b22f8fSZachary Turner     ~PythonDictionary() override;
4542c1f46dcSZachary Turner 
45522c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
45622c8efcdSZachary Turner 
457f8b22f8fSZachary Turner     // Bring in the no-argument base class version
458f8b22f8fSZachary Turner     using PythonObject::Reset;
459f8b22f8fSZachary Turner 
460f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4612c1f46dcSZachary Turner 
4622c1f46dcSZachary Turner     uint32_t GetSize() const;
4632c1f46dcSZachary Turner 
464f8b22f8fSZachary Turner     PythonList GetKeys() const;
4652c1f46dcSZachary Turner 
466f8b22f8fSZachary Turner     PythonObject GetItemForKey(const PythonObject &key) const;
467f8b22f8fSZachary Turner     void SetItemForKey(const PythonObject &key, const PythonObject &value);
4682c1f46dcSZachary Turner 
4692c1f46dcSZachary Turner     StructuredData::DictionarySP CreateStructuredDictionary() const;
4702c1f46dcSZachary Turner };
47187f47729SZachary Turner 
4727841efbbSZachary Turner class PythonModule : public PythonObject
4737841efbbSZachary Turner {
4747841efbbSZachary Turner   public:
4757841efbbSZachary Turner     PythonModule();
4767841efbbSZachary Turner     PythonModule(PyRefType type, PyObject *o);
4777841efbbSZachary Turner     PythonModule(const PythonModule &dict);
4787841efbbSZachary Turner 
4797841efbbSZachary Turner     ~PythonModule() override;
4807841efbbSZachary Turner 
4817841efbbSZachary Turner     static bool Check(PyObject *py_obj);
4827841efbbSZachary Turner 
483a1405147SZachary Turner     static PythonModule
484a1405147SZachary Turner     BuiltinsModule();
485a1405147SZachary Turner 
486a1405147SZachary Turner     static PythonModule
487a1405147SZachary Turner     MainModule();
488a1405147SZachary Turner 
489a1405147SZachary Turner     static PythonModule
490a1405147SZachary Turner     AddModule(llvm::StringRef module);
4917841efbbSZachary Turner 
4922419f1d5SZachary Turner     static PythonModule
4932419f1d5SZachary Turner     ImportModule(llvm::StringRef module);
4942419f1d5SZachary Turner 
4957841efbbSZachary Turner     // Bring in the no-argument base class version
4967841efbbSZachary Turner     using PythonObject::Reset;
4977841efbbSZachary Turner 
4987841efbbSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4997841efbbSZachary Turner 
5007841efbbSZachary Turner     PythonDictionary GetDictionary() const;
5017841efbbSZachary Turner };
5027841efbbSZachary Turner 
503a1405147SZachary Turner class PythonCallable : public PythonObject
504a1405147SZachary Turner {
505a1405147SZachary Turner public:
506b58fb2f4SZachary Turner     struct ArgInfo {
507b58fb2f4SZachary Turner         size_t count;
508a5d6765cSEnrico Granata         bool is_bound_method : 1;
509b58fb2f4SZachary Turner         bool has_varargs : 1;
510b58fb2f4SZachary Turner         bool has_kwargs : 1;
511b58fb2f4SZachary Turner     };
512b58fb2f4SZachary Turner 
513a1405147SZachary Turner     PythonCallable();
514a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
515a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
516a1405147SZachary Turner 
517a1405147SZachary Turner     ~PythonCallable() override;
518a1405147SZachary Turner 
519a1405147SZachary Turner     static bool
520a1405147SZachary Turner     Check(PyObject *py_obj);
521a1405147SZachary Turner 
522a1405147SZachary Turner     // Bring in the no-argument base class version
523a1405147SZachary Turner     using PythonObject::Reset;
524a1405147SZachary Turner 
525a1405147SZachary Turner     void
526a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
527a1405147SZachary Turner 
528b58fb2f4SZachary Turner     ArgInfo
529b58fb2f4SZachary Turner     GetNumArguments() const;
530b58fb2f4SZachary Turner 
531b58fb2f4SZachary Turner     PythonObject
532b58fb2f4SZachary Turner     operator ()();
533a1405147SZachary Turner 
534a1405147SZachary Turner     PythonObject
535a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
536a1405147SZachary Turner 
537a1405147SZachary Turner     PythonObject
538a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
539b58fb2f4SZachary Turner 
540b58fb2f4SZachary Turner     template<typename Arg, typename... Args>
541b58fb2f4SZachary Turner     PythonObject
542b58fb2f4SZachary Turner     operator ()(const Arg &arg, Args... args)
543b58fb2f4SZachary Turner     {
544b58fb2f4SZachary Turner         return operator()({ arg, args... });
545b58fb2f4SZachary Turner     }
546a1405147SZachary Turner };
547a1405147SZachary Turner 
548a1405147SZachary Turner 
5499c40264fSZachary Turner class PythonFile : public PythonObject
5509c40264fSZachary Turner {
5519c40264fSZachary Turner   public:
55232064024SZachary Turner     PythonFile();
553eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
554eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
5559c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
556edb35d95SEugene Zelenko 
5579c40264fSZachary Turner     ~PythonFile() override;
5589c40264fSZachary Turner 
5599c40264fSZachary Turner     static bool Check(PyObject *py_obj);
5609c40264fSZachary Turner 
5619c40264fSZachary Turner     using PythonObject::Reset;
5629c40264fSZachary Turner 
5639c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
5649c40264fSZachary Turner     void Reset(File &file, const char *mode);
565eda01c31SZachary Turner 
566744959b9SEnrico Granata     static uint32_t GetOptionsFromMode(llvm::StringRef mode);
567744959b9SEnrico Granata 
568eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
5699c40264fSZachary Turner };
5709c40264fSZachary Turner 
5712c1f46dcSZachary Turner } // namespace lldb_private
5722c1f46dcSZachary Turner 
573a281b42bSZachary Turner #endif
574a281b42bSZachary Turner 
5752c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
576