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 
1541de9a97SKate Stone // LLDB Python header must be included first
1641de9a97SKate Stone #include "lldb-python.h"
1741de9a97SKate Stone 
182c1f46dcSZachary Turner // C Includes
192c1f46dcSZachary Turner // C++ Includes
202c1f46dcSZachary Turner // Other libraries and framework includes
212c1f46dcSZachary Turner // Project includes
222c1f46dcSZachary Turner #include "lldb/Core/Flags.h"
239ba9dfddSPavel Labath #include "lldb/Core/StructuredData.h"
249c40264fSZachary Turner #include "lldb/Host/File.h"
252c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h"
26*bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
279ba9dfddSPavel Labath #include "lldb/lldb-defines.h"
282c1f46dcSZachary Turner 
295a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h"
305a72c02bSZachary Turner 
312c1f46dcSZachary Turner namespace lldb_private {
32edb35d95SEugene Zelenko 
335a72c02bSZachary Turner class PythonBytes;
342c1f46dcSZachary Turner class PythonString;
352c1f46dcSZachary Turner class PythonList;
362c1f46dcSZachary Turner class PythonDictionary;
372c1f46dcSZachary Turner class PythonInteger;
382c1f46dcSZachary Turner 
39b9c1b51eSKate Stone class StructuredPythonObject : public StructuredData::Generic {
402c1f46dcSZachary Turner public:
41b9c1b51eSKate Stone   StructuredPythonObject() : StructuredData::Generic() {}
422c1f46dcSZachary Turner 
43b9c1b51eSKate Stone   StructuredPythonObject(void *obj) : StructuredData::Generic(obj) {
442c1f46dcSZachary Turner     Py_XINCREF(GetValue());
452c1f46dcSZachary Turner   }
462c1f46dcSZachary Turner 
47b9c1b51eSKate Stone   ~StructuredPythonObject() override {
482c1f46dcSZachary Turner     if (Py_IsInitialized())
492c1f46dcSZachary Turner       Py_XDECREF(GetValue());
502c1f46dcSZachary Turner     SetValue(nullptr);
512c1f46dcSZachary Turner   }
522c1f46dcSZachary Turner 
53b9c1b51eSKate Stone   bool IsValid() const override { return GetValue() && GetValue() != Py_None; }
542c1f46dcSZachary Turner 
55d9c9da53SJason Molenda   void Dump(Stream &s, bool pretty_print = true) const override;
562c1f46dcSZachary Turner 
572c1f46dcSZachary Turner private:
582c1f46dcSZachary Turner   DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
592c1f46dcSZachary Turner };
602c1f46dcSZachary Turner 
61b9c1b51eSKate Stone enum class PyObjectType {
622c1f46dcSZachary Turner   Unknown,
632c1f46dcSZachary Turner   None,
642c1f46dcSZachary Turner   Integer,
652c1f46dcSZachary Turner   Dictionary,
662c1f46dcSZachary Turner   List,
679c40264fSZachary Turner   String,
685a72c02bSZachary Turner   Bytes,
69f9d6d204SZachary Turner   ByteArray,
707841efbbSZachary Turner   Module,
71a1405147SZachary Turner   Callable,
72a1405147SZachary Turner   Tuple,
739c40264fSZachary Turner   File
742c1f46dcSZachary Turner };
752c1f46dcSZachary Turner 
76b9c1b51eSKate Stone enum class PyRefType {
77f8b22f8fSZachary Turner   Borrowed, // We are not given ownership of the incoming PyObject.
78f8b22f8fSZachary Turner             // We cannot safely hold it without calling Py_INCREF.
79f8b22f8fSZachary Turner   Owned     // We have ownership of the incoming PyObject.  We should
80f8b22f8fSZachary Turner             // not call Py_INCREF.
81f8b22f8fSZachary Turner };
82f8b22f8fSZachary Turner 
83b9c1b51eSKate Stone enum class PyInitialValue { Invalid, Empty };
84f8b22f8fSZachary Turner 
85b9c1b51eSKate Stone class PythonObject {
862c1f46dcSZachary Turner public:
87b9c1b51eSKate Stone   PythonObject() : m_py_obj(nullptr) {}
882c1f46dcSZachary Turner 
89b9c1b51eSKate Stone   PythonObject(PyRefType type, PyObject *py_obj) : m_py_obj(nullptr) {
90f8b22f8fSZachary Turner     Reset(type, py_obj);
912c1f46dcSZachary Turner   }
922c1f46dcSZachary Turner 
93b9c1b51eSKate Stone   PythonObject(const PythonObject &rhs) : m_py_obj(nullptr) { Reset(rhs); }
942c1f46dcSZachary Turner 
95b9c1b51eSKate Stone   virtual ~PythonObject() { Reset(); }
962c1f46dcSZachary Turner 
97b9c1b51eSKate Stone   void Reset() {
98f8b22f8fSZachary Turner     // Avoid calling the virtual method since it's not necessary
99f8b22f8fSZachary Turner     // to actually validate the type of the PyObject if we're
100f8b22f8fSZachary Turner     // just setting to null.
1012c1f46dcSZachary Turner     if (Py_IsInitialized())
1022c1f46dcSZachary Turner       Py_XDECREF(m_py_obj);
103f8b22f8fSZachary Turner     m_py_obj = nullptr;
1042c1f46dcSZachary Turner   }
105f8b22f8fSZachary Turner 
106b9c1b51eSKate Stone   void Reset(const PythonObject &rhs) {
107f8b22f8fSZachary Turner     // Avoid calling the virtual method if it's not necessary
108f8b22f8fSZachary Turner     // to actually validate the type of the PyObject.
10960c24f70SZachary Turner     if (!rhs.IsValid())
110f8b22f8fSZachary Turner       Reset();
111f8b22f8fSZachary Turner     else
112f8b22f8fSZachary Turner       Reset(PyRefType::Borrowed, rhs.m_py_obj);
113f8b22f8fSZachary Turner   }
114f8b22f8fSZachary Turner 
115f8b22f8fSZachary Turner   // PythonObject is implicitly convertible to PyObject *, which will call the
116f8b22f8fSZachary Turner   // wrong overload.  We want to explicitly disallow this, since a PyObject
117f8b22f8fSZachary Turner   // *always* owns its reference.  Therefore the overload which takes a
118f8b22f8fSZachary Turner   // PyRefType doesn't make sense, and the copy constructor should be used.
119b9c1b51eSKate Stone   void Reset(PyRefType type, const PythonObject &ref) = delete;
120f8b22f8fSZachary Turner 
121b9c1b51eSKate Stone   virtual void Reset(PyRefType type, PyObject *py_obj) {
122f8b22f8fSZachary Turner     if (py_obj == m_py_obj)
123f8b22f8fSZachary Turner       return;
124f8b22f8fSZachary Turner 
125f8b22f8fSZachary Turner     if (Py_IsInitialized())
126f8b22f8fSZachary Turner       Py_XDECREF(m_py_obj);
127f8b22f8fSZachary Turner 
128f8b22f8fSZachary Turner     m_py_obj = py_obj;
129f8b22f8fSZachary Turner 
130f8b22f8fSZachary Turner     // If this is a borrowed reference, we need to convert it to
131f8b22f8fSZachary Turner     // an owned reference by incrementing it.  If it is an owned
132f8b22f8fSZachary Turner     // reference (for example the caller allocated it with PyDict_New()
133f8b22f8fSZachary Turner     // then we must *not* increment it.
134f8b22f8fSZachary Turner     if (Py_IsInitialized() && type == PyRefType::Borrowed)
135f8b22f8fSZachary Turner       Py_XINCREF(m_py_obj);
1362c1f46dcSZachary Turner   }
1372c1f46dcSZachary Turner 
138b9c1b51eSKate Stone   void Dump() const {
1392c1f46dcSZachary Turner     if (m_py_obj)
1402c1f46dcSZachary Turner       _PyObject_Dump(m_py_obj);
1412c1f46dcSZachary Turner     else
1422c1f46dcSZachary Turner       puts("NULL");
1432c1f46dcSZachary Turner   }
1442c1f46dcSZachary Turner 
145b9c1b51eSKate Stone   void Dump(Stream &strm) const;
1462c1f46dcSZachary Turner 
147b9c1b51eSKate Stone   PyObject *get() const { return m_py_obj; }
1482c1f46dcSZachary Turner 
149b9c1b51eSKate Stone   PyObject *release() {
15060c24f70SZachary Turner     PyObject *result = m_py_obj;
15160c24f70SZachary Turner     m_py_obj = nullptr;
15260c24f70SZachary Turner     return result;
15360c24f70SZachary Turner   }
15460c24f70SZachary Turner 
155b9c1b51eSKate Stone   PythonObject &operator=(const PythonObject &other) {
156f8b22f8fSZachary Turner     Reset(PyRefType::Borrowed, other.get());
157f8b22f8fSZachary Turner     return *this;
1582c1f46dcSZachary Turner   }
1592c1f46dcSZachary Turner 
160b9c1b51eSKate Stone   PyObjectType GetObjectType() const;
1617841efbbSZachary Turner 
162b9c1b51eSKate Stone   PythonString Repr() const;
1637841efbbSZachary Turner 
164b9c1b51eSKate Stone   PythonString Str() const;
1657841efbbSZachary Turner 
166b9c1b51eSKate Stone   static PythonObject ResolveNameWithDictionary(llvm::StringRef name,
167b9c1b51eSKate Stone                                                 const PythonDictionary &dict);
1687841efbbSZachary Turner 
169b58fb2f4SZachary Turner   template <typename T>
170b9c1b51eSKate Stone   static T ResolveNameWithDictionary(llvm::StringRef name,
171b9c1b51eSKate Stone                                      const PythonDictionary &dict) {
172b58fb2f4SZachary Turner     return ResolveNameWithDictionary(name, dict).AsType<T>();
173b58fb2f4SZachary Turner   }
174b58fb2f4SZachary Turner 
175b9c1b51eSKate Stone   PythonObject ResolveName(llvm::StringRef name) const;
1767841efbbSZachary Turner 
177b9c1b51eSKate Stone   template <typename T> T ResolveName(llvm::StringRef name) const {
178b58fb2f4SZachary Turner     return ResolveName(name).AsType<T>();
179b58fb2f4SZachary Turner   }
180b58fb2f4SZachary Turner 
181b9c1b51eSKate Stone   bool HasAttribute(llvm::StringRef attribute) const;
1829c40264fSZachary Turner 
183b9c1b51eSKate Stone   PythonObject GetAttributeValue(llvm::StringRef attribute) const;
1847d6d218eSZachary Turner 
185b9c1b51eSKate Stone   bool IsValid() const;
186f8b22f8fSZachary Turner 
187b9c1b51eSKate Stone   bool IsAllocated() const;
188f8b22f8fSZachary Turner 
189b9c1b51eSKate Stone   bool IsNone() const;
1902c1f46dcSZachary Turner 
191b9c1b51eSKate Stone   template <typename T> T AsType() const {
1927d6d218eSZachary Turner     if (!T::Check(m_py_obj))
1937d6d218eSZachary Turner       return T();
1947d6d218eSZachary Turner     return T(PyRefType::Borrowed, m_py_obj);
1957d6d218eSZachary Turner   }
1967d6d218eSZachary Turner 
197b9c1b51eSKate Stone   StructuredData::ObjectSP CreateStructuredObject() const;
1982c1f46dcSZachary Turner 
1992c1f46dcSZachary Turner protected:
2002c1f46dcSZachary Turner   PyObject *m_py_obj;
2012c1f46dcSZachary Turner };
2022c1f46dcSZachary Turner 
203b9c1b51eSKate Stone class PythonBytes : public PythonObject {
2045a72c02bSZachary Turner public:
2055a72c02bSZachary Turner   PythonBytes();
2065a72c02bSZachary Turner   explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
2075a72c02bSZachary Turner   PythonBytes(const uint8_t *bytes, size_t length);
2085a72c02bSZachary Turner   PythonBytes(PyRefType type, PyObject *o);
2095a72c02bSZachary Turner   PythonBytes(const PythonBytes &object);
2105a72c02bSZachary Turner 
2115a72c02bSZachary Turner   ~PythonBytes() override;
2125a72c02bSZachary Turner 
213b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
2145a72c02bSZachary Turner 
2155a72c02bSZachary Turner   // Bring in the no-argument base class version
2165a72c02bSZachary Turner   using PythonObject::Reset;
2175a72c02bSZachary Turner 
218b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
2195a72c02bSZachary Turner 
220b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
2215a72c02bSZachary Turner 
222b9c1b51eSKate Stone   size_t GetSize() const;
2235a72c02bSZachary Turner 
224b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2255a72c02bSZachary Turner 
226b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
2275a72c02bSZachary Turner };
2285a72c02bSZachary Turner 
229b9c1b51eSKate Stone class PythonByteArray : public PythonObject {
230f9d6d204SZachary Turner public:
231f9d6d204SZachary Turner   PythonByteArray();
232f9d6d204SZachary Turner   explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
233f9d6d204SZachary Turner   PythonByteArray(const uint8_t *bytes, size_t length);
234f9d6d204SZachary Turner   PythonByteArray(PyRefType type, PyObject *o);
235f9d6d204SZachary Turner   PythonByteArray(const PythonBytes &object);
236f9d6d204SZachary Turner 
237f9d6d204SZachary Turner   ~PythonByteArray() override;
238f9d6d204SZachary Turner 
239b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
240f9d6d204SZachary Turner 
241f9d6d204SZachary Turner   // Bring in the no-argument base class version
242f9d6d204SZachary Turner   using PythonObject::Reset;
243f9d6d204SZachary Turner 
244b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
245f9d6d204SZachary Turner 
246b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
247f9d6d204SZachary Turner 
248b9c1b51eSKate Stone   size_t GetSize() const;
249f9d6d204SZachary Turner 
250b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
251f9d6d204SZachary Turner 
252b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
253f9d6d204SZachary Turner };
254f9d6d204SZachary Turner 
255b9c1b51eSKate Stone class PythonString : public PythonObject {
2562c1f46dcSZachary Turner public:
2572c1f46dcSZachary Turner   PythonString();
258f8b22f8fSZachary Turner   explicit PythonString(llvm::StringRef string);
259f8b22f8fSZachary Turner   explicit PythonString(const char *string);
26087f47729SZachary Turner   PythonString(PyRefType type, PyObject *o);
26187f47729SZachary Turner   PythonString(const PythonString &object);
262edb35d95SEugene Zelenko 
263f8b22f8fSZachary Turner   ~PythonString() override;
2642c1f46dcSZachary Turner 
26522c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
26622c8efcdSZachary Turner 
267f8b22f8fSZachary Turner   // Bring in the no-argument base class version
268f8b22f8fSZachary Turner   using PythonObject::Reset;
269f8b22f8fSZachary Turner 
270f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2712c1f46dcSZachary Turner 
272b9c1b51eSKate Stone   llvm::StringRef GetString() const;
2732c1f46dcSZachary Turner 
274b9c1b51eSKate Stone   size_t GetSize() const;
2752c1f46dcSZachary Turner 
2762c1f46dcSZachary Turner   void SetString(llvm::StringRef string);
2772c1f46dcSZachary Turner 
2782c1f46dcSZachary Turner   StructuredData::StringSP CreateStructuredString() const;
2792c1f46dcSZachary Turner };
2802c1f46dcSZachary Turner 
281b9c1b51eSKate Stone class PythonInteger : public PythonObject {
2822c1f46dcSZachary Turner public:
2832c1f46dcSZachary Turner   PythonInteger();
28487f47729SZachary Turner   explicit PythonInteger(int64_t value);
285f8b22f8fSZachary Turner   PythonInteger(PyRefType type, PyObject *o);
286f8b22f8fSZachary Turner   PythonInteger(const PythonInteger &object);
287edb35d95SEugene Zelenko 
288f8b22f8fSZachary Turner   ~PythonInteger() override;
2892c1f46dcSZachary Turner 
29022c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
29122c8efcdSZachary Turner 
292f8b22f8fSZachary Turner   // Bring in the no-argument base class version
293f8b22f8fSZachary Turner   using PythonObject::Reset;
294f8b22f8fSZachary Turner 
295f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2962c1f46dcSZachary Turner 
2972c1f46dcSZachary Turner   int64_t GetInteger() const;
2982c1f46dcSZachary Turner 
299b9c1b51eSKate Stone   void SetInteger(int64_t value);
3002c1f46dcSZachary Turner 
3012c1f46dcSZachary Turner   StructuredData::IntegerSP CreateStructuredInteger() const;
3022c1f46dcSZachary Turner };
3032c1f46dcSZachary Turner 
304b9c1b51eSKate Stone class PythonList : public PythonObject {
3052c1f46dcSZachary Turner public:
306a1405147SZachary Turner   PythonList() {}
30787f47729SZachary Turner   explicit PythonList(PyInitialValue value);
30887f47729SZachary Turner   explicit PythonList(int list_size);
309f8b22f8fSZachary Turner   PythonList(PyRefType type, PyObject *o);
310f8b22f8fSZachary Turner   PythonList(const PythonList &list);
311edb35d95SEugene Zelenko 
312f8b22f8fSZachary Turner   ~PythonList() override;
3132c1f46dcSZachary Turner 
31422c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
31522c8efcdSZachary Turner 
316f8b22f8fSZachary Turner   // Bring in the no-argument base class version
317f8b22f8fSZachary Turner   using PythonObject::Reset;
318f8b22f8fSZachary Turner 
319f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3202c1f46dcSZachary Turner 
3212c1f46dcSZachary Turner   uint32_t GetSize() const;
3222c1f46dcSZachary Turner 
3232c1f46dcSZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
3242c1f46dcSZachary Turner 
325f8b22f8fSZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
3262c1f46dcSZachary Turner 
327f8b22f8fSZachary Turner   void AppendItem(const PythonObject &object);
3282c1f46dcSZachary Turner 
3292c1f46dcSZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
3302c1f46dcSZachary Turner };
3312c1f46dcSZachary Turner 
332b9c1b51eSKate Stone class PythonTuple : public PythonObject {
333a1405147SZachary Turner public:
334a1405147SZachary Turner   PythonTuple() {}
335a1405147SZachary Turner   explicit PythonTuple(PyInitialValue value);
336a1405147SZachary Turner   explicit PythonTuple(int tuple_size);
337a1405147SZachary Turner   PythonTuple(PyRefType type, PyObject *o);
338a1405147SZachary Turner   PythonTuple(const PythonTuple &tuple);
339a1405147SZachary Turner   PythonTuple(std::initializer_list<PythonObject> objects);
340a1405147SZachary Turner   PythonTuple(std::initializer_list<PyObject *> objects);
341a1405147SZachary Turner 
342a1405147SZachary Turner   ~PythonTuple() override;
343a1405147SZachary Turner 
344a1405147SZachary Turner   static bool Check(PyObject *py_obj);
345a1405147SZachary Turner 
346a1405147SZachary Turner   // Bring in the no-argument base class version
347a1405147SZachary Turner   using PythonObject::Reset;
348a1405147SZachary Turner 
349a1405147SZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
350a1405147SZachary Turner 
351a1405147SZachary Turner   uint32_t GetSize() const;
352a1405147SZachary Turner 
353a1405147SZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
354a1405147SZachary Turner 
355a1405147SZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
356a1405147SZachary Turner 
357a1405147SZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
358a1405147SZachary Turner };
359a1405147SZachary Turner 
360b9c1b51eSKate Stone class PythonDictionary : public PythonObject {
3612c1f46dcSZachary Turner public:
362a1405147SZachary Turner   PythonDictionary() {}
36387f47729SZachary Turner   explicit PythonDictionary(PyInitialValue value);
364f8b22f8fSZachary Turner   PythonDictionary(PyRefType type, PyObject *o);
365f8b22f8fSZachary Turner   PythonDictionary(const PythonDictionary &dict);
366edb35d95SEugene Zelenko 
367f8b22f8fSZachary Turner   ~PythonDictionary() 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   uint32_t GetSize() const;
3772c1f46dcSZachary Turner 
378f8b22f8fSZachary Turner   PythonList GetKeys() const;
3792c1f46dcSZachary Turner 
380f8b22f8fSZachary Turner   PythonObject GetItemForKey(const PythonObject &key) const;
381f8b22f8fSZachary Turner   void SetItemForKey(const PythonObject &key, const PythonObject &value);
3822c1f46dcSZachary Turner 
3832c1f46dcSZachary Turner   StructuredData::DictionarySP CreateStructuredDictionary() const;
3842c1f46dcSZachary Turner };
38587f47729SZachary Turner 
386b9c1b51eSKate Stone class PythonModule : public PythonObject {
3877841efbbSZachary Turner public:
3887841efbbSZachary Turner   PythonModule();
3897841efbbSZachary Turner   PythonModule(PyRefType type, PyObject *o);
3907841efbbSZachary Turner   PythonModule(const PythonModule &dict);
3917841efbbSZachary Turner 
3927841efbbSZachary Turner   ~PythonModule() override;
3937841efbbSZachary Turner 
3947841efbbSZachary Turner   static bool Check(PyObject *py_obj);
3957841efbbSZachary Turner 
396b9c1b51eSKate Stone   static PythonModule BuiltinsModule();
397a1405147SZachary Turner 
398b9c1b51eSKate Stone   static PythonModule MainModule();
399a1405147SZachary Turner 
400b9c1b51eSKate Stone   static PythonModule AddModule(llvm::StringRef module);
4017841efbbSZachary Turner 
402b9c1b51eSKate Stone   static PythonModule ImportModule(llvm::StringRef module);
4032419f1d5SZachary Turner 
4047841efbbSZachary Turner   // Bring in the no-argument base class version
4057841efbbSZachary Turner   using PythonObject::Reset;
4067841efbbSZachary Turner 
4077841efbbSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4087841efbbSZachary Turner 
4097841efbbSZachary Turner   PythonDictionary GetDictionary() const;
4107841efbbSZachary Turner };
4117841efbbSZachary Turner 
412b9c1b51eSKate Stone class PythonCallable : public PythonObject {
413a1405147SZachary Turner public:
414b58fb2f4SZachary Turner   struct ArgInfo {
415b58fb2f4SZachary Turner     size_t count;
416a5d6765cSEnrico Granata     bool is_bound_method : 1;
417b58fb2f4SZachary Turner     bool has_varargs : 1;
418b58fb2f4SZachary Turner     bool has_kwargs : 1;
419b58fb2f4SZachary Turner   };
420b58fb2f4SZachary Turner 
421a1405147SZachary Turner   PythonCallable();
422a1405147SZachary Turner   PythonCallable(PyRefType type, PyObject *o);
423a1405147SZachary Turner   PythonCallable(const PythonCallable &dict);
424a1405147SZachary Turner 
425a1405147SZachary Turner   ~PythonCallable() override;
426a1405147SZachary Turner 
427b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
428a1405147SZachary Turner 
429a1405147SZachary Turner   // Bring in the no-argument base class version
430a1405147SZachary Turner   using PythonObject::Reset;
431a1405147SZachary Turner 
432b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
433a1405147SZachary Turner 
434b9c1b51eSKate Stone   ArgInfo GetNumArguments() const;
435b58fb2f4SZachary Turner 
436b9c1b51eSKate Stone   PythonObject operator()();
437a1405147SZachary Turner 
438b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PyObject *> args);
439a1405147SZachary Turner 
440b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PythonObject> args);
441b58fb2f4SZachary Turner 
442b58fb2f4SZachary Turner   template <typename Arg, typename... Args>
443b9c1b51eSKate Stone   PythonObject operator()(const Arg &arg, Args... args) {
444b58fb2f4SZachary Turner     return operator()({arg, args...});
445b58fb2f4SZachary Turner   }
446a1405147SZachary Turner };
447a1405147SZachary Turner 
448b9c1b51eSKate Stone class PythonFile : public PythonObject {
4499c40264fSZachary Turner public:
45032064024SZachary Turner   PythonFile();
451eda01c31SZachary Turner   PythonFile(File &file, const char *mode);
452eda01c31SZachary Turner   PythonFile(const char *path, const char *mode);
4539c40264fSZachary Turner   PythonFile(PyRefType type, PyObject *o);
454edb35d95SEugene Zelenko 
4559c40264fSZachary Turner   ~PythonFile() override;
4569c40264fSZachary Turner 
4579c40264fSZachary Turner   static bool Check(PyObject *py_obj);
4589c40264fSZachary Turner 
4599c40264fSZachary Turner   using PythonObject::Reset;
4609c40264fSZachary Turner 
4619c40264fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4629c40264fSZachary Turner   void Reset(File &file, const char *mode);
463eda01c31SZachary Turner 
464744959b9SEnrico Granata   static uint32_t GetOptionsFromMode(llvm::StringRef mode);
465744959b9SEnrico Granata 
466eda01c31SZachary Turner   bool GetUnderlyingFile(File &file) const;
4679c40264fSZachary Turner };
4689c40264fSZachary Turner 
4692c1f46dcSZachary Turner } // namespace lldb_private
4702c1f46dcSZachary Turner 
471a281b42bSZachary Turner #endif
472a281b42bSZachary Turner 
4732c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
474