1edb35d95SEugene Zelenko //===-- PythonDataObjects.h--------------------------------------*- C++ -*-===//
22c1f46dcSZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62c1f46dcSZachary Turner //
72c1f46dcSZachary Turner //===----------------------------------------------------------------------===//
82c1f46dcSZachary Turner 
92c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
102c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
112c1f46dcSZachary Turner 
12d68983e3SPavel Labath #ifndef LLDB_DISABLE_PYTHON
13d68983e3SPavel Labath 
1441de9a97SKate Stone // LLDB Python header must be included first
1541de9a97SKate Stone #include "lldb-python.h"
1641de9a97SKate Stone 
179c40264fSZachary Turner #include "lldb/Host/File.h"
18f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h"
192c1f46dcSZachary Turner 
205a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h"
215a72c02bSZachary Turner 
222c1f46dcSZachary Turner namespace lldb_private {
23edb35d95SEugene Zelenko 
245a72c02bSZachary Turner class PythonBytes;
252c1f46dcSZachary Turner class PythonString;
262c1f46dcSZachary Turner class PythonList;
272c1f46dcSZachary Turner class PythonDictionary;
282c1f46dcSZachary Turner class PythonInteger;
292c1f46dcSZachary Turner 
30b9c1b51eSKate Stone class StructuredPythonObject : public StructuredData::Generic {
312c1f46dcSZachary Turner public:
32b9c1b51eSKate Stone   StructuredPythonObject() : StructuredData::Generic() {}
332c1f46dcSZachary Turner 
34b9c1b51eSKate Stone   StructuredPythonObject(void *obj) : StructuredData::Generic(obj) {
352c1f46dcSZachary Turner     Py_XINCREF(GetValue());
362c1f46dcSZachary Turner   }
372c1f46dcSZachary Turner 
38b9c1b51eSKate Stone   ~StructuredPythonObject() override {
392c1f46dcSZachary Turner     if (Py_IsInitialized())
402c1f46dcSZachary Turner       Py_XDECREF(GetValue());
412c1f46dcSZachary Turner     SetValue(nullptr);
422c1f46dcSZachary Turner   }
432c1f46dcSZachary Turner 
44b9c1b51eSKate Stone   bool IsValid() const override { return GetValue() && GetValue() != Py_None; }
452c1f46dcSZachary Turner 
462783d817SJonas Devlieghere   void Serialize(llvm::json::OStream &s) const override;
472c1f46dcSZachary Turner 
482c1f46dcSZachary Turner private:
492c1f46dcSZachary Turner   DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
502c1f46dcSZachary Turner };
512c1f46dcSZachary Turner 
52b9c1b51eSKate Stone enum class PyObjectType {
532c1f46dcSZachary Turner   Unknown,
542c1f46dcSZachary Turner   None,
55b81d715cSTatyana Krasnukha   Boolean,
562c1f46dcSZachary Turner   Integer,
572c1f46dcSZachary Turner   Dictionary,
582c1f46dcSZachary Turner   List,
599c40264fSZachary Turner   String,
605a72c02bSZachary Turner   Bytes,
61f9d6d204SZachary Turner   ByteArray,
627841efbbSZachary Turner   Module,
63a1405147SZachary Turner   Callable,
64a1405147SZachary Turner   Tuple,
659c40264fSZachary Turner   File
662c1f46dcSZachary Turner };
672c1f46dcSZachary Turner 
68b9c1b51eSKate Stone enum class PyRefType {
69f8b22f8fSZachary Turner   Borrowed, // We are not given ownership of the incoming PyObject.
70f8b22f8fSZachary Turner             // We cannot safely hold it without calling Py_INCREF.
71f8b22f8fSZachary Turner   Owned     // We have ownership of the incoming PyObject.  We should
72f8b22f8fSZachary Turner             // not call Py_INCREF.
73f8b22f8fSZachary Turner };
74f8b22f8fSZachary Turner 
75b9c1b51eSKate Stone enum class PyInitialValue { Invalid, Empty };
76f8b22f8fSZachary Turner 
77b9c1b51eSKate Stone class PythonObject {
782c1f46dcSZachary Turner public:
79b9c1b51eSKate Stone   PythonObject() : m_py_obj(nullptr) {}
802c1f46dcSZachary Turner 
81b9c1b51eSKate Stone   PythonObject(PyRefType type, PyObject *py_obj) : m_py_obj(nullptr) {
82f8b22f8fSZachary Turner     Reset(type, py_obj);
832c1f46dcSZachary Turner   }
842c1f46dcSZachary Turner 
85b9c1b51eSKate Stone   PythonObject(const PythonObject &rhs) : m_py_obj(nullptr) { Reset(rhs); }
862c1f46dcSZachary Turner 
87b9c1b51eSKate Stone   virtual ~PythonObject() { Reset(); }
882c1f46dcSZachary Turner 
89b9c1b51eSKate Stone   void Reset() {
90f8b22f8fSZachary Turner     // Avoid calling the virtual method since it's not necessary
91f8b22f8fSZachary Turner     // to actually validate the type of the PyObject if we're
92f8b22f8fSZachary Turner     // just setting to null.
932c1f46dcSZachary Turner     if (Py_IsInitialized())
942c1f46dcSZachary Turner       Py_XDECREF(m_py_obj);
95f8b22f8fSZachary Turner     m_py_obj = nullptr;
962c1f46dcSZachary Turner   }
97f8b22f8fSZachary Turner 
98b9c1b51eSKate Stone   void Reset(const PythonObject &rhs) {
99f8b22f8fSZachary Turner     // Avoid calling the virtual method if it's not necessary
100f8b22f8fSZachary Turner     // to actually validate the type of the PyObject.
10160c24f70SZachary Turner     if (!rhs.IsValid())
102f8b22f8fSZachary Turner       Reset();
103f8b22f8fSZachary Turner     else
104f8b22f8fSZachary Turner       Reset(PyRefType::Borrowed, rhs.m_py_obj);
105f8b22f8fSZachary Turner   }
106f8b22f8fSZachary Turner 
107f8b22f8fSZachary Turner   // PythonObject is implicitly convertible to PyObject *, which will call the
108f8b22f8fSZachary Turner   // wrong overload.  We want to explicitly disallow this, since a PyObject
109f8b22f8fSZachary Turner   // *always* owns its reference.  Therefore the overload which takes a
110f8b22f8fSZachary Turner   // PyRefType doesn't make sense, and the copy constructor should be used.
111b9c1b51eSKate Stone   void Reset(PyRefType type, const PythonObject &ref) = delete;
112f8b22f8fSZachary Turner 
113b9c1b51eSKate Stone   virtual void Reset(PyRefType type, PyObject *py_obj) {
114f8b22f8fSZachary Turner     if (py_obj == m_py_obj)
115f8b22f8fSZachary Turner       return;
116f8b22f8fSZachary Turner 
117f8b22f8fSZachary Turner     if (Py_IsInitialized())
118f8b22f8fSZachary Turner       Py_XDECREF(m_py_obj);
119f8b22f8fSZachary Turner 
120f8b22f8fSZachary Turner     m_py_obj = py_obj;
121f8b22f8fSZachary Turner 
122f8b22f8fSZachary Turner     // If this is a borrowed reference, we need to convert it to
123f8b22f8fSZachary Turner     // an owned reference by incrementing it.  If it is an owned
124f8b22f8fSZachary Turner     // reference (for example the caller allocated it with PyDict_New()
125f8b22f8fSZachary Turner     // then we must *not* increment it.
126f8b22f8fSZachary Turner     if (Py_IsInitialized() && type == PyRefType::Borrowed)
127f8b22f8fSZachary Turner       Py_XINCREF(m_py_obj);
1282c1f46dcSZachary Turner   }
1292c1f46dcSZachary Turner 
130b9c1b51eSKate Stone   void Dump() const {
1312c1f46dcSZachary Turner     if (m_py_obj)
1322c1f46dcSZachary Turner       _PyObject_Dump(m_py_obj);
1332c1f46dcSZachary Turner     else
1342c1f46dcSZachary Turner       puts("NULL");
1352c1f46dcSZachary Turner   }
1362c1f46dcSZachary Turner 
137b9c1b51eSKate Stone   void Dump(Stream &strm) const;
1382c1f46dcSZachary Turner 
139b9c1b51eSKate Stone   PyObject *get() const { return m_py_obj; }
1402c1f46dcSZachary Turner 
141b9c1b51eSKate Stone   PyObject *release() {
14260c24f70SZachary Turner     PyObject *result = m_py_obj;
14360c24f70SZachary Turner     m_py_obj = nullptr;
14460c24f70SZachary Turner     return result;
14560c24f70SZachary Turner   }
14660c24f70SZachary Turner 
147b9c1b51eSKate Stone   PythonObject &operator=(const PythonObject &other) {
148f8b22f8fSZachary Turner     Reset(PyRefType::Borrowed, other.get());
149f8b22f8fSZachary Turner     return *this;
1502c1f46dcSZachary Turner   }
1512c1f46dcSZachary Turner 
152b9c1b51eSKate Stone   PyObjectType GetObjectType() const;
1537841efbbSZachary Turner 
154b9c1b51eSKate Stone   PythonString Repr() const;
1557841efbbSZachary Turner 
156b9c1b51eSKate Stone   PythonString Str() const;
1577841efbbSZachary Turner 
158b9c1b51eSKate Stone   static PythonObject ResolveNameWithDictionary(llvm::StringRef name,
159b9c1b51eSKate Stone                                                 const PythonDictionary &dict);
1607841efbbSZachary Turner 
161b58fb2f4SZachary Turner   template <typename T>
162b9c1b51eSKate Stone   static T ResolveNameWithDictionary(llvm::StringRef name,
163b9c1b51eSKate Stone                                      const PythonDictionary &dict) {
164b58fb2f4SZachary Turner     return ResolveNameWithDictionary(name, dict).AsType<T>();
165b58fb2f4SZachary Turner   }
166b58fb2f4SZachary Turner 
167b9c1b51eSKate Stone   PythonObject ResolveName(llvm::StringRef name) const;
1687841efbbSZachary Turner 
169b9c1b51eSKate Stone   template <typename T> T ResolveName(llvm::StringRef name) const {
170b58fb2f4SZachary Turner     return ResolveName(name).AsType<T>();
171b58fb2f4SZachary Turner   }
172b58fb2f4SZachary Turner 
173b9c1b51eSKate Stone   bool HasAttribute(llvm::StringRef attribute) const;
1749c40264fSZachary Turner 
175b9c1b51eSKate Stone   PythonObject GetAttributeValue(llvm::StringRef attribute) const;
1767d6d218eSZachary Turner 
177b9c1b51eSKate Stone   bool IsValid() const;
178f8b22f8fSZachary Turner 
179b9c1b51eSKate Stone   bool IsAllocated() const;
180f8b22f8fSZachary Turner 
181b9c1b51eSKate Stone   bool IsNone() const;
1822c1f46dcSZachary Turner 
183b9c1b51eSKate Stone   template <typename T> T AsType() const {
1847d6d218eSZachary Turner     if (!T::Check(m_py_obj))
1857d6d218eSZachary Turner       return T();
1867d6d218eSZachary Turner     return T(PyRefType::Borrowed, m_py_obj);
1877d6d218eSZachary Turner   }
1887d6d218eSZachary Turner 
189b9c1b51eSKate Stone   StructuredData::ObjectSP CreateStructuredObject() const;
1902c1f46dcSZachary Turner 
1912c1f46dcSZachary Turner protected:
1922c1f46dcSZachary Turner   PyObject *m_py_obj;
1932c1f46dcSZachary Turner };
1942c1f46dcSZachary Turner 
195b9c1b51eSKate Stone class PythonBytes : public PythonObject {
1965a72c02bSZachary Turner public:
1975a72c02bSZachary Turner   PythonBytes();
1985a72c02bSZachary Turner   explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
1995a72c02bSZachary Turner   PythonBytes(const uint8_t *bytes, size_t length);
2005a72c02bSZachary Turner   PythonBytes(PyRefType type, PyObject *o);
2015a72c02bSZachary Turner 
2025a72c02bSZachary Turner   ~PythonBytes() override;
2035a72c02bSZachary Turner 
204b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
2055a72c02bSZachary Turner 
2065a72c02bSZachary Turner   // Bring in the no-argument base class version
2075a72c02bSZachary Turner   using PythonObject::Reset;
2085a72c02bSZachary Turner 
209b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
2105a72c02bSZachary Turner 
211b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
2125a72c02bSZachary Turner 
213b9c1b51eSKate Stone   size_t GetSize() const;
2145a72c02bSZachary Turner 
215b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2165a72c02bSZachary Turner 
217b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
2185a72c02bSZachary Turner };
2195a72c02bSZachary Turner 
220b9c1b51eSKate Stone class PythonByteArray : public PythonObject {
221f9d6d204SZachary Turner public:
222f9d6d204SZachary Turner   PythonByteArray();
223f9d6d204SZachary Turner   explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
224f9d6d204SZachary Turner   PythonByteArray(const uint8_t *bytes, size_t length);
225f9d6d204SZachary Turner   PythonByteArray(PyRefType type, PyObject *o);
226f9d6d204SZachary Turner   PythonByteArray(const PythonBytes &object);
227f9d6d204SZachary Turner 
228f9d6d204SZachary Turner   ~PythonByteArray() override;
229f9d6d204SZachary Turner 
230b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
231f9d6d204SZachary Turner 
232f9d6d204SZachary Turner   // Bring in the no-argument base class version
233f9d6d204SZachary Turner   using PythonObject::Reset;
234f9d6d204SZachary Turner 
235b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
236f9d6d204SZachary Turner 
237b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
238f9d6d204SZachary Turner 
239b9c1b51eSKate Stone   size_t GetSize() const;
240f9d6d204SZachary Turner 
241b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
242f9d6d204SZachary Turner 
243b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
244f9d6d204SZachary Turner };
245f9d6d204SZachary Turner 
246b9c1b51eSKate Stone class PythonString : public PythonObject {
2472c1f46dcSZachary Turner public:
2482c1f46dcSZachary Turner   PythonString();
249f8b22f8fSZachary Turner   explicit PythonString(llvm::StringRef string);
250f8b22f8fSZachary Turner   explicit PythonString(const char *string);
25187f47729SZachary Turner   PythonString(PyRefType type, PyObject *o);
252edb35d95SEugene Zelenko 
253f8b22f8fSZachary Turner   ~PythonString() override;
2542c1f46dcSZachary Turner 
25522c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
25622c8efcdSZachary Turner 
257f8b22f8fSZachary Turner   // Bring in the no-argument base class version
258f8b22f8fSZachary Turner   using PythonObject::Reset;
259f8b22f8fSZachary Turner 
260f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2612c1f46dcSZachary Turner 
262b9c1b51eSKate Stone   llvm::StringRef GetString() const;
2632c1f46dcSZachary Turner 
264b9c1b51eSKate Stone   size_t GetSize() const;
2652c1f46dcSZachary Turner 
2662c1f46dcSZachary Turner   void SetString(llvm::StringRef string);
2672c1f46dcSZachary Turner 
2682c1f46dcSZachary Turner   StructuredData::StringSP CreateStructuredString() const;
2692c1f46dcSZachary Turner };
2702c1f46dcSZachary Turner 
271b9c1b51eSKate Stone class PythonInteger : public PythonObject {
2722c1f46dcSZachary Turner public:
2732c1f46dcSZachary Turner   PythonInteger();
27487f47729SZachary Turner   explicit PythonInteger(int64_t value);
275f8b22f8fSZachary Turner   PythonInteger(PyRefType type, PyObject *o);
276edb35d95SEugene Zelenko 
277f8b22f8fSZachary Turner   ~PythonInteger() override;
2782c1f46dcSZachary Turner 
27922c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
28022c8efcdSZachary Turner 
281f8b22f8fSZachary Turner   // Bring in the no-argument base class version
282f8b22f8fSZachary Turner   using PythonObject::Reset;
283f8b22f8fSZachary Turner 
284f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2852c1f46dcSZachary Turner 
2862c1f46dcSZachary Turner   int64_t GetInteger() const;
2872c1f46dcSZachary Turner 
288b9c1b51eSKate Stone   void SetInteger(int64_t value);
2892c1f46dcSZachary Turner 
2902c1f46dcSZachary Turner   StructuredData::IntegerSP CreateStructuredInteger() const;
2912c1f46dcSZachary Turner };
2922c1f46dcSZachary Turner 
293b81d715cSTatyana Krasnukha class PythonBoolean : public PythonObject {
294b81d715cSTatyana Krasnukha public:
295b81d715cSTatyana Krasnukha   PythonBoolean() = default;
296b81d715cSTatyana Krasnukha   explicit PythonBoolean(bool value);
297b81d715cSTatyana Krasnukha   PythonBoolean(PyRefType type, PyObject *o);
298b81d715cSTatyana Krasnukha 
299b81d715cSTatyana Krasnukha   ~PythonBoolean() override = default;
300b81d715cSTatyana Krasnukha 
301b81d715cSTatyana Krasnukha   static bool Check(PyObject *py_obj);
302b81d715cSTatyana Krasnukha 
303b81d715cSTatyana Krasnukha   // Bring in the no-argument base class version
304b81d715cSTatyana Krasnukha   using PythonObject::Reset;
305b81d715cSTatyana Krasnukha 
306b81d715cSTatyana Krasnukha   void Reset(PyRefType type, PyObject *py_obj) override;
307b81d715cSTatyana Krasnukha 
308b81d715cSTatyana Krasnukha   bool GetValue() const;
309b81d715cSTatyana Krasnukha 
310b81d715cSTatyana Krasnukha   void SetValue(bool value);
311b81d715cSTatyana Krasnukha 
312b81d715cSTatyana Krasnukha   StructuredData::BooleanSP CreateStructuredBoolean() const;
313b81d715cSTatyana Krasnukha };
314b81d715cSTatyana Krasnukha 
315b9c1b51eSKate Stone class PythonList : public PythonObject {
3162c1f46dcSZachary Turner public:
317a1405147SZachary Turner   PythonList() {}
31887f47729SZachary Turner   explicit PythonList(PyInitialValue value);
31987f47729SZachary Turner   explicit PythonList(int list_size);
320f8b22f8fSZachary Turner   PythonList(PyRefType type, PyObject *o);
321edb35d95SEugene Zelenko 
322f8b22f8fSZachary Turner   ~PythonList() override;
3232c1f46dcSZachary Turner 
32422c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
32522c8efcdSZachary Turner 
326f8b22f8fSZachary Turner   // Bring in the no-argument base class version
327f8b22f8fSZachary Turner   using PythonObject::Reset;
328f8b22f8fSZachary Turner 
329f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3302c1f46dcSZachary Turner 
3312c1f46dcSZachary Turner   uint32_t GetSize() const;
3322c1f46dcSZachary Turner 
3332c1f46dcSZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
3342c1f46dcSZachary Turner 
335f8b22f8fSZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
3362c1f46dcSZachary Turner 
337f8b22f8fSZachary Turner   void AppendItem(const PythonObject &object);
3382c1f46dcSZachary Turner 
3392c1f46dcSZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
3402c1f46dcSZachary Turner };
3412c1f46dcSZachary Turner 
342b9c1b51eSKate Stone class PythonTuple : public PythonObject {
343a1405147SZachary Turner public:
344a1405147SZachary Turner   PythonTuple() {}
345a1405147SZachary Turner   explicit PythonTuple(PyInitialValue value);
346a1405147SZachary Turner   explicit PythonTuple(int tuple_size);
347a1405147SZachary Turner   PythonTuple(PyRefType type, PyObject *o);
348a1405147SZachary Turner   PythonTuple(std::initializer_list<PythonObject> objects);
349a1405147SZachary Turner   PythonTuple(std::initializer_list<PyObject *> objects);
350a1405147SZachary Turner 
351a1405147SZachary Turner   ~PythonTuple() override;
352a1405147SZachary Turner 
353a1405147SZachary Turner   static bool Check(PyObject *py_obj);
354a1405147SZachary Turner 
355a1405147SZachary Turner   // Bring in the no-argument base class version
356a1405147SZachary Turner   using PythonObject::Reset;
357a1405147SZachary Turner 
358a1405147SZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
359a1405147SZachary Turner 
360a1405147SZachary Turner   uint32_t GetSize() const;
361a1405147SZachary Turner 
362a1405147SZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
363a1405147SZachary Turner 
364a1405147SZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
365a1405147SZachary Turner 
366a1405147SZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
367a1405147SZachary Turner };
368a1405147SZachary Turner 
369b9c1b51eSKate Stone class PythonDictionary : public PythonObject {
3702c1f46dcSZachary Turner public:
371a1405147SZachary Turner   PythonDictionary() {}
37287f47729SZachary Turner   explicit PythonDictionary(PyInitialValue value);
373f8b22f8fSZachary Turner   PythonDictionary(PyRefType type, PyObject *o);
374edb35d95SEugene Zelenko 
375f8b22f8fSZachary Turner   ~PythonDictionary() override;
3762c1f46dcSZachary Turner 
37722c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
37822c8efcdSZachary Turner 
379f8b22f8fSZachary Turner   // Bring in the no-argument base class version
380f8b22f8fSZachary Turner   using PythonObject::Reset;
381f8b22f8fSZachary Turner 
382f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3832c1f46dcSZachary Turner 
3842c1f46dcSZachary Turner   uint32_t GetSize() const;
3852c1f46dcSZachary Turner 
386f8b22f8fSZachary Turner   PythonList GetKeys() const;
3872c1f46dcSZachary Turner 
388f8b22f8fSZachary Turner   PythonObject GetItemForKey(const PythonObject &key) const;
389f8b22f8fSZachary Turner   void SetItemForKey(const PythonObject &key, const PythonObject &value);
3902c1f46dcSZachary Turner 
3912c1f46dcSZachary Turner   StructuredData::DictionarySP CreateStructuredDictionary() const;
3922c1f46dcSZachary Turner };
39387f47729SZachary Turner 
394b9c1b51eSKate Stone class PythonModule : public PythonObject {
3957841efbbSZachary Turner public:
3967841efbbSZachary Turner   PythonModule();
3977841efbbSZachary Turner   PythonModule(PyRefType type, PyObject *o);
3987841efbbSZachary Turner 
3997841efbbSZachary Turner   ~PythonModule() override;
4007841efbbSZachary Turner 
4017841efbbSZachary Turner   static bool Check(PyObject *py_obj);
4027841efbbSZachary Turner 
403b9c1b51eSKate Stone   static PythonModule BuiltinsModule();
404a1405147SZachary Turner 
405b9c1b51eSKate Stone   static PythonModule MainModule();
406a1405147SZachary Turner 
407b9c1b51eSKate Stone   static PythonModule AddModule(llvm::StringRef module);
4087841efbbSZachary Turner 
409b9c1b51eSKate Stone   static PythonModule ImportModule(llvm::StringRef module);
4102419f1d5SZachary Turner 
4117841efbbSZachary Turner   // Bring in the no-argument base class version
4127841efbbSZachary Turner   using PythonObject::Reset;
4137841efbbSZachary Turner 
4147841efbbSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4157841efbbSZachary Turner 
4167841efbbSZachary Turner   PythonDictionary GetDictionary() const;
4177841efbbSZachary Turner };
4187841efbbSZachary Turner 
419b9c1b51eSKate Stone class PythonCallable : public PythonObject {
420a1405147SZachary Turner public:
421b58fb2f4SZachary Turner   struct ArgInfo {
422b58fb2f4SZachary Turner     size_t count;
423a5d6765cSEnrico Granata     bool is_bound_method : 1;
424b58fb2f4SZachary Turner     bool has_varargs : 1;
425b58fb2f4SZachary Turner     bool has_kwargs : 1;
426b58fb2f4SZachary Turner   };
427b58fb2f4SZachary Turner 
428a1405147SZachary Turner   PythonCallable();
429a1405147SZachary Turner   PythonCallable(PyRefType type, PyObject *o);
430a1405147SZachary Turner 
431a1405147SZachary Turner   ~PythonCallable() override;
432a1405147SZachary Turner 
433b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
434a1405147SZachary Turner 
435a1405147SZachary Turner   // Bring in the no-argument base class version
436a1405147SZachary Turner   using PythonObject::Reset;
437a1405147SZachary Turner 
438b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
439a1405147SZachary Turner 
440b9c1b51eSKate Stone   ArgInfo GetNumArguments() const;
441*27a14f19SJim Ingham 
442*27a14f19SJim Ingham   // If the callable is a Py_Class, then find the number of arguments
443*27a14f19SJim Ingham   // of the __init__ method.
444*27a14f19SJim Ingham   ArgInfo GetNumInitArguments() const;
445b58fb2f4SZachary Turner 
446b9c1b51eSKate Stone   PythonObject operator()();
447a1405147SZachary Turner 
448b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PyObject *> args);
449a1405147SZachary Turner 
450b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PythonObject> args);
451b58fb2f4SZachary Turner 
452b58fb2f4SZachary Turner   template <typename Arg, typename... Args>
453b9c1b51eSKate Stone   PythonObject operator()(const Arg &arg, Args... args) {
454b58fb2f4SZachary Turner     return operator()({arg, args...});
455b58fb2f4SZachary Turner   }
456a1405147SZachary Turner };
457a1405147SZachary Turner 
458b9c1b51eSKate Stone class PythonFile : public PythonObject {
4599c40264fSZachary Turner public:
46032064024SZachary Turner   PythonFile();
461eda01c31SZachary Turner   PythonFile(File &file, const char *mode);
4629c40264fSZachary Turner   PythonFile(PyRefType type, PyObject *o);
463edb35d95SEugene Zelenko 
4649c40264fSZachary Turner   ~PythonFile() override;
4659c40264fSZachary Turner 
4669c40264fSZachary Turner   static bool Check(PyObject *py_obj);
4679c40264fSZachary Turner 
4689c40264fSZachary Turner   using PythonObject::Reset;
4699c40264fSZachary Turner 
4709c40264fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4719c40264fSZachary Turner   void Reset(File &file, const char *mode);
472eda01c31SZachary Turner 
4732fce1137SLawrence D'Anna   lldb::FileUP GetUnderlyingFile() const;
4749c40264fSZachary Turner };
4759c40264fSZachary Turner 
4762c1f46dcSZachary Turner } // namespace lldb_private
4772c1f46dcSZachary Turner 
478a281b42bSZachary Turner #endif
479d68983e3SPavel Labath 
480d68983e3SPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
481