1edb35d95SEugene Zelenko //===-- PythonDataObjects.h--------------------------------------*- C++ -*-===//
22c1f46dcSZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler 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 
1701c3243fSZachary Turner #include "lldb/Utility/Flags.h"
1801c3243fSZachary Turner 
199c40264fSZachary Turner #include "lldb/Host/File.h"
202c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h"
21bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
22f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h"
239ba9dfddSPavel Labath #include "lldb/lldb-defines.h"
242c1f46dcSZachary Turner 
255a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h"
265a72c02bSZachary Turner 
272c1f46dcSZachary Turner namespace lldb_private {
28edb35d95SEugene Zelenko 
295a72c02bSZachary Turner class PythonBytes;
302c1f46dcSZachary Turner class PythonString;
312c1f46dcSZachary Turner class PythonList;
322c1f46dcSZachary Turner class PythonDictionary;
332c1f46dcSZachary Turner class PythonInteger;
342c1f46dcSZachary Turner 
35b9c1b51eSKate Stone class StructuredPythonObject : public StructuredData::Generic {
362c1f46dcSZachary Turner public:
37b9c1b51eSKate Stone   StructuredPythonObject() : StructuredData::Generic() {}
382c1f46dcSZachary Turner 
39b9c1b51eSKate Stone   StructuredPythonObject(void *obj) : StructuredData::Generic(obj) {
402c1f46dcSZachary Turner     Py_XINCREF(GetValue());
412c1f46dcSZachary Turner   }
422c1f46dcSZachary Turner 
43b9c1b51eSKate Stone   ~StructuredPythonObject() override {
442c1f46dcSZachary Turner     if (Py_IsInitialized())
452c1f46dcSZachary Turner       Py_XDECREF(GetValue());
462c1f46dcSZachary Turner     SetValue(nullptr);
472c1f46dcSZachary Turner   }
482c1f46dcSZachary Turner 
49b9c1b51eSKate Stone   bool IsValid() const override { return GetValue() && GetValue() != Py_None; }
502c1f46dcSZachary Turner 
51d9c9da53SJason Molenda   void Dump(Stream &s, bool pretty_print = true) const override;
522c1f46dcSZachary Turner 
532c1f46dcSZachary Turner private:
542c1f46dcSZachary Turner   DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
552c1f46dcSZachary Turner };
562c1f46dcSZachary Turner 
57b9c1b51eSKate Stone enum class PyObjectType {
582c1f46dcSZachary Turner   Unknown,
592c1f46dcSZachary Turner   None,
602c1f46dcSZachary Turner   Integer,
612c1f46dcSZachary Turner   Dictionary,
622c1f46dcSZachary Turner   List,
639c40264fSZachary Turner   String,
645a72c02bSZachary Turner   Bytes,
65f9d6d204SZachary Turner   ByteArray,
667841efbbSZachary Turner   Module,
67a1405147SZachary Turner   Callable,
68a1405147SZachary Turner   Tuple,
699c40264fSZachary Turner   File
702c1f46dcSZachary Turner };
712c1f46dcSZachary Turner 
72b9c1b51eSKate Stone enum class PyRefType {
73f8b22f8fSZachary Turner   Borrowed, // We are not given ownership of the incoming PyObject.
74f8b22f8fSZachary Turner             // We cannot safely hold it without calling Py_INCREF.
75f8b22f8fSZachary Turner   Owned     // We have ownership of the incoming PyObject.  We should
76f8b22f8fSZachary Turner             // not call Py_INCREF.
77f8b22f8fSZachary Turner };
78f8b22f8fSZachary Turner 
79b9c1b51eSKate Stone enum class PyInitialValue { Invalid, Empty };
80f8b22f8fSZachary Turner 
81b9c1b51eSKate Stone class PythonObject {
822c1f46dcSZachary Turner public:
83b9c1b51eSKate Stone   PythonObject() : m_py_obj(nullptr) {}
842c1f46dcSZachary Turner 
85b9c1b51eSKate Stone   PythonObject(PyRefType type, PyObject *py_obj) : m_py_obj(nullptr) {
86f8b22f8fSZachary Turner     Reset(type, py_obj);
872c1f46dcSZachary Turner   }
882c1f46dcSZachary Turner 
89b9c1b51eSKate Stone   PythonObject(const PythonObject &rhs) : m_py_obj(nullptr) { Reset(rhs); }
902c1f46dcSZachary Turner 
91b9c1b51eSKate Stone   virtual ~PythonObject() { Reset(); }
922c1f46dcSZachary Turner 
93b9c1b51eSKate Stone   void Reset() {
94f8b22f8fSZachary Turner     // Avoid calling the virtual method since it's not necessary
95f8b22f8fSZachary Turner     // to actually validate the type of the PyObject if we're
96f8b22f8fSZachary Turner     // just setting to null.
972c1f46dcSZachary Turner     if (Py_IsInitialized())
982c1f46dcSZachary Turner       Py_XDECREF(m_py_obj);
99f8b22f8fSZachary Turner     m_py_obj = nullptr;
1002c1f46dcSZachary Turner   }
101f8b22f8fSZachary Turner 
102b9c1b51eSKate Stone   void Reset(const PythonObject &rhs) {
103f8b22f8fSZachary Turner     // Avoid calling the virtual method if it's not necessary
104f8b22f8fSZachary Turner     // to actually validate the type of the PyObject.
10560c24f70SZachary Turner     if (!rhs.IsValid())
106f8b22f8fSZachary Turner       Reset();
107f8b22f8fSZachary Turner     else
108f8b22f8fSZachary Turner       Reset(PyRefType::Borrowed, rhs.m_py_obj);
109f8b22f8fSZachary Turner   }
110f8b22f8fSZachary Turner 
111f8b22f8fSZachary Turner   // PythonObject is implicitly convertible to PyObject *, which will call the
112f8b22f8fSZachary Turner   // wrong overload.  We want to explicitly disallow this, since a PyObject
113f8b22f8fSZachary Turner   // *always* owns its reference.  Therefore the overload which takes a
114f8b22f8fSZachary Turner   // PyRefType doesn't make sense, and the copy constructor should be used.
115b9c1b51eSKate Stone   void Reset(PyRefType type, const PythonObject &ref) = delete;
116f8b22f8fSZachary Turner 
117b9c1b51eSKate Stone   virtual void Reset(PyRefType type, PyObject *py_obj) {
118f8b22f8fSZachary Turner     if (py_obj == m_py_obj)
119f8b22f8fSZachary Turner       return;
120f8b22f8fSZachary Turner 
121f8b22f8fSZachary Turner     if (Py_IsInitialized())
122f8b22f8fSZachary Turner       Py_XDECREF(m_py_obj);
123f8b22f8fSZachary Turner 
124f8b22f8fSZachary Turner     m_py_obj = py_obj;
125f8b22f8fSZachary Turner 
126f8b22f8fSZachary Turner     // If this is a borrowed reference, we need to convert it to
127f8b22f8fSZachary Turner     // an owned reference by incrementing it.  If it is an owned
128f8b22f8fSZachary Turner     // reference (for example the caller allocated it with PyDict_New()
129f8b22f8fSZachary Turner     // then we must *not* increment it.
130f8b22f8fSZachary Turner     if (Py_IsInitialized() && type == PyRefType::Borrowed)
131f8b22f8fSZachary Turner       Py_XINCREF(m_py_obj);
1322c1f46dcSZachary Turner   }
1332c1f46dcSZachary Turner 
134b9c1b51eSKate Stone   void Dump() const {
1352c1f46dcSZachary Turner     if (m_py_obj)
1362c1f46dcSZachary Turner       _PyObject_Dump(m_py_obj);
1372c1f46dcSZachary Turner     else
1382c1f46dcSZachary Turner       puts("NULL");
1392c1f46dcSZachary Turner   }
1402c1f46dcSZachary Turner 
141b9c1b51eSKate Stone   void Dump(Stream &strm) const;
1422c1f46dcSZachary Turner 
143b9c1b51eSKate Stone   PyObject *get() const { return m_py_obj; }
1442c1f46dcSZachary Turner 
145b9c1b51eSKate Stone   PyObject *release() {
14660c24f70SZachary Turner     PyObject *result = m_py_obj;
14760c24f70SZachary Turner     m_py_obj = nullptr;
14860c24f70SZachary Turner     return result;
14960c24f70SZachary Turner   }
15060c24f70SZachary Turner 
151b9c1b51eSKate Stone   PythonObject &operator=(const PythonObject &other) {
152f8b22f8fSZachary Turner     Reset(PyRefType::Borrowed, other.get());
153f8b22f8fSZachary Turner     return *this;
1542c1f46dcSZachary Turner   }
1552c1f46dcSZachary Turner 
156b9c1b51eSKate Stone   PyObjectType GetObjectType() const;
1577841efbbSZachary Turner 
158b9c1b51eSKate Stone   PythonString Repr() const;
1597841efbbSZachary Turner 
160b9c1b51eSKate Stone   PythonString Str() const;
1617841efbbSZachary Turner 
162b9c1b51eSKate Stone   static PythonObject ResolveNameWithDictionary(llvm::StringRef name,
163b9c1b51eSKate Stone                                                 const PythonDictionary &dict);
1647841efbbSZachary Turner 
165b58fb2f4SZachary Turner   template <typename T>
166b9c1b51eSKate Stone   static T ResolveNameWithDictionary(llvm::StringRef name,
167b9c1b51eSKate Stone                                      const PythonDictionary &dict) {
168b58fb2f4SZachary Turner     return ResolveNameWithDictionary(name, dict).AsType<T>();
169b58fb2f4SZachary Turner   }
170b58fb2f4SZachary Turner 
171b9c1b51eSKate Stone   PythonObject ResolveName(llvm::StringRef name) const;
1727841efbbSZachary Turner 
173b9c1b51eSKate Stone   template <typename T> T ResolveName(llvm::StringRef name) const {
174b58fb2f4SZachary Turner     return ResolveName(name).AsType<T>();
175b58fb2f4SZachary Turner   }
176b58fb2f4SZachary Turner 
177b9c1b51eSKate Stone   bool HasAttribute(llvm::StringRef attribute) const;
1789c40264fSZachary Turner 
179b9c1b51eSKate Stone   PythonObject GetAttributeValue(llvm::StringRef attribute) const;
1807d6d218eSZachary Turner 
181b9c1b51eSKate Stone   bool IsValid() const;
182f8b22f8fSZachary Turner 
183b9c1b51eSKate Stone   bool IsAllocated() const;
184f8b22f8fSZachary Turner 
185b9c1b51eSKate Stone   bool IsNone() const;
1862c1f46dcSZachary Turner 
187b9c1b51eSKate Stone   template <typename T> T AsType() const {
1887d6d218eSZachary Turner     if (!T::Check(m_py_obj))
1897d6d218eSZachary Turner       return T();
1907d6d218eSZachary Turner     return T(PyRefType::Borrowed, m_py_obj);
1917d6d218eSZachary Turner   }
1927d6d218eSZachary Turner 
193b9c1b51eSKate Stone   StructuredData::ObjectSP CreateStructuredObject() const;
1942c1f46dcSZachary Turner 
1952c1f46dcSZachary Turner protected:
1962c1f46dcSZachary Turner   PyObject *m_py_obj;
1972c1f46dcSZachary Turner };
1982c1f46dcSZachary Turner 
199b9c1b51eSKate Stone class PythonBytes : public PythonObject {
2005a72c02bSZachary Turner public:
2015a72c02bSZachary Turner   PythonBytes();
2025a72c02bSZachary Turner   explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
2035a72c02bSZachary Turner   PythonBytes(const uint8_t *bytes, size_t length);
2045a72c02bSZachary Turner   PythonBytes(PyRefType type, PyObject *o);
2055a72c02bSZachary Turner   PythonBytes(const PythonBytes &object);
2065a72c02bSZachary Turner 
2075a72c02bSZachary Turner   ~PythonBytes() override;
2085a72c02bSZachary Turner 
209b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
2105a72c02bSZachary Turner 
2115a72c02bSZachary Turner   // Bring in the no-argument base class version
2125a72c02bSZachary Turner   using PythonObject::Reset;
2135a72c02bSZachary Turner 
214b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
2155a72c02bSZachary Turner 
216b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
2175a72c02bSZachary Turner 
218b9c1b51eSKate Stone   size_t GetSize() const;
2195a72c02bSZachary Turner 
220b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2215a72c02bSZachary Turner 
222b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
2235a72c02bSZachary Turner };
2245a72c02bSZachary Turner 
225b9c1b51eSKate Stone class PythonByteArray : public PythonObject {
226f9d6d204SZachary Turner public:
227f9d6d204SZachary Turner   PythonByteArray();
228f9d6d204SZachary Turner   explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
229f9d6d204SZachary Turner   PythonByteArray(const uint8_t *bytes, size_t length);
230f9d6d204SZachary Turner   PythonByteArray(PyRefType type, PyObject *o);
231f9d6d204SZachary Turner   PythonByteArray(const PythonBytes &object);
232f9d6d204SZachary Turner 
233f9d6d204SZachary Turner   ~PythonByteArray() override;
234f9d6d204SZachary Turner 
235b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
236f9d6d204SZachary Turner 
237f9d6d204SZachary Turner   // Bring in the no-argument base class version
238f9d6d204SZachary Turner   using PythonObject::Reset;
239f9d6d204SZachary Turner 
240b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
241f9d6d204SZachary Turner 
242b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
243f9d6d204SZachary Turner 
244b9c1b51eSKate Stone   size_t GetSize() const;
245f9d6d204SZachary Turner 
246b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
247f9d6d204SZachary Turner 
248b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
249f9d6d204SZachary Turner };
250f9d6d204SZachary Turner 
251b9c1b51eSKate Stone class PythonString : public PythonObject {
2522c1f46dcSZachary Turner public:
2532c1f46dcSZachary Turner   PythonString();
254f8b22f8fSZachary Turner   explicit PythonString(llvm::StringRef string);
255f8b22f8fSZachary Turner   explicit PythonString(const char *string);
25687f47729SZachary Turner   PythonString(PyRefType type, PyObject *o);
25787f47729SZachary Turner   PythonString(const PythonString &object);
258edb35d95SEugene Zelenko 
259f8b22f8fSZachary Turner   ~PythonString() override;
2602c1f46dcSZachary Turner 
26122c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
26222c8efcdSZachary Turner 
263f8b22f8fSZachary Turner   // Bring in the no-argument base class version
264f8b22f8fSZachary Turner   using PythonObject::Reset;
265f8b22f8fSZachary Turner 
266f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2672c1f46dcSZachary Turner 
268b9c1b51eSKate Stone   llvm::StringRef GetString() const;
2692c1f46dcSZachary Turner 
270b9c1b51eSKate Stone   size_t GetSize() const;
2712c1f46dcSZachary Turner 
2722c1f46dcSZachary Turner   void SetString(llvm::StringRef string);
2732c1f46dcSZachary Turner 
2742c1f46dcSZachary Turner   StructuredData::StringSP CreateStructuredString() const;
2752c1f46dcSZachary Turner };
2762c1f46dcSZachary Turner 
277b9c1b51eSKate Stone class PythonInteger : public PythonObject {
2782c1f46dcSZachary Turner public:
2792c1f46dcSZachary Turner   PythonInteger();
28087f47729SZachary Turner   explicit PythonInteger(int64_t value);
281f8b22f8fSZachary Turner   PythonInteger(PyRefType type, PyObject *o);
282f8b22f8fSZachary Turner   PythonInteger(const PythonInteger &object);
283edb35d95SEugene Zelenko 
284f8b22f8fSZachary Turner   ~PythonInteger() override;
2852c1f46dcSZachary Turner 
28622c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
28722c8efcdSZachary Turner 
288f8b22f8fSZachary Turner   // Bring in the no-argument base class version
289f8b22f8fSZachary Turner   using PythonObject::Reset;
290f8b22f8fSZachary Turner 
291f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2922c1f46dcSZachary Turner 
2932c1f46dcSZachary Turner   int64_t GetInteger() const;
2942c1f46dcSZachary Turner 
295b9c1b51eSKate Stone   void SetInteger(int64_t value);
2962c1f46dcSZachary Turner 
2972c1f46dcSZachary Turner   StructuredData::IntegerSP CreateStructuredInteger() const;
2982c1f46dcSZachary Turner };
2992c1f46dcSZachary Turner 
300b9c1b51eSKate Stone class PythonList : public PythonObject {
3012c1f46dcSZachary Turner public:
302a1405147SZachary Turner   PythonList() {}
30387f47729SZachary Turner   explicit PythonList(PyInitialValue value);
30487f47729SZachary Turner   explicit PythonList(int list_size);
305f8b22f8fSZachary Turner   PythonList(PyRefType type, PyObject *o);
306f8b22f8fSZachary Turner   PythonList(const PythonList &list);
307edb35d95SEugene Zelenko 
308f8b22f8fSZachary Turner   ~PythonList() override;
3092c1f46dcSZachary Turner 
31022c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
31122c8efcdSZachary Turner 
312f8b22f8fSZachary Turner   // Bring in the no-argument base class version
313f8b22f8fSZachary Turner   using PythonObject::Reset;
314f8b22f8fSZachary Turner 
315f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3162c1f46dcSZachary Turner 
3172c1f46dcSZachary Turner   uint32_t GetSize() const;
3182c1f46dcSZachary Turner 
3192c1f46dcSZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
3202c1f46dcSZachary Turner 
321f8b22f8fSZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
3222c1f46dcSZachary Turner 
323f8b22f8fSZachary Turner   void AppendItem(const PythonObject &object);
3242c1f46dcSZachary Turner 
3252c1f46dcSZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
3262c1f46dcSZachary Turner };
3272c1f46dcSZachary Turner 
328b9c1b51eSKate Stone class PythonTuple : public PythonObject {
329a1405147SZachary Turner public:
330a1405147SZachary Turner   PythonTuple() {}
331a1405147SZachary Turner   explicit PythonTuple(PyInitialValue value);
332a1405147SZachary Turner   explicit PythonTuple(int tuple_size);
333a1405147SZachary Turner   PythonTuple(PyRefType type, PyObject *o);
334a1405147SZachary Turner   PythonTuple(const PythonTuple &tuple);
335a1405147SZachary Turner   PythonTuple(std::initializer_list<PythonObject> objects);
336a1405147SZachary Turner   PythonTuple(std::initializer_list<PyObject *> objects);
337a1405147SZachary Turner 
338a1405147SZachary Turner   ~PythonTuple() override;
339a1405147SZachary Turner 
340a1405147SZachary Turner   static bool Check(PyObject *py_obj);
341a1405147SZachary Turner 
342a1405147SZachary Turner   // Bring in the no-argument base class version
343a1405147SZachary Turner   using PythonObject::Reset;
344a1405147SZachary Turner 
345a1405147SZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
346a1405147SZachary Turner 
347a1405147SZachary Turner   uint32_t GetSize() const;
348a1405147SZachary Turner 
349a1405147SZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
350a1405147SZachary Turner 
351a1405147SZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
352a1405147SZachary Turner 
353a1405147SZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
354a1405147SZachary Turner };
355a1405147SZachary Turner 
356b9c1b51eSKate Stone class PythonDictionary : public PythonObject {
3572c1f46dcSZachary Turner public:
358a1405147SZachary Turner   PythonDictionary() {}
35987f47729SZachary Turner   explicit PythonDictionary(PyInitialValue value);
360f8b22f8fSZachary Turner   PythonDictionary(PyRefType type, PyObject *o);
361f8b22f8fSZachary Turner   PythonDictionary(const PythonDictionary &dict);
362edb35d95SEugene Zelenko 
363f8b22f8fSZachary Turner   ~PythonDictionary() 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 
374f8b22f8fSZachary Turner   PythonList GetKeys() const;
3752c1f46dcSZachary Turner 
376f8b22f8fSZachary Turner   PythonObject GetItemForKey(const PythonObject &key) const;
377f8b22f8fSZachary Turner   void SetItemForKey(const PythonObject &key, const PythonObject &value);
3782c1f46dcSZachary Turner 
3792c1f46dcSZachary Turner   StructuredData::DictionarySP CreateStructuredDictionary() const;
3802c1f46dcSZachary Turner };
38187f47729SZachary Turner 
382b9c1b51eSKate Stone class PythonModule : public PythonObject {
3837841efbbSZachary Turner public:
3847841efbbSZachary Turner   PythonModule();
3857841efbbSZachary Turner   PythonModule(PyRefType type, PyObject *o);
3867841efbbSZachary Turner   PythonModule(const PythonModule &dict);
3877841efbbSZachary Turner 
3887841efbbSZachary Turner   ~PythonModule() override;
3897841efbbSZachary Turner 
3907841efbbSZachary Turner   static bool Check(PyObject *py_obj);
3917841efbbSZachary Turner 
392b9c1b51eSKate Stone   static PythonModule BuiltinsModule();
393a1405147SZachary Turner 
394b9c1b51eSKate Stone   static PythonModule MainModule();
395a1405147SZachary Turner 
396b9c1b51eSKate Stone   static PythonModule AddModule(llvm::StringRef module);
3977841efbbSZachary Turner 
398b9c1b51eSKate Stone   static PythonModule ImportModule(llvm::StringRef module);
3992419f1d5SZachary Turner 
4007841efbbSZachary Turner   // Bring in the no-argument base class version
4017841efbbSZachary Turner   using PythonObject::Reset;
4027841efbbSZachary Turner 
4037841efbbSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4047841efbbSZachary Turner 
4057841efbbSZachary Turner   PythonDictionary GetDictionary() const;
4067841efbbSZachary Turner };
4077841efbbSZachary Turner 
408b9c1b51eSKate Stone class PythonCallable : public PythonObject {
409a1405147SZachary Turner public:
410b58fb2f4SZachary Turner   struct ArgInfo {
411b58fb2f4SZachary Turner     size_t count;
412a5d6765cSEnrico Granata     bool is_bound_method : 1;
413b58fb2f4SZachary Turner     bool has_varargs : 1;
414b58fb2f4SZachary Turner     bool has_kwargs : 1;
415b58fb2f4SZachary Turner   };
416b58fb2f4SZachary Turner 
417a1405147SZachary Turner   PythonCallable();
418a1405147SZachary Turner   PythonCallable(PyRefType type, PyObject *o);
419a1405147SZachary Turner   PythonCallable(const PythonCallable &dict);
420a1405147SZachary Turner 
421a1405147SZachary Turner   ~PythonCallable() override;
422a1405147SZachary Turner 
423b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
424a1405147SZachary Turner 
425a1405147SZachary Turner   // Bring in the no-argument base class version
426a1405147SZachary Turner   using PythonObject::Reset;
427a1405147SZachary Turner 
428b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
429a1405147SZachary Turner 
430b9c1b51eSKate Stone   ArgInfo GetNumArguments() const;
431b58fb2f4SZachary Turner 
432b9c1b51eSKate Stone   PythonObject operator()();
433a1405147SZachary Turner 
434b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PyObject *> args);
435a1405147SZachary Turner 
436b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PythonObject> args);
437b58fb2f4SZachary Turner 
438b58fb2f4SZachary Turner   template <typename Arg, typename... Args>
439b9c1b51eSKate Stone   PythonObject operator()(const Arg &arg, Args... args) {
440b58fb2f4SZachary Turner     return operator()({arg, args...});
441b58fb2f4SZachary Turner   }
442a1405147SZachary Turner };
443a1405147SZachary Turner 
444b9c1b51eSKate Stone class PythonFile : public PythonObject {
4459c40264fSZachary Turner public:
44632064024SZachary Turner   PythonFile();
447eda01c31SZachary Turner   PythonFile(File &file, const char *mode);
448eda01c31SZachary Turner   PythonFile(const char *path, const char *mode);
4499c40264fSZachary Turner   PythonFile(PyRefType type, PyObject *o);
450edb35d95SEugene Zelenko 
4519c40264fSZachary Turner   ~PythonFile() override;
4529c40264fSZachary Turner 
4539c40264fSZachary Turner   static bool Check(PyObject *py_obj);
4549c40264fSZachary Turner 
4559c40264fSZachary Turner   using PythonObject::Reset;
4569c40264fSZachary Turner 
4579c40264fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4589c40264fSZachary Turner   void Reset(File &file, const char *mode);
459eda01c31SZachary Turner 
460744959b9SEnrico Granata   static uint32_t GetOptionsFromMode(llvm::StringRef mode);
461744959b9SEnrico Granata 
462eda01c31SZachary Turner   bool GetUnderlyingFile(File &file) const;
4639c40264fSZachary Turner };
4649c40264fSZachary Turner 
4652c1f46dcSZachary Turner } // namespace lldb_private
4662c1f46dcSZachary Turner 
467a281b42bSZachary Turner #endif
468d68983e3SPavel Labath 
469d68983e3SPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
470