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,
78f9d6d204SZachary 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 
297f9d6d204SZachary Turner class PythonByteArray : public PythonObject
298f9d6d204SZachary Turner {
299f9d6d204SZachary Turner public:
300f9d6d204SZachary Turner     PythonByteArray();
301f9d6d204SZachary Turner     explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
302f9d6d204SZachary Turner     PythonByteArray(const uint8_t *bytes, size_t length);
303f9d6d204SZachary Turner     PythonByteArray(PyRefType type, PyObject *o);
304f9d6d204SZachary Turner     PythonByteArray(const PythonBytes &object);
305f9d6d204SZachary Turner 
306f9d6d204SZachary Turner     ~PythonByteArray() override;
307f9d6d204SZachary Turner 
308f9d6d204SZachary Turner     static bool
309f9d6d204SZachary Turner     Check(PyObject *py_obj);
310f9d6d204SZachary Turner 
311f9d6d204SZachary Turner     // Bring in the no-argument base class version
312f9d6d204SZachary Turner     using PythonObject::Reset;
313f9d6d204SZachary Turner 
314f9d6d204SZachary Turner     void
315f9d6d204SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
316f9d6d204SZachary Turner 
317f9d6d204SZachary Turner     llvm::ArrayRef<uint8_t>
318f9d6d204SZachary Turner     GetBytes() const;
319f9d6d204SZachary Turner 
320f9d6d204SZachary Turner     size_t
321f9d6d204SZachary Turner     GetSize() const;
322f9d6d204SZachary Turner 
323f9d6d204SZachary Turner     void
324f9d6d204SZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
325f9d6d204SZachary Turner 
326f9d6d204SZachary Turner     StructuredData::StringSP
327f9d6d204SZachary Turner     CreateStructuredString() const;
328f9d6d204SZachary Turner };
329f9d6d204SZachary 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;
505*a5d6765cSEnrico Granata         bool is_bound_method : 1;
506b58fb2f4SZachary Turner         bool has_varargs : 1;
507b58fb2f4SZachary Turner         bool has_kwargs : 1;
508b58fb2f4SZachary Turner     };
509b58fb2f4SZachary Turner 
510a1405147SZachary Turner     PythonCallable();
511a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
512a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
513a1405147SZachary Turner 
514a1405147SZachary Turner     ~PythonCallable() override;
515a1405147SZachary Turner 
516a1405147SZachary Turner     static bool
517a1405147SZachary Turner     Check(PyObject *py_obj);
518a1405147SZachary Turner 
519a1405147SZachary Turner     // Bring in the no-argument base class version
520a1405147SZachary Turner     using PythonObject::Reset;
521a1405147SZachary Turner 
522a1405147SZachary Turner     void
523a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
524a1405147SZachary Turner 
525b58fb2f4SZachary Turner     ArgInfo
526b58fb2f4SZachary Turner     GetNumArguments() const;
527b58fb2f4SZachary Turner 
528b58fb2f4SZachary Turner     PythonObject
529b58fb2f4SZachary Turner     operator ()();
530a1405147SZachary Turner 
531a1405147SZachary Turner     PythonObject
532a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
533a1405147SZachary Turner 
534a1405147SZachary Turner     PythonObject
535a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
536b58fb2f4SZachary Turner 
537b58fb2f4SZachary Turner     template<typename Arg, typename... Args>
538b58fb2f4SZachary Turner     PythonObject
539b58fb2f4SZachary Turner     operator ()(const Arg &arg, Args... args)
540b58fb2f4SZachary Turner     {
541b58fb2f4SZachary Turner         return operator()({ arg, args... });
542b58fb2f4SZachary Turner     }
543a1405147SZachary Turner };
544a1405147SZachary Turner 
545a1405147SZachary Turner 
5469c40264fSZachary Turner class PythonFile : public PythonObject
5479c40264fSZachary Turner {
5489c40264fSZachary Turner   public:
54932064024SZachary Turner     PythonFile();
550eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
551eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
5529c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
553edb35d95SEugene Zelenko 
5549c40264fSZachary Turner     ~PythonFile() override;
5559c40264fSZachary Turner 
5569c40264fSZachary Turner     static bool Check(PyObject *py_obj);
5579c40264fSZachary Turner 
5589c40264fSZachary Turner     using PythonObject::Reset;
5599c40264fSZachary Turner 
5609c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
5619c40264fSZachary Turner     void Reset(File &file, const char *mode);
562eda01c31SZachary Turner 
563744959b9SEnrico Granata     static uint32_t GetOptionsFromMode(llvm::StringRef mode);
564744959b9SEnrico Granata 
565eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
5669c40264fSZachary Turner };
5679c40264fSZachary Turner 
5682c1f46dcSZachary Turner } // namespace lldb_private
5692c1f46dcSZachary Turner 
570a281b42bSZachary Turner #endif
571a281b42bSZachary Turner 
5722c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
573