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 
26*5a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h"
27*5a72c02bSZachary Turner 
282c1f46dcSZachary Turner namespace lldb_private {
29edb35d95SEugene Zelenko 
30*5a72c02bSZachary 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,
77*5a72c02bSZachary Turner #if PY_MAJOR_VERSION >= 3
78*5a72c02bSZachary Turner     Bytes,
79*5a72c02bSZachary Turner #else
80*5a72c02bSZachary Turner     Bytes = String,
81*5a72c02bSZachary Turner #endif
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 
267*5a72c02bSZachary Turner class PythonBytes : public PythonObject
268*5a72c02bSZachary Turner {
269*5a72c02bSZachary Turner public:
270*5a72c02bSZachary Turner     PythonBytes();
271*5a72c02bSZachary Turner     explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
272*5a72c02bSZachary Turner     PythonBytes(const uint8_t *bytes, size_t length);
273*5a72c02bSZachary Turner     PythonBytes(PyRefType type, PyObject *o);
274*5a72c02bSZachary Turner     PythonBytes(const PythonBytes &object);
275*5a72c02bSZachary Turner 
276*5a72c02bSZachary Turner     ~PythonBytes() override;
277*5a72c02bSZachary Turner 
278*5a72c02bSZachary Turner     static bool
279*5a72c02bSZachary Turner     Check(PyObject *py_obj);
280*5a72c02bSZachary Turner 
281*5a72c02bSZachary Turner     // Bring in the no-argument base class version
282*5a72c02bSZachary Turner     using PythonObject::Reset;
283*5a72c02bSZachary Turner 
284*5a72c02bSZachary Turner     void
285*5a72c02bSZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
286*5a72c02bSZachary Turner 
287*5a72c02bSZachary Turner     llvm::ArrayRef<uint8_t>
288*5a72c02bSZachary Turner     GetBytes() const;
289*5a72c02bSZachary Turner 
290*5a72c02bSZachary Turner     size_t
291*5a72c02bSZachary Turner     GetSize() const;
292*5a72c02bSZachary Turner 
293*5a72c02bSZachary Turner     void
294*5a72c02bSZachary Turner     SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
295*5a72c02bSZachary Turner 
296*5a72c02bSZachary Turner     StructuredData::StringSP
297*5a72c02bSZachary Turner     CreateStructuredString() const;
298*5a72c02bSZachary Turner };
299*5a72c02bSZachary Turner 
3002c1f46dcSZachary Turner class PythonString : public PythonObject
3012c1f46dcSZachary Turner {
3022c1f46dcSZachary Turner public:
3032c1f46dcSZachary Turner     PythonString();
304f8b22f8fSZachary Turner     explicit PythonString(llvm::StringRef string);
305f8b22f8fSZachary Turner     explicit PythonString(const char *string);
30687f47729SZachary Turner     PythonString(PyRefType type, PyObject *o);
30787f47729SZachary Turner     PythonString(const PythonString &object);
308edb35d95SEugene Zelenko 
309f8b22f8fSZachary Turner     ~PythonString() override;
3102c1f46dcSZachary Turner 
31122c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
31222c8efcdSZachary Turner 
313f8b22f8fSZachary Turner     // Bring in the no-argument base class version
314f8b22f8fSZachary Turner     using PythonObject::Reset;
315f8b22f8fSZachary Turner 
316f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3172c1f46dcSZachary Turner 
3182c1f46dcSZachary Turner     llvm::StringRef
3192c1f46dcSZachary Turner     GetString() const;
3202c1f46dcSZachary Turner 
3212c1f46dcSZachary Turner     size_t
3222c1f46dcSZachary Turner     GetSize() const;
3232c1f46dcSZachary Turner 
3242c1f46dcSZachary Turner     void SetString(llvm::StringRef string);
3252c1f46dcSZachary Turner 
3262c1f46dcSZachary Turner     StructuredData::StringSP CreateStructuredString() const;
3272c1f46dcSZachary Turner };
3282c1f46dcSZachary Turner 
3292c1f46dcSZachary Turner class PythonInteger : public PythonObject
3302c1f46dcSZachary Turner {
3312c1f46dcSZachary Turner public:
3322c1f46dcSZachary Turner     PythonInteger();
33387f47729SZachary Turner     explicit PythonInteger(int64_t value);
334f8b22f8fSZachary Turner     PythonInteger(PyRefType type, PyObject *o);
335f8b22f8fSZachary Turner     PythonInteger(const PythonInteger &object);
336edb35d95SEugene Zelenko 
337f8b22f8fSZachary Turner     ~PythonInteger() override;
3382c1f46dcSZachary Turner 
33922c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
34022c8efcdSZachary Turner 
341f8b22f8fSZachary Turner     // Bring in the no-argument base class version
342f8b22f8fSZachary Turner     using PythonObject::Reset;
343f8b22f8fSZachary Turner 
344f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3452c1f46dcSZachary Turner 
3462c1f46dcSZachary Turner     int64_t GetInteger() const;
3472c1f46dcSZachary Turner 
3482c1f46dcSZachary Turner     void
3492c1f46dcSZachary Turner     SetInteger (int64_t value);
3502c1f46dcSZachary Turner 
3512c1f46dcSZachary Turner     StructuredData::IntegerSP CreateStructuredInteger() const;
3522c1f46dcSZachary Turner };
3532c1f46dcSZachary Turner 
3542c1f46dcSZachary Turner class PythonList : public PythonObject
3552c1f46dcSZachary Turner {
3562c1f46dcSZachary Turner public:
357a1405147SZachary Turner     PythonList() {}
35887f47729SZachary Turner     explicit PythonList(PyInitialValue value);
35987f47729SZachary Turner     explicit PythonList(int list_size);
360f8b22f8fSZachary Turner     PythonList(PyRefType type, PyObject *o);
361f8b22f8fSZachary Turner     PythonList(const PythonList &list);
362edb35d95SEugene Zelenko 
363f8b22f8fSZachary Turner     ~PythonList() override;
3642c1f46dcSZachary Turner 
36522c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
36622c8efcdSZachary Turner 
367f8b22f8fSZachary Turner     // Bring in the no-argument base class version
368f8b22f8fSZachary Turner     using PythonObject::Reset;
369f8b22f8fSZachary Turner 
370f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3712c1f46dcSZachary Turner 
3722c1f46dcSZachary Turner     uint32_t GetSize() const;
3732c1f46dcSZachary Turner 
3742c1f46dcSZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
3752c1f46dcSZachary Turner 
376f8b22f8fSZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
3772c1f46dcSZachary Turner 
378f8b22f8fSZachary Turner     void AppendItem(const PythonObject &object);
3792c1f46dcSZachary Turner 
3802c1f46dcSZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
3812c1f46dcSZachary Turner };
3822c1f46dcSZachary Turner 
383a1405147SZachary Turner class PythonTuple : public PythonObject
384a1405147SZachary Turner {
385a1405147SZachary Turner public:
386a1405147SZachary Turner     PythonTuple() {}
387a1405147SZachary Turner     explicit PythonTuple(PyInitialValue value);
388a1405147SZachary Turner     explicit PythonTuple(int tuple_size);
389a1405147SZachary Turner     PythonTuple(PyRefType type, PyObject *o);
390a1405147SZachary Turner     PythonTuple(const PythonTuple &tuple);
391a1405147SZachary Turner     PythonTuple(std::initializer_list<PythonObject> objects);
392a1405147SZachary Turner     PythonTuple(std::initializer_list<PyObject*> objects);
393a1405147SZachary Turner 
394a1405147SZachary Turner     ~PythonTuple() override;
395a1405147SZachary Turner 
396a1405147SZachary Turner     static bool Check(PyObject *py_obj);
397a1405147SZachary Turner 
398a1405147SZachary Turner     // Bring in the no-argument base class version
399a1405147SZachary Turner     using PythonObject::Reset;
400a1405147SZachary Turner 
401a1405147SZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
402a1405147SZachary Turner 
403a1405147SZachary Turner     uint32_t GetSize() const;
404a1405147SZachary Turner 
405a1405147SZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
406a1405147SZachary Turner 
407a1405147SZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
408a1405147SZachary Turner 
409a1405147SZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
410a1405147SZachary Turner };
411a1405147SZachary Turner 
4122c1f46dcSZachary Turner class PythonDictionary : public PythonObject
4132c1f46dcSZachary Turner {
4142c1f46dcSZachary Turner public:
415a1405147SZachary Turner     PythonDictionary() {}
41687f47729SZachary Turner     explicit PythonDictionary(PyInitialValue value);
417f8b22f8fSZachary Turner     PythonDictionary(PyRefType type, PyObject *o);
418f8b22f8fSZachary Turner     PythonDictionary(const PythonDictionary &dict);
419edb35d95SEugene Zelenko 
420f8b22f8fSZachary Turner     ~PythonDictionary() override;
4212c1f46dcSZachary Turner 
42222c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
42322c8efcdSZachary Turner 
424f8b22f8fSZachary Turner     // Bring in the no-argument base class version
425f8b22f8fSZachary Turner     using PythonObject::Reset;
426f8b22f8fSZachary Turner 
427f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4282c1f46dcSZachary Turner 
4292c1f46dcSZachary Turner     uint32_t GetSize() const;
4302c1f46dcSZachary Turner 
431f8b22f8fSZachary Turner     PythonList GetKeys() const;
4322c1f46dcSZachary Turner 
433f8b22f8fSZachary Turner     PythonObject GetItemForKey(const PythonObject &key) const;
434f8b22f8fSZachary Turner     void SetItemForKey(const PythonObject &key, const PythonObject &value);
4352c1f46dcSZachary Turner 
4362c1f46dcSZachary Turner     StructuredData::DictionarySP CreateStructuredDictionary() const;
4372c1f46dcSZachary Turner };
43887f47729SZachary Turner 
4397841efbbSZachary Turner class PythonModule : public PythonObject
4407841efbbSZachary Turner {
4417841efbbSZachary Turner   public:
4427841efbbSZachary Turner     PythonModule();
4437841efbbSZachary Turner     PythonModule(PyRefType type, PyObject *o);
4447841efbbSZachary Turner     PythonModule(const PythonModule &dict);
4457841efbbSZachary Turner 
4467841efbbSZachary Turner     ~PythonModule() override;
4477841efbbSZachary Turner 
4487841efbbSZachary Turner     static bool Check(PyObject *py_obj);
4497841efbbSZachary Turner 
450a1405147SZachary Turner     static PythonModule
451a1405147SZachary Turner     BuiltinsModule();
452a1405147SZachary Turner 
453a1405147SZachary Turner     static PythonModule
454a1405147SZachary Turner     MainModule();
455a1405147SZachary Turner 
456a1405147SZachary Turner     static PythonModule
457a1405147SZachary Turner     AddModule(llvm::StringRef module);
4587841efbbSZachary Turner 
4592419f1d5SZachary Turner     static PythonModule
4602419f1d5SZachary Turner     ImportModule(llvm::StringRef module);
4612419f1d5SZachary Turner 
4627841efbbSZachary Turner     // Bring in the no-argument base class version
4637841efbbSZachary Turner     using PythonObject::Reset;
4647841efbbSZachary Turner 
4657841efbbSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4667841efbbSZachary Turner 
4677841efbbSZachary Turner     PythonDictionary GetDictionary() const;
4687841efbbSZachary Turner };
4697841efbbSZachary Turner 
470a1405147SZachary Turner class PythonCallable : public PythonObject
471a1405147SZachary Turner {
472a1405147SZachary Turner public:
473b58fb2f4SZachary Turner     struct ArgInfo {
474b58fb2f4SZachary Turner         size_t count;
475b58fb2f4SZachary Turner         bool has_varargs : 1;
476b58fb2f4SZachary Turner         bool has_kwargs : 1;
477b58fb2f4SZachary Turner     };
478b58fb2f4SZachary Turner 
479a1405147SZachary Turner     PythonCallable();
480a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
481a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
482a1405147SZachary Turner 
483a1405147SZachary Turner     ~PythonCallable() override;
484a1405147SZachary Turner 
485a1405147SZachary Turner     static bool
486a1405147SZachary Turner     Check(PyObject *py_obj);
487a1405147SZachary Turner 
488a1405147SZachary Turner     // Bring in the no-argument base class version
489a1405147SZachary Turner     using PythonObject::Reset;
490a1405147SZachary Turner 
491a1405147SZachary Turner     void
492a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
493a1405147SZachary Turner 
494b58fb2f4SZachary Turner     ArgInfo
495b58fb2f4SZachary Turner     GetNumArguments() const;
496b58fb2f4SZachary Turner 
497b58fb2f4SZachary Turner     PythonObject
498b58fb2f4SZachary Turner     operator ()();
499a1405147SZachary Turner 
500a1405147SZachary Turner     PythonObject
501a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
502a1405147SZachary Turner 
503a1405147SZachary Turner     PythonObject
504a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
505b58fb2f4SZachary Turner 
506b58fb2f4SZachary Turner     template<typename Arg, typename... Args>
507b58fb2f4SZachary Turner     PythonObject
508b58fb2f4SZachary Turner     operator ()(const Arg &arg, Args... args)
509b58fb2f4SZachary Turner     {
510b58fb2f4SZachary Turner         return operator()({ arg, args... });
511b58fb2f4SZachary Turner     }
512a1405147SZachary Turner };
513a1405147SZachary Turner 
514a1405147SZachary Turner 
5159c40264fSZachary Turner class PythonFile : public PythonObject
5169c40264fSZachary Turner {
5179c40264fSZachary Turner   public:
51832064024SZachary Turner     PythonFile();
519eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
520eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
5219c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
522edb35d95SEugene Zelenko 
5239c40264fSZachary Turner     ~PythonFile() override;
5249c40264fSZachary Turner 
5259c40264fSZachary Turner     static bool Check(PyObject *py_obj);
5269c40264fSZachary Turner 
5279c40264fSZachary Turner     using PythonObject::Reset;
5289c40264fSZachary Turner 
5299c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
5309c40264fSZachary Turner     void Reset(File &file, const char *mode);
531eda01c31SZachary Turner 
532eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
5339c40264fSZachary Turner };
5349c40264fSZachary Turner 
5352c1f46dcSZachary Turner } // namespace lldb_private
5362c1f46dcSZachary Turner 
537a281b42bSZachary Turner #endif
538a281b42bSZachary Turner 
5392c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
540