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,
78*f9d6d204SZachary Turner     ByteArray,
797841efbbSZachary Turner     Module,
80a1405147SZachary Turner     Callable,
81a1405147SZachary Turner     Tuple,
829c40264fSZachary Turner     File
832c1f46dcSZachary Turner };
842c1f46dcSZachary Turner 
85f8b22f8fSZachary Turner enum class PyRefType
86f8b22f8fSZachary Turner {
87f8b22f8fSZachary Turner     Borrowed, // We are not given ownership of the incoming PyObject.
88f8b22f8fSZachary Turner               // We cannot safely hold it without calling Py_INCREF.
89f8b22f8fSZachary Turner     Owned     // We have ownership of the incoming PyObject.  We should
90f8b22f8fSZachary Turner               // not call Py_INCREF.
91f8b22f8fSZachary Turner };
92f8b22f8fSZachary Turner 
93f8b22f8fSZachary Turner enum class PyInitialValue
94f8b22f8fSZachary Turner {
95f8b22f8fSZachary Turner     Invalid,
96f8b22f8fSZachary Turner     Empty
97f8b22f8fSZachary Turner };
98f8b22f8fSZachary Turner 
992c1f46dcSZachary Turner class PythonObject
1002c1f46dcSZachary Turner {
1012c1f46dcSZachary Turner public:
102f8b22f8fSZachary Turner     PythonObject()
103f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1042c1f46dcSZachary Turner     {
1052c1f46dcSZachary Turner     }
1062c1f46dcSZachary Turner 
107f8b22f8fSZachary Turner     PythonObject(PyRefType type, PyObject *py_obj)
108f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1092c1f46dcSZachary Turner     {
110f8b22f8fSZachary Turner         Reset(type, py_obj);
1112c1f46dcSZachary Turner     }
1122c1f46dcSZachary Turner 
113f8b22f8fSZachary Turner     PythonObject(const PythonObject &rhs)
114f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1152c1f46dcSZachary Turner     {
116f8b22f8fSZachary Turner         Reset(rhs);
1172c1f46dcSZachary Turner     }
1182c1f46dcSZachary Turner 
119edb35d95SEugene Zelenko     virtual ~PythonObject()
120edb35d95SEugene Zelenko     {
121edb35d95SEugene Zelenko         Reset();
122edb35d95SEugene Zelenko     }
1232c1f46dcSZachary Turner 
124f8b22f8fSZachary Turner     void
125f8b22f8fSZachary Turner     Reset()
1262c1f46dcSZachary Turner     {
127f8b22f8fSZachary Turner         // Avoid calling the virtual method since it's not necessary
128f8b22f8fSZachary Turner         // to actually validate the type of the PyObject if we're
129f8b22f8fSZachary Turner         // just setting to null.
1302c1f46dcSZachary Turner         if (Py_IsInitialized())
1312c1f46dcSZachary Turner             Py_XDECREF(m_py_obj);
132f8b22f8fSZachary Turner         m_py_obj = nullptr;
1332c1f46dcSZachary Turner     }
134f8b22f8fSZachary Turner 
135f8b22f8fSZachary Turner     void
136f8b22f8fSZachary Turner     Reset(const PythonObject &rhs)
137f8b22f8fSZachary Turner     {
138f8b22f8fSZachary Turner         // Avoid calling the virtual method if it's not necessary
139f8b22f8fSZachary Turner         // to actually validate the type of the PyObject.
14060c24f70SZachary Turner         if (!rhs.IsValid())
141f8b22f8fSZachary Turner             Reset();
142f8b22f8fSZachary Turner         else
143f8b22f8fSZachary Turner             Reset(PyRefType::Borrowed, rhs.m_py_obj);
144f8b22f8fSZachary Turner     }
145f8b22f8fSZachary Turner 
146f8b22f8fSZachary Turner     // PythonObject is implicitly convertible to PyObject *, which will call the
147f8b22f8fSZachary Turner     // wrong overload.  We want to explicitly disallow this, since a PyObject
148f8b22f8fSZachary Turner     // *always* owns its reference.  Therefore the overload which takes a
149f8b22f8fSZachary Turner     // PyRefType doesn't make sense, and the copy constructor should be used.
150f8b22f8fSZachary Turner     void
151f8b22f8fSZachary Turner     Reset(PyRefType type, const PythonObject &ref) = delete;
152f8b22f8fSZachary Turner 
153f8b22f8fSZachary Turner     virtual void
154f8b22f8fSZachary Turner     Reset(PyRefType type, PyObject *py_obj)
155f8b22f8fSZachary Turner     {
156f8b22f8fSZachary Turner         if (py_obj == m_py_obj)
157f8b22f8fSZachary Turner             return;
158f8b22f8fSZachary Turner 
159f8b22f8fSZachary Turner         if (Py_IsInitialized())
160f8b22f8fSZachary Turner             Py_XDECREF(m_py_obj);
161f8b22f8fSZachary Turner 
162f8b22f8fSZachary Turner         m_py_obj = py_obj;
163f8b22f8fSZachary Turner 
164f8b22f8fSZachary Turner         // If this is a borrowed reference, we need to convert it to
165f8b22f8fSZachary Turner         // an owned reference by incrementing it.  If it is an owned
166f8b22f8fSZachary Turner         // reference (for example the caller allocated it with PyDict_New()
167f8b22f8fSZachary Turner         // then we must *not* increment it.
168f8b22f8fSZachary Turner         if (Py_IsInitialized() && type == PyRefType::Borrowed)
169f8b22f8fSZachary Turner             Py_XINCREF(m_py_obj);
1702c1f46dcSZachary Turner     }
1712c1f46dcSZachary Turner 
1722c1f46dcSZachary Turner     void
1732c1f46dcSZachary Turner     Dump () const
1742c1f46dcSZachary Turner     {
1752c1f46dcSZachary Turner         if (m_py_obj)
1762c1f46dcSZachary Turner             _PyObject_Dump (m_py_obj);
1772c1f46dcSZachary Turner         else
1782c1f46dcSZachary Turner             puts ("NULL");
1792c1f46dcSZachary Turner     }
1802c1f46dcSZachary Turner 
1812c1f46dcSZachary Turner     void
1822c1f46dcSZachary Turner     Dump (Stream &strm) const;
1832c1f46dcSZachary Turner 
1842c1f46dcSZachary Turner     PyObject*
1852c1f46dcSZachary Turner     get() const
1862c1f46dcSZachary Turner     {
1872c1f46dcSZachary Turner         return m_py_obj;
1882c1f46dcSZachary Turner     }
1892c1f46dcSZachary Turner 
19060c24f70SZachary Turner     PyObject*
19160c24f70SZachary Turner     release()
19260c24f70SZachary Turner     {
19360c24f70SZachary Turner         PyObject *result = m_py_obj;
19460c24f70SZachary Turner         m_py_obj = nullptr;
19560c24f70SZachary Turner         return result;
19660c24f70SZachary Turner     }
19760c24f70SZachary Turner 
198f8b22f8fSZachary Turner     PythonObject &
199f8b22f8fSZachary Turner     operator=(const PythonObject &other)
2002c1f46dcSZachary Turner     {
201f8b22f8fSZachary Turner         Reset(PyRefType::Borrowed, other.get());
202f8b22f8fSZachary Turner         return *this;
2032c1f46dcSZachary Turner     }
2042c1f46dcSZachary Turner 
2057841efbbSZachary Turner     PyObjectType
2067841efbbSZachary Turner     GetObjectType() const;
2077841efbbSZachary Turner 
2087841efbbSZachary Turner     PythonString
2097841efbbSZachary Turner     Repr() const;
2107841efbbSZachary Turner 
2117841efbbSZachary Turner     PythonString
2127841efbbSZachary Turner     Str() const;
2137841efbbSZachary Turner 
2147841efbbSZachary Turner     static PythonObject
21502bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict);
2167841efbbSZachary Turner 
217b58fb2f4SZachary Turner     template<typename T>
218b58fb2f4SZachary Turner     static T
21902bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict)
220b58fb2f4SZachary Turner     {
221b58fb2f4SZachary Turner         return ResolveNameWithDictionary(name, dict).AsType<T>();
222b58fb2f4SZachary Turner     }
223b58fb2f4SZachary Turner 
2247841efbbSZachary Turner     PythonObject
2257841efbbSZachary Turner     ResolveName(llvm::StringRef name) const;
2267841efbbSZachary Turner 
227b58fb2f4SZachary Turner     template<typename T>
228b58fb2f4SZachary Turner     T
229b58fb2f4SZachary Turner     ResolveName(llvm::StringRef name) const
230b58fb2f4SZachary Turner     {
231b58fb2f4SZachary Turner         return ResolveName(name).AsType<T>();
232b58fb2f4SZachary Turner     }
233b58fb2f4SZachary Turner 
2342c1f46dcSZachary Turner     bool
2359c40264fSZachary Turner     HasAttribute(llvm::StringRef attribute) const;
2369c40264fSZachary Turner 
2377d6d218eSZachary Turner     PythonObject
2387d6d218eSZachary Turner     GetAttributeValue(llvm::StringRef attribute) const;
2397d6d218eSZachary Turner 
2409c40264fSZachary Turner     bool
241f8b22f8fSZachary Turner     IsValid() const;
242f8b22f8fSZachary Turner 
243f8b22f8fSZachary Turner     bool
244f8b22f8fSZachary Turner     IsAllocated() const;
245f8b22f8fSZachary Turner 
246f8b22f8fSZachary Turner     bool
247f8b22f8fSZachary Turner     IsNone() const;
2482c1f46dcSZachary Turner 
2497d6d218eSZachary Turner     template<typename T>
2507d6d218eSZachary Turner     T AsType() const
2517d6d218eSZachary Turner     {
2527d6d218eSZachary Turner         if (!T::Check(m_py_obj))
2537d6d218eSZachary Turner             return T();
2547d6d218eSZachary Turner         return T(PyRefType::Borrowed, m_py_obj);
2557d6d218eSZachary Turner     }
2567d6d218eSZachary Turner 
2577841efbbSZachary Turner     StructuredData::ObjectSP
2587841efbbSZachary Turner     CreateStructuredObject() const;
2592c1f46dcSZachary Turner 
2602c1f46dcSZachary Turner protected:
2612c1f46dcSZachary Turner     PyObject* m_py_obj;
2622c1f46dcSZachary Turner };
2632c1f46dcSZachary Turner 
2645a72c02bSZachary Turner class PythonBytes : public PythonObject
2655a72c02bSZachary Turner {
2665a72c02bSZachary Turner public:
2675a72c02bSZachary Turner     PythonBytes();
2685a72c02bSZachary Turner     explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
2695a72c02bSZachary Turner     PythonBytes(const uint8_t *bytes, size_t length);
2705a72c02bSZachary Turner     PythonBytes(PyRefType type, PyObject *o);
2715a72c02bSZachary Turner     PythonBytes(const PythonBytes &object);
2725a72c02bSZachary Turner 
2735a72c02bSZachary Turner     ~PythonBytes() override;
2745a72c02bSZachary Turner 
2755a72c02bSZachary Turner     static bool
2765a72c02bSZachary Turner     Check(PyObject *py_obj);
2775a72c02bSZachary Turner 
2785a72c02bSZachary Turner     // Bring in the no-argument base class version
2795a72c02bSZachary Turner     using PythonObject::Reset;
2805a72c02bSZachary Turner 
2815a72c02bSZachary Turner     void
2825a72c02bSZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
2835a72c02bSZachary Turner 
2845a72c02bSZachary Turner     llvm::ArrayRef<uint8_t>
2855a72c02bSZachary Turner     GetBytes() const;
2865a72c02bSZachary Turner 
2875a72c02bSZachary Turner     size_t
2885a72c02bSZachary Turner     GetSize() const;
2895a72c02bSZachary Turner 
2905a72c02bSZachary Turner     void
2915a72c02bSZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2925a72c02bSZachary Turner 
2935a72c02bSZachary Turner     StructuredData::StringSP
2945a72c02bSZachary Turner     CreateStructuredString() const;
2955a72c02bSZachary Turner };
2965a72c02bSZachary Turner 
297*f9d6d204SZachary Turner class PythonByteArray : public PythonObject
298*f9d6d204SZachary Turner {
299*f9d6d204SZachary Turner public:
300*f9d6d204SZachary Turner     PythonByteArray();
301*f9d6d204SZachary Turner     explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
302*f9d6d204SZachary Turner     PythonByteArray(const uint8_t *bytes, size_t length);
303*f9d6d204SZachary Turner     PythonByteArray(PyRefType type, PyObject *o);
304*f9d6d204SZachary Turner     PythonByteArray(const PythonBytes &object);
305*f9d6d204SZachary Turner 
306*f9d6d204SZachary Turner     ~PythonByteArray() override;
307*f9d6d204SZachary Turner 
308*f9d6d204SZachary Turner     static bool
309*f9d6d204SZachary Turner     Check(PyObject *py_obj);
310*f9d6d204SZachary Turner 
311*f9d6d204SZachary Turner     // Bring in the no-argument base class version
312*f9d6d204SZachary Turner     using PythonObject::Reset;
313*f9d6d204SZachary Turner 
314*f9d6d204SZachary Turner     void
315*f9d6d204SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
316*f9d6d204SZachary Turner 
317*f9d6d204SZachary Turner     llvm::ArrayRef<uint8_t>
318*f9d6d204SZachary Turner     GetBytes() const;
319*f9d6d204SZachary Turner 
320*f9d6d204SZachary Turner     size_t
321*f9d6d204SZachary Turner     GetSize() const;
322*f9d6d204SZachary Turner 
323*f9d6d204SZachary Turner     void
324*f9d6d204SZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
325*f9d6d204SZachary Turner 
326*f9d6d204SZachary Turner     StructuredData::StringSP
327*f9d6d204SZachary Turner     CreateStructuredString() const;
328*f9d6d204SZachary Turner };
329*f9d6d204SZachary Turner 
3302c1f46dcSZachary Turner class PythonString : public PythonObject
3312c1f46dcSZachary Turner {
3322c1f46dcSZachary Turner public:
3332c1f46dcSZachary Turner     PythonString();
334f8b22f8fSZachary Turner     explicit PythonString(llvm::StringRef string);
335f8b22f8fSZachary Turner     explicit PythonString(const char *string);
33687f47729SZachary Turner     PythonString(PyRefType type, PyObject *o);
33787f47729SZachary Turner     PythonString(const PythonString &object);
338edb35d95SEugene Zelenko 
339f8b22f8fSZachary Turner     ~PythonString() override;
3402c1f46dcSZachary Turner 
34122c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
34222c8efcdSZachary Turner 
343f8b22f8fSZachary Turner     // Bring in the no-argument base class version
344f8b22f8fSZachary Turner     using PythonObject::Reset;
345f8b22f8fSZachary Turner 
346f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3472c1f46dcSZachary Turner 
3482c1f46dcSZachary Turner     llvm::StringRef
3492c1f46dcSZachary Turner     GetString() const;
3502c1f46dcSZachary Turner 
3512c1f46dcSZachary Turner     size_t
3522c1f46dcSZachary Turner     GetSize() const;
3532c1f46dcSZachary Turner 
3542c1f46dcSZachary Turner     void SetString(llvm::StringRef string);
3552c1f46dcSZachary Turner 
3562c1f46dcSZachary Turner     StructuredData::StringSP CreateStructuredString() const;
3572c1f46dcSZachary Turner };
3582c1f46dcSZachary Turner 
3592c1f46dcSZachary Turner class PythonInteger : public PythonObject
3602c1f46dcSZachary Turner {
3612c1f46dcSZachary Turner public:
3622c1f46dcSZachary Turner     PythonInteger();
36387f47729SZachary Turner     explicit PythonInteger(int64_t value);
364f8b22f8fSZachary Turner     PythonInteger(PyRefType type, PyObject *o);
365f8b22f8fSZachary Turner     PythonInteger(const PythonInteger &object);
366edb35d95SEugene Zelenko 
367f8b22f8fSZachary Turner     ~PythonInteger() override;
3682c1f46dcSZachary Turner 
36922c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
37022c8efcdSZachary Turner 
371f8b22f8fSZachary Turner     // Bring in the no-argument base class version
372f8b22f8fSZachary Turner     using PythonObject::Reset;
373f8b22f8fSZachary Turner 
374f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3752c1f46dcSZachary Turner 
3762c1f46dcSZachary Turner     int64_t GetInteger() const;
3772c1f46dcSZachary Turner 
3782c1f46dcSZachary Turner     void
3792c1f46dcSZachary Turner     SetInteger (int64_t value);
3802c1f46dcSZachary Turner 
3812c1f46dcSZachary Turner     StructuredData::IntegerSP CreateStructuredInteger() const;
3822c1f46dcSZachary Turner };
3832c1f46dcSZachary Turner 
3842c1f46dcSZachary Turner class PythonList : public PythonObject
3852c1f46dcSZachary Turner {
3862c1f46dcSZachary Turner public:
387a1405147SZachary Turner     PythonList() {}
38887f47729SZachary Turner     explicit PythonList(PyInitialValue value);
38987f47729SZachary Turner     explicit PythonList(int list_size);
390f8b22f8fSZachary Turner     PythonList(PyRefType type, PyObject *o);
391f8b22f8fSZachary Turner     PythonList(const PythonList &list);
392edb35d95SEugene Zelenko 
393f8b22f8fSZachary Turner     ~PythonList() override;
3942c1f46dcSZachary Turner 
39522c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
39622c8efcdSZachary Turner 
397f8b22f8fSZachary Turner     // Bring in the no-argument base class version
398f8b22f8fSZachary Turner     using PythonObject::Reset;
399f8b22f8fSZachary Turner 
400f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4012c1f46dcSZachary Turner 
4022c1f46dcSZachary Turner     uint32_t GetSize() const;
4032c1f46dcSZachary Turner 
4042c1f46dcSZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
4052c1f46dcSZachary Turner 
406f8b22f8fSZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
4072c1f46dcSZachary Turner 
408f8b22f8fSZachary Turner     void AppendItem(const PythonObject &object);
4092c1f46dcSZachary Turner 
4102c1f46dcSZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
4112c1f46dcSZachary Turner };
4122c1f46dcSZachary Turner 
413a1405147SZachary Turner class PythonTuple : public PythonObject
414a1405147SZachary Turner {
415a1405147SZachary Turner public:
416a1405147SZachary Turner     PythonTuple() {}
417a1405147SZachary Turner     explicit PythonTuple(PyInitialValue value);
418a1405147SZachary Turner     explicit PythonTuple(int tuple_size);
419a1405147SZachary Turner     PythonTuple(PyRefType type, PyObject *o);
420a1405147SZachary Turner     PythonTuple(const PythonTuple &tuple);
421a1405147SZachary Turner     PythonTuple(std::initializer_list<PythonObject> objects);
422a1405147SZachary Turner     PythonTuple(std::initializer_list<PyObject*> objects);
423a1405147SZachary Turner 
424a1405147SZachary Turner     ~PythonTuple() override;
425a1405147SZachary Turner 
426a1405147SZachary Turner     static bool Check(PyObject *py_obj);
427a1405147SZachary Turner 
428a1405147SZachary Turner     // Bring in the no-argument base class version
429a1405147SZachary Turner     using PythonObject::Reset;
430a1405147SZachary Turner 
431a1405147SZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
432a1405147SZachary Turner 
433a1405147SZachary Turner     uint32_t GetSize() const;
434a1405147SZachary Turner 
435a1405147SZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
436a1405147SZachary Turner 
437a1405147SZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
438a1405147SZachary Turner 
439a1405147SZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
440a1405147SZachary Turner };
441a1405147SZachary Turner 
4422c1f46dcSZachary Turner class PythonDictionary : public PythonObject
4432c1f46dcSZachary Turner {
4442c1f46dcSZachary Turner public:
445a1405147SZachary Turner     PythonDictionary() {}
44687f47729SZachary Turner     explicit PythonDictionary(PyInitialValue value);
447f8b22f8fSZachary Turner     PythonDictionary(PyRefType type, PyObject *o);
448f8b22f8fSZachary Turner     PythonDictionary(const PythonDictionary &dict);
449edb35d95SEugene Zelenko 
450f8b22f8fSZachary Turner     ~PythonDictionary() override;
4512c1f46dcSZachary Turner 
45222c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
45322c8efcdSZachary Turner 
454f8b22f8fSZachary Turner     // Bring in the no-argument base class version
455f8b22f8fSZachary Turner     using PythonObject::Reset;
456f8b22f8fSZachary Turner 
457f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4582c1f46dcSZachary Turner 
4592c1f46dcSZachary Turner     uint32_t GetSize() const;
4602c1f46dcSZachary Turner 
461f8b22f8fSZachary Turner     PythonList GetKeys() const;
4622c1f46dcSZachary Turner 
463f8b22f8fSZachary Turner     PythonObject GetItemForKey(const PythonObject &key) const;
464f8b22f8fSZachary Turner     void SetItemForKey(const PythonObject &key, const PythonObject &value);
4652c1f46dcSZachary Turner 
4662c1f46dcSZachary Turner     StructuredData::DictionarySP CreateStructuredDictionary() const;
4672c1f46dcSZachary Turner };
46887f47729SZachary Turner 
4697841efbbSZachary Turner class PythonModule : public PythonObject
4707841efbbSZachary Turner {
4717841efbbSZachary Turner   public:
4727841efbbSZachary Turner     PythonModule();
4737841efbbSZachary Turner     PythonModule(PyRefType type, PyObject *o);
4747841efbbSZachary Turner     PythonModule(const PythonModule &dict);
4757841efbbSZachary Turner 
4767841efbbSZachary Turner     ~PythonModule() override;
4777841efbbSZachary Turner 
4787841efbbSZachary Turner     static bool Check(PyObject *py_obj);
4797841efbbSZachary Turner 
480a1405147SZachary Turner     static PythonModule
481a1405147SZachary Turner     BuiltinsModule();
482a1405147SZachary Turner 
483a1405147SZachary Turner     static PythonModule
484a1405147SZachary Turner     MainModule();
485a1405147SZachary Turner 
486a1405147SZachary Turner     static PythonModule
487a1405147SZachary Turner     AddModule(llvm::StringRef module);
4887841efbbSZachary Turner 
4892419f1d5SZachary Turner     static PythonModule
4902419f1d5SZachary Turner     ImportModule(llvm::StringRef module);
4912419f1d5SZachary Turner 
4927841efbbSZachary Turner     // Bring in the no-argument base class version
4937841efbbSZachary Turner     using PythonObject::Reset;
4947841efbbSZachary Turner 
4957841efbbSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4967841efbbSZachary Turner 
4977841efbbSZachary Turner     PythonDictionary GetDictionary() const;
4987841efbbSZachary Turner };
4997841efbbSZachary Turner 
500a1405147SZachary Turner class PythonCallable : public PythonObject
501a1405147SZachary Turner {
502a1405147SZachary Turner public:
503b58fb2f4SZachary Turner     struct ArgInfo {
504b58fb2f4SZachary Turner         size_t count;
505b58fb2f4SZachary Turner         bool has_varargs : 1;
506b58fb2f4SZachary Turner         bool has_kwargs : 1;
507b58fb2f4SZachary Turner     };
508b58fb2f4SZachary Turner 
509a1405147SZachary Turner     PythonCallable();
510a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
511a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
512a1405147SZachary Turner 
513a1405147SZachary Turner     ~PythonCallable() override;
514a1405147SZachary Turner 
515a1405147SZachary Turner     static bool
516a1405147SZachary Turner     Check(PyObject *py_obj);
517a1405147SZachary Turner 
518a1405147SZachary Turner     // Bring in the no-argument base class version
519a1405147SZachary Turner     using PythonObject::Reset;
520a1405147SZachary Turner 
521a1405147SZachary Turner     void
522a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
523a1405147SZachary Turner 
524b58fb2f4SZachary Turner     ArgInfo
525b58fb2f4SZachary Turner     GetNumArguments() const;
526b58fb2f4SZachary Turner 
527b58fb2f4SZachary Turner     PythonObject
528b58fb2f4SZachary Turner     operator ()();
529a1405147SZachary Turner 
530a1405147SZachary Turner     PythonObject
531a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
532a1405147SZachary Turner 
533a1405147SZachary Turner     PythonObject
534a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
535b58fb2f4SZachary Turner 
536b58fb2f4SZachary Turner     template<typename Arg, typename... Args>
537b58fb2f4SZachary Turner     PythonObject
538b58fb2f4SZachary Turner     operator ()(const Arg &arg, Args... args)
539b58fb2f4SZachary Turner     {
540b58fb2f4SZachary Turner         return operator()({ arg, args... });
541b58fb2f4SZachary Turner     }
542a1405147SZachary Turner };
543a1405147SZachary Turner 
544a1405147SZachary Turner 
5459c40264fSZachary Turner class PythonFile : public PythonObject
5469c40264fSZachary Turner {
5479c40264fSZachary Turner   public:
54832064024SZachary Turner     PythonFile();
549eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
550eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
5519c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
552edb35d95SEugene Zelenko 
5539c40264fSZachary Turner     ~PythonFile() override;
5549c40264fSZachary Turner 
5559c40264fSZachary Turner     static bool Check(PyObject *py_obj);
5569c40264fSZachary Turner 
5579c40264fSZachary Turner     using PythonObject::Reset;
5589c40264fSZachary Turner 
5599c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
5609c40264fSZachary Turner     void Reset(File &file, const char *mode);
561eda01c31SZachary Turner 
562744959b9SEnrico Granata     static uint32_t GetOptionsFromMode(llvm::StringRef mode);
563744959b9SEnrico Granata 
564eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
5659c40264fSZachary Turner };
5669c40264fSZachary Turner 
5672c1f46dcSZachary Turner } // namespace lldb_private
5682c1f46dcSZachary Turner 
569a281b42bSZachary Turner #endif
570a281b42bSZachary Turner 
5712c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
572