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
19*9ba9dfddSPavel Labath #include "lldb-python.h"
202c1f46dcSZachary Turner #include "lldb/Core/ConstString.h"
212c1f46dcSZachary Turner #include "lldb/Core/Flags.h"
22*9ba9dfddSPavel Labath #include "lldb/Core/StructuredData.h"
239c40264fSZachary Turner #include "lldb/Host/File.h"
242c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h"
25*9ba9dfddSPavel Labath #include "lldb/lldb-defines.h"
262c1f46dcSZachary Turner 
275a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h"
285a72c02bSZachary Turner 
292c1f46dcSZachary Turner namespace lldb_private {
30edb35d95SEugene Zelenko 
315a72c02bSZachary Turner class PythonBytes;
322c1f46dcSZachary Turner class PythonString;
332c1f46dcSZachary Turner class PythonList;
342c1f46dcSZachary Turner class PythonDictionary;
352c1f46dcSZachary Turner class PythonInteger;
362c1f46dcSZachary Turner 
372c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic
382c1f46dcSZachary Turner {
392c1f46dcSZachary Turner public:
402c1f46dcSZachary Turner     StructuredPythonObject()
412c1f46dcSZachary Turner         : StructuredData::Generic()
422c1f46dcSZachary Turner     {
432c1f46dcSZachary Turner     }
442c1f46dcSZachary Turner 
452c1f46dcSZachary Turner     StructuredPythonObject(void *obj)
462c1f46dcSZachary Turner         : StructuredData::Generic(obj)
472c1f46dcSZachary Turner     {
482c1f46dcSZachary Turner         Py_XINCREF(GetValue());
492c1f46dcSZachary Turner     }
502c1f46dcSZachary Turner 
51edb35d95SEugene Zelenko     ~StructuredPythonObject() override
522c1f46dcSZachary Turner     {
532c1f46dcSZachary Turner         if (Py_IsInitialized())
542c1f46dcSZachary Turner             Py_XDECREF(GetValue());
552c1f46dcSZachary Turner         SetValue(nullptr);
562c1f46dcSZachary Turner     }
572c1f46dcSZachary Turner 
582c1f46dcSZachary Turner     bool
592c1f46dcSZachary Turner     IsValid() const override
602c1f46dcSZachary Turner     {
612c1f46dcSZachary Turner         return GetValue() && GetValue() != Py_None;
622c1f46dcSZachary Turner     }
632c1f46dcSZachary Turner 
64d9c9da53SJason Molenda     void Dump(Stream &s, bool pretty_print = true) const override;
652c1f46dcSZachary Turner 
662c1f46dcSZachary Turner private:
672c1f46dcSZachary Turner     DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
682c1f46dcSZachary Turner };
692c1f46dcSZachary Turner 
702c1f46dcSZachary Turner enum class PyObjectType
712c1f46dcSZachary Turner {
722c1f46dcSZachary Turner     Unknown,
732c1f46dcSZachary Turner     None,
742c1f46dcSZachary Turner     Integer,
752c1f46dcSZachary Turner     Dictionary,
762c1f46dcSZachary Turner     List,
779c40264fSZachary Turner     String,
785a72c02bSZachary Turner     Bytes,
79f9d6d204SZachary Turner     ByteArray,
807841efbbSZachary Turner     Module,
81a1405147SZachary Turner     Callable,
82a1405147SZachary Turner     Tuple,
839c40264fSZachary Turner     File
842c1f46dcSZachary Turner };
852c1f46dcSZachary Turner 
86f8b22f8fSZachary Turner enum class PyRefType
87f8b22f8fSZachary Turner {
88f8b22f8fSZachary Turner     Borrowed, // We are not given ownership of the incoming PyObject.
89f8b22f8fSZachary Turner               // We cannot safely hold it without calling Py_INCREF.
90f8b22f8fSZachary Turner     Owned     // We have ownership of the incoming PyObject.  We should
91f8b22f8fSZachary Turner               // not call Py_INCREF.
92f8b22f8fSZachary Turner };
93f8b22f8fSZachary Turner 
94f8b22f8fSZachary Turner enum class PyInitialValue
95f8b22f8fSZachary Turner {
96f8b22f8fSZachary Turner     Invalid,
97f8b22f8fSZachary Turner     Empty
98f8b22f8fSZachary Turner };
99f8b22f8fSZachary Turner 
1002c1f46dcSZachary Turner class PythonObject
1012c1f46dcSZachary Turner {
1022c1f46dcSZachary Turner public:
103f8b22f8fSZachary Turner     PythonObject()
104f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1052c1f46dcSZachary Turner     {
1062c1f46dcSZachary Turner     }
1072c1f46dcSZachary Turner 
108f8b22f8fSZachary Turner     PythonObject(PyRefType type, PyObject *py_obj)
109f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1102c1f46dcSZachary Turner     {
111f8b22f8fSZachary Turner         Reset(type, py_obj);
1122c1f46dcSZachary Turner     }
1132c1f46dcSZachary Turner 
114f8b22f8fSZachary Turner     PythonObject(const PythonObject &rhs)
115f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1162c1f46dcSZachary Turner     {
117f8b22f8fSZachary Turner         Reset(rhs);
1182c1f46dcSZachary Turner     }
1192c1f46dcSZachary Turner 
120edb35d95SEugene Zelenko     virtual ~PythonObject()
121edb35d95SEugene Zelenko     {
122edb35d95SEugene Zelenko         Reset();
123edb35d95SEugene Zelenko     }
1242c1f46dcSZachary Turner 
125f8b22f8fSZachary Turner     void
126f8b22f8fSZachary Turner     Reset()
1272c1f46dcSZachary Turner     {
128f8b22f8fSZachary Turner         // Avoid calling the virtual method since it's not necessary
129f8b22f8fSZachary Turner         // to actually validate the type of the PyObject if we're
130f8b22f8fSZachary Turner         // just setting to null.
1312c1f46dcSZachary Turner         if (Py_IsInitialized())
1322c1f46dcSZachary Turner             Py_XDECREF(m_py_obj);
133f8b22f8fSZachary Turner         m_py_obj = nullptr;
1342c1f46dcSZachary Turner     }
135f8b22f8fSZachary Turner 
136f8b22f8fSZachary Turner     void
137f8b22f8fSZachary Turner     Reset(const PythonObject &rhs)
138f8b22f8fSZachary Turner     {
139f8b22f8fSZachary Turner         // Avoid calling the virtual method if it's not necessary
140f8b22f8fSZachary Turner         // to actually validate the type of the PyObject.
14160c24f70SZachary Turner         if (!rhs.IsValid())
142f8b22f8fSZachary Turner             Reset();
143f8b22f8fSZachary Turner         else
144f8b22f8fSZachary Turner             Reset(PyRefType::Borrowed, rhs.m_py_obj);
145f8b22f8fSZachary Turner     }
146f8b22f8fSZachary Turner 
147f8b22f8fSZachary Turner     // PythonObject is implicitly convertible to PyObject *, which will call the
148f8b22f8fSZachary Turner     // wrong overload.  We want to explicitly disallow this, since a PyObject
149f8b22f8fSZachary Turner     // *always* owns its reference.  Therefore the overload which takes a
150f8b22f8fSZachary Turner     // PyRefType doesn't make sense, and the copy constructor should be used.
151f8b22f8fSZachary Turner     void
152f8b22f8fSZachary Turner     Reset(PyRefType type, const PythonObject &ref) = delete;
153f8b22f8fSZachary Turner 
154f8b22f8fSZachary Turner     virtual void
155f8b22f8fSZachary Turner     Reset(PyRefType type, PyObject *py_obj)
156f8b22f8fSZachary Turner     {
157f8b22f8fSZachary Turner         if (py_obj == m_py_obj)
158f8b22f8fSZachary Turner             return;
159f8b22f8fSZachary Turner 
160f8b22f8fSZachary Turner         if (Py_IsInitialized())
161f8b22f8fSZachary Turner             Py_XDECREF(m_py_obj);
162f8b22f8fSZachary Turner 
163f8b22f8fSZachary Turner         m_py_obj = py_obj;
164f8b22f8fSZachary Turner 
165f8b22f8fSZachary Turner         // If this is a borrowed reference, we need to convert it to
166f8b22f8fSZachary Turner         // an owned reference by incrementing it.  If it is an owned
167f8b22f8fSZachary Turner         // reference (for example the caller allocated it with PyDict_New()
168f8b22f8fSZachary Turner         // then we must *not* increment it.
169f8b22f8fSZachary Turner         if (Py_IsInitialized() && type == PyRefType::Borrowed)
170f8b22f8fSZachary Turner             Py_XINCREF(m_py_obj);
1712c1f46dcSZachary Turner     }
1722c1f46dcSZachary Turner 
1732c1f46dcSZachary Turner     void
1742c1f46dcSZachary Turner     Dump () const
1752c1f46dcSZachary Turner     {
1762c1f46dcSZachary Turner         if (m_py_obj)
1772c1f46dcSZachary Turner             _PyObject_Dump (m_py_obj);
1782c1f46dcSZachary Turner         else
1792c1f46dcSZachary Turner             puts ("NULL");
1802c1f46dcSZachary Turner     }
1812c1f46dcSZachary Turner 
1822c1f46dcSZachary Turner     void
1832c1f46dcSZachary Turner     Dump (Stream &strm) const;
1842c1f46dcSZachary Turner 
1852c1f46dcSZachary Turner     PyObject*
1862c1f46dcSZachary Turner     get() const
1872c1f46dcSZachary Turner     {
1882c1f46dcSZachary Turner         return m_py_obj;
1892c1f46dcSZachary Turner     }
1902c1f46dcSZachary Turner 
19160c24f70SZachary Turner     PyObject*
19260c24f70SZachary Turner     release()
19360c24f70SZachary Turner     {
19460c24f70SZachary Turner         PyObject *result = m_py_obj;
19560c24f70SZachary Turner         m_py_obj = nullptr;
19660c24f70SZachary Turner         return result;
19760c24f70SZachary Turner     }
19860c24f70SZachary Turner 
199f8b22f8fSZachary Turner     PythonObject &
200f8b22f8fSZachary Turner     operator=(const PythonObject &other)
2012c1f46dcSZachary Turner     {
202f8b22f8fSZachary Turner         Reset(PyRefType::Borrowed, other.get());
203f8b22f8fSZachary Turner         return *this;
2042c1f46dcSZachary Turner     }
2052c1f46dcSZachary Turner 
2067841efbbSZachary Turner     PyObjectType
2077841efbbSZachary Turner     GetObjectType() const;
2087841efbbSZachary Turner 
2097841efbbSZachary Turner     PythonString
2107841efbbSZachary Turner     Repr() const;
2117841efbbSZachary Turner 
2127841efbbSZachary Turner     PythonString
2137841efbbSZachary Turner     Str() const;
2147841efbbSZachary Turner 
2157841efbbSZachary Turner     static PythonObject
21602bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict);
2177841efbbSZachary Turner 
218b58fb2f4SZachary Turner     template<typename T>
219b58fb2f4SZachary Turner     static T
22002bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict)
221b58fb2f4SZachary Turner     {
222b58fb2f4SZachary Turner         return ResolveNameWithDictionary(name, dict).AsType<T>();
223b58fb2f4SZachary Turner     }
224b58fb2f4SZachary Turner 
2257841efbbSZachary Turner     PythonObject
2267841efbbSZachary Turner     ResolveName(llvm::StringRef name) const;
2277841efbbSZachary Turner 
228b58fb2f4SZachary Turner     template<typename T>
229b58fb2f4SZachary Turner     T
230b58fb2f4SZachary Turner     ResolveName(llvm::StringRef name) const
231b58fb2f4SZachary Turner     {
232b58fb2f4SZachary Turner         return ResolveName(name).AsType<T>();
233b58fb2f4SZachary Turner     }
234b58fb2f4SZachary Turner 
2352c1f46dcSZachary Turner     bool
2369c40264fSZachary Turner     HasAttribute(llvm::StringRef attribute) const;
2379c40264fSZachary Turner 
2387d6d218eSZachary Turner     PythonObject
2397d6d218eSZachary Turner     GetAttributeValue(llvm::StringRef attribute) const;
2407d6d218eSZachary Turner 
2419c40264fSZachary Turner     bool
242f8b22f8fSZachary Turner     IsValid() const;
243f8b22f8fSZachary Turner 
244f8b22f8fSZachary Turner     bool
245f8b22f8fSZachary Turner     IsAllocated() const;
246f8b22f8fSZachary Turner 
247f8b22f8fSZachary Turner     bool
248f8b22f8fSZachary Turner     IsNone() const;
2492c1f46dcSZachary Turner 
2507d6d218eSZachary Turner     template<typename T>
2517d6d218eSZachary Turner     T AsType() const
2527d6d218eSZachary Turner     {
2537d6d218eSZachary Turner         if (!T::Check(m_py_obj))
2547d6d218eSZachary Turner             return T();
2557d6d218eSZachary Turner         return T(PyRefType::Borrowed, m_py_obj);
2567d6d218eSZachary Turner     }
2577d6d218eSZachary Turner 
2587841efbbSZachary Turner     StructuredData::ObjectSP
2597841efbbSZachary Turner     CreateStructuredObject() const;
2602c1f46dcSZachary Turner 
2612c1f46dcSZachary Turner protected:
2622c1f46dcSZachary Turner     PyObject* m_py_obj;
2632c1f46dcSZachary Turner };
2642c1f46dcSZachary Turner 
2655a72c02bSZachary Turner class PythonBytes : public PythonObject
2665a72c02bSZachary Turner {
2675a72c02bSZachary Turner public:
2685a72c02bSZachary Turner     PythonBytes();
2695a72c02bSZachary Turner     explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
2705a72c02bSZachary Turner     PythonBytes(const uint8_t *bytes, size_t length);
2715a72c02bSZachary Turner     PythonBytes(PyRefType type, PyObject *o);
2725a72c02bSZachary Turner     PythonBytes(const PythonBytes &object);
2735a72c02bSZachary Turner 
2745a72c02bSZachary Turner     ~PythonBytes() override;
2755a72c02bSZachary Turner 
2765a72c02bSZachary Turner     static bool
2775a72c02bSZachary Turner     Check(PyObject *py_obj);
2785a72c02bSZachary Turner 
2795a72c02bSZachary Turner     // Bring in the no-argument base class version
2805a72c02bSZachary Turner     using PythonObject::Reset;
2815a72c02bSZachary Turner 
2825a72c02bSZachary Turner     void
2835a72c02bSZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
2845a72c02bSZachary Turner 
2855a72c02bSZachary Turner     llvm::ArrayRef<uint8_t>
2865a72c02bSZachary Turner     GetBytes() const;
2875a72c02bSZachary Turner 
2885a72c02bSZachary Turner     size_t
2895a72c02bSZachary Turner     GetSize() const;
2905a72c02bSZachary Turner 
2915a72c02bSZachary Turner     void
2925a72c02bSZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2935a72c02bSZachary Turner 
2945a72c02bSZachary Turner     StructuredData::StringSP
2955a72c02bSZachary Turner     CreateStructuredString() const;
2965a72c02bSZachary Turner };
2975a72c02bSZachary Turner 
298f9d6d204SZachary Turner class PythonByteArray : public PythonObject
299f9d6d204SZachary Turner {
300f9d6d204SZachary Turner public:
301f9d6d204SZachary Turner     PythonByteArray();
302f9d6d204SZachary Turner     explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
303f9d6d204SZachary Turner     PythonByteArray(const uint8_t *bytes, size_t length);
304f9d6d204SZachary Turner     PythonByteArray(PyRefType type, PyObject *o);
305f9d6d204SZachary Turner     PythonByteArray(const PythonBytes &object);
306f9d6d204SZachary Turner 
307f9d6d204SZachary Turner     ~PythonByteArray() override;
308f9d6d204SZachary Turner 
309f9d6d204SZachary Turner     static bool
310f9d6d204SZachary Turner     Check(PyObject *py_obj);
311f9d6d204SZachary Turner 
312f9d6d204SZachary Turner     // Bring in the no-argument base class version
313f9d6d204SZachary Turner     using PythonObject::Reset;
314f9d6d204SZachary Turner 
315f9d6d204SZachary Turner     void
316f9d6d204SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
317f9d6d204SZachary Turner 
318f9d6d204SZachary Turner     llvm::ArrayRef<uint8_t>
319f9d6d204SZachary Turner     GetBytes() const;
320f9d6d204SZachary Turner 
321f9d6d204SZachary Turner     size_t
322f9d6d204SZachary Turner     GetSize() const;
323f9d6d204SZachary Turner 
324f9d6d204SZachary Turner     void
325f9d6d204SZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
326f9d6d204SZachary Turner 
327f9d6d204SZachary Turner     StructuredData::StringSP
328f9d6d204SZachary Turner     CreateStructuredString() const;
329f9d6d204SZachary Turner };
330f9d6d204SZachary Turner 
3312c1f46dcSZachary Turner class PythonString : public PythonObject
3322c1f46dcSZachary Turner {
3332c1f46dcSZachary Turner public:
3342c1f46dcSZachary Turner     PythonString();
335f8b22f8fSZachary Turner     explicit PythonString(llvm::StringRef string);
336f8b22f8fSZachary Turner     explicit PythonString(const char *string);
33787f47729SZachary Turner     PythonString(PyRefType type, PyObject *o);
33887f47729SZachary Turner     PythonString(const PythonString &object);
339edb35d95SEugene Zelenko 
340f8b22f8fSZachary Turner     ~PythonString() override;
3412c1f46dcSZachary Turner 
34222c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
34322c8efcdSZachary Turner 
344f8b22f8fSZachary Turner     // Bring in the no-argument base class version
345f8b22f8fSZachary Turner     using PythonObject::Reset;
346f8b22f8fSZachary Turner 
347f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3482c1f46dcSZachary Turner 
3492c1f46dcSZachary Turner     llvm::StringRef
3502c1f46dcSZachary Turner     GetString() const;
3512c1f46dcSZachary Turner 
3522c1f46dcSZachary Turner     size_t
3532c1f46dcSZachary Turner     GetSize() const;
3542c1f46dcSZachary Turner 
3552c1f46dcSZachary Turner     void SetString(llvm::StringRef string);
3562c1f46dcSZachary Turner 
3572c1f46dcSZachary Turner     StructuredData::StringSP CreateStructuredString() const;
3582c1f46dcSZachary Turner };
3592c1f46dcSZachary Turner 
3602c1f46dcSZachary Turner class PythonInteger : public PythonObject
3612c1f46dcSZachary Turner {
3622c1f46dcSZachary Turner public:
3632c1f46dcSZachary Turner     PythonInteger();
36487f47729SZachary Turner     explicit PythonInteger(int64_t value);
365f8b22f8fSZachary Turner     PythonInteger(PyRefType type, PyObject *o);
366f8b22f8fSZachary Turner     PythonInteger(const PythonInteger &object);
367edb35d95SEugene Zelenko 
368f8b22f8fSZachary Turner     ~PythonInteger() override;
3692c1f46dcSZachary Turner 
37022c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
37122c8efcdSZachary Turner 
372f8b22f8fSZachary Turner     // Bring in the no-argument base class version
373f8b22f8fSZachary Turner     using PythonObject::Reset;
374f8b22f8fSZachary Turner 
375f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3762c1f46dcSZachary Turner 
3772c1f46dcSZachary Turner     int64_t GetInteger() const;
3782c1f46dcSZachary Turner 
3792c1f46dcSZachary Turner     void
3802c1f46dcSZachary Turner     SetInteger (int64_t value);
3812c1f46dcSZachary Turner 
3822c1f46dcSZachary Turner     StructuredData::IntegerSP CreateStructuredInteger() const;
3832c1f46dcSZachary Turner };
3842c1f46dcSZachary Turner 
3852c1f46dcSZachary Turner class PythonList : public PythonObject
3862c1f46dcSZachary Turner {
3872c1f46dcSZachary Turner public:
388a1405147SZachary Turner     PythonList() {}
38987f47729SZachary Turner     explicit PythonList(PyInitialValue value);
39087f47729SZachary Turner     explicit PythonList(int list_size);
391f8b22f8fSZachary Turner     PythonList(PyRefType type, PyObject *o);
392f8b22f8fSZachary Turner     PythonList(const PythonList &list);
393edb35d95SEugene Zelenko 
394f8b22f8fSZachary Turner     ~PythonList() override;
3952c1f46dcSZachary Turner 
39622c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
39722c8efcdSZachary Turner 
398f8b22f8fSZachary Turner     // Bring in the no-argument base class version
399f8b22f8fSZachary Turner     using PythonObject::Reset;
400f8b22f8fSZachary Turner 
401f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4022c1f46dcSZachary Turner 
4032c1f46dcSZachary Turner     uint32_t GetSize() const;
4042c1f46dcSZachary Turner 
4052c1f46dcSZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
4062c1f46dcSZachary Turner 
407f8b22f8fSZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
4082c1f46dcSZachary Turner 
409f8b22f8fSZachary Turner     void AppendItem(const PythonObject &object);
4102c1f46dcSZachary Turner 
4112c1f46dcSZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
4122c1f46dcSZachary Turner };
4132c1f46dcSZachary Turner 
414a1405147SZachary Turner class PythonTuple : public PythonObject
415a1405147SZachary Turner {
416a1405147SZachary Turner public:
417a1405147SZachary Turner     PythonTuple() {}
418a1405147SZachary Turner     explicit PythonTuple(PyInitialValue value);
419a1405147SZachary Turner     explicit PythonTuple(int tuple_size);
420a1405147SZachary Turner     PythonTuple(PyRefType type, PyObject *o);
421a1405147SZachary Turner     PythonTuple(const PythonTuple &tuple);
422a1405147SZachary Turner     PythonTuple(std::initializer_list<PythonObject> objects);
423a1405147SZachary Turner     PythonTuple(std::initializer_list<PyObject*> objects);
424a1405147SZachary Turner 
425a1405147SZachary Turner     ~PythonTuple() override;
426a1405147SZachary Turner 
427a1405147SZachary Turner     static bool Check(PyObject *py_obj);
428a1405147SZachary Turner 
429a1405147SZachary Turner     // Bring in the no-argument base class version
430a1405147SZachary Turner     using PythonObject::Reset;
431a1405147SZachary Turner 
432a1405147SZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
433a1405147SZachary Turner 
434a1405147SZachary Turner     uint32_t GetSize() const;
435a1405147SZachary Turner 
436a1405147SZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
437a1405147SZachary Turner 
438a1405147SZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
439a1405147SZachary Turner 
440a1405147SZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
441a1405147SZachary Turner };
442a1405147SZachary Turner 
4432c1f46dcSZachary Turner class PythonDictionary : public PythonObject
4442c1f46dcSZachary Turner {
4452c1f46dcSZachary Turner public:
446a1405147SZachary Turner     PythonDictionary() {}
44787f47729SZachary Turner     explicit PythonDictionary(PyInitialValue value);
448f8b22f8fSZachary Turner     PythonDictionary(PyRefType type, PyObject *o);
449f8b22f8fSZachary Turner     PythonDictionary(const PythonDictionary &dict);
450edb35d95SEugene Zelenko 
451f8b22f8fSZachary Turner     ~PythonDictionary() override;
4522c1f46dcSZachary Turner 
45322c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
45422c8efcdSZachary Turner 
455f8b22f8fSZachary Turner     // Bring in the no-argument base class version
456f8b22f8fSZachary Turner     using PythonObject::Reset;
457f8b22f8fSZachary Turner 
458f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4592c1f46dcSZachary Turner 
4602c1f46dcSZachary Turner     uint32_t GetSize() const;
4612c1f46dcSZachary Turner 
462f8b22f8fSZachary Turner     PythonList GetKeys() const;
4632c1f46dcSZachary Turner 
464f8b22f8fSZachary Turner     PythonObject GetItemForKey(const PythonObject &key) const;
465f8b22f8fSZachary Turner     void SetItemForKey(const PythonObject &key, const PythonObject &value);
4662c1f46dcSZachary Turner 
4672c1f46dcSZachary Turner     StructuredData::DictionarySP CreateStructuredDictionary() const;
4682c1f46dcSZachary Turner };
46987f47729SZachary Turner 
4707841efbbSZachary Turner class PythonModule : public PythonObject
4717841efbbSZachary Turner {
4727841efbbSZachary Turner   public:
4737841efbbSZachary Turner     PythonModule();
4747841efbbSZachary Turner     PythonModule(PyRefType type, PyObject *o);
4757841efbbSZachary Turner     PythonModule(const PythonModule &dict);
4767841efbbSZachary Turner 
4777841efbbSZachary Turner     ~PythonModule() override;
4787841efbbSZachary Turner 
4797841efbbSZachary Turner     static bool Check(PyObject *py_obj);
4807841efbbSZachary Turner 
481a1405147SZachary Turner     static PythonModule
482a1405147SZachary Turner     BuiltinsModule();
483a1405147SZachary Turner 
484a1405147SZachary Turner     static PythonModule
485a1405147SZachary Turner     MainModule();
486a1405147SZachary Turner 
487a1405147SZachary Turner     static PythonModule
488a1405147SZachary Turner     AddModule(llvm::StringRef module);
4897841efbbSZachary Turner 
4902419f1d5SZachary Turner     static PythonModule
4912419f1d5SZachary Turner     ImportModule(llvm::StringRef module);
4922419f1d5SZachary Turner 
4937841efbbSZachary Turner     // Bring in the no-argument base class version
4947841efbbSZachary Turner     using PythonObject::Reset;
4957841efbbSZachary Turner 
4967841efbbSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4977841efbbSZachary Turner 
4987841efbbSZachary Turner     PythonDictionary GetDictionary() const;
4997841efbbSZachary Turner };
5007841efbbSZachary Turner 
501a1405147SZachary Turner class PythonCallable : public PythonObject
502a1405147SZachary Turner {
503a1405147SZachary Turner public:
504b58fb2f4SZachary Turner     struct ArgInfo {
505b58fb2f4SZachary Turner         size_t count;
506a5d6765cSEnrico Granata         bool is_bound_method : 1;
507b58fb2f4SZachary Turner         bool has_varargs : 1;
508b58fb2f4SZachary Turner         bool has_kwargs : 1;
509b58fb2f4SZachary Turner     };
510b58fb2f4SZachary Turner 
511a1405147SZachary Turner     PythonCallable();
512a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
513a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
514a1405147SZachary Turner 
515a1405147SZachary Turner     ~PythonCallable() override;
516a1405147SZachary Turner 
517a1405147SZachary Turner     static bool
518a1405147SZachary Turner     Check(PyObject *py_obj);
519a1405147SZachary Turner 
520a1405147SZachary Turner     // Bring in the no-argument base class version
521a1405147SZachary Turner     using PythonObject::Reset;
522a1405147SZachary Turner 
523a1405147SZachary Turner     void
524a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
525a1405147SZachary Turner 
526b58fb2f4SZachary Turner     ArgInfo
527b58fb2f4SZachary Turner     GetNumArguments() const;
528b58fb2f4SZachary Turner 
529b58fb2f4SZachary Turner     PythonObject
530b58fb2f4SZachary Turner     operator ()();
531a1405147SZachary Turner 
532a1405147SZachary Turner     PythonObject
533a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
534a1405147SZachary Turner 
535a1405147SZachary Turner     PythonObject
536a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
537b58fb2f4SZachary Turner 
538b58fb2f4SZachary Turner     template<typename Arg, typename... Args>
539b58fb2f4SZachary Turner     PythonObject
540b58fb2f4SZachary Turner     operator ()(const Arg &arg, Args... args)
541b58fb2f4SZachary Turner     {
542b58fb2f4SZachary Turner         return operator()({ arg, args... });
543b58fb2f4SZachary Turner     }
544a1405147SZachary Turner };
545a1405147SZachary Turner 
546a1405147SZachary Turner 
5479c40264fSZachary Turner class PythonFile : public PythonObject
5489c40264fSZachary Turner {
5499c40264fSZachary Turner   public:
55032064024SZachary Turner     PythonFile();
551eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
552eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
5539c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
554edb35d95SEugene Zelenko 
5559c40264fSZachary Turner     ~PythonFile() override;
5569c40264fSZachary Turner 
5579c40264fSZachary Turner     static bool Check(PyObject *py_obj);
5589c40264fSZachary Turner 
5599c40264fSZachary Turner     using PythonObject::Reset;
5609c40264fSZachary Turner 
5619c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
5629c40264fSZachary Turner     void Reset(File &file, const char *mode);
563eda01c31SZachary Turner 
564744959b9SEnrico Granata     static uint32_t GetOptionsFromMode(llvm::StringRef mode);
565744959b9SEnrico Granata 
566eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
5679c40264fSZachary Turner };
5689c40264fSZachary Turner 
5692c1f46dcSZachary Turner } // namespace lldb_private
5702c1f46dcSZachary Turner 
571a281b42bSZachary Turner #endif
572a281b42bSZachary Turner 
5732c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
574