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
2201c3243fSZachary Turner #include "lldb/Utility/Flags.h"
2301c3243fSZachary Turner 
249c40264fSZachary Turner #include "lldb/Host/File.h"
252c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h"
26bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
27*f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h"
289ba9dfddSPavel Labath #include "lldb/lldb-defines.h"
292c1f46dcSZachary Turner 
305a72c02bSZachary Turner #include "llvm/ADT/ArrayRef.h"
315a72c02bSZachary Turner 
322c1f46dcSZachary Turner namespace lldb_private {
33edb35d95SEugene Zelenko 
345a72c02bSZachary Turner class PythonBytes;
352c1f46dcSZachary Turner class PythonString;
362c1f46dcSZachary Turner class PythonList;
372c1f46dcSZachary Turner class PythonDictionary;
382c1f46dcSZachary Turner class PythonInteger;
392c1f46dcSZachary Turner 
40b9c1b51eSKate Stone class StructuredPythonObject : public StructuredData::Generic {
412c1f46dcSZachary Turner public:
42b9c1b51eSKate Stone   StructuredPythonObject() : StructuredData::Generic() {}
432c1f46dcSZachary Turner 
44b9c1b51eSKate Stone   StructuredPythonObject(void *obj) : StructuredData::Generic(obj) {
452c1f46dcSZachary Turner     Py_XINCREF(GetValue());
462c1f46dcSZachary Turner   }
472c1f46dcSZachary Turner 
48b9c1b51eSKate Stone   ~StructuredPythonObject() override {
492c1f46dcSZachary Turner     if (Py_IsInitialized())
502c1f46dcSZachary Turner       Py_XDECREF(GetValue());
512c1f46dcSZachary Turner     SetValue(nullptr);
522c1f46dcSZachary Turner   }
532c1f46dcSZachary Turner 
54b9c1b51eSKate Stone   bool IsValid() const override { return GetValue() && GetValue() != Py_None; }
552c1f46dcSZachary Turner 
56d9c9da53SJason Molenda   void Dump(Stream &s, bool pretty_print = true) const override;
572c1f46dcSZachary Turner 
582c1f46dcSZachary Turner private:
592c1f46dcSZachary Turner   DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
602c1f46dcSZachary Turner };
612c1f46dcSZachary Turner 
62b9c1b51eSKate Stone enum class PyObjectType {
632c1f46dcSZachary Turner   Unknown,
642c1f46dcSZachary Turner   None,
652c1f46dcSZachary Turner   Integer,
662c1f46dcSZachary Turner   Dictionary,
672c1f46dcSZachary Turner   List,
689c40264fSZachary Turner   String,
695a72c02bSZachary Turner   Bytes,
70f9d6d204SZachary Turner   ByteArray,
717841efbbSZachary Turner   Module,
72a1405147SZachary Turner   Callable,
73a1405147SZachary Turner   Tuple,
749c40264fSZachary Turner   File
752c1f46dcSZachary Turner };
762c1f46dcSZachary Turner 
77b9c1b51eSKate Stone enum class PyRefType {
78f8b22f8fSZachary Turner   Borrowed, // We are not given ownership of the incoming PyObject.
79f8b22f8fSZachary Turner             // We cannot safely hold it without calling Py_INCREF.
80f8b22f8fSZachary Turner   Owned     // We have ownership of the incoming PyObject.  We should
81f8b22f8fSZachary Turner             // not call Py_INCREF.
82f8b22f8fSZachary Turner };
83f8b22f8fSZachary Turner 
84b9c1b51eSKate Stone enum class PyInitialValue { Invalid, Empty };
85f8b22f8fSZachary Turner 
86b9c1b51eSKate Stone class PythonObject {
872c1f46dcSZachary Turner public:
88b9c1b51eSKate Stone   PythonObject() : m_py_obj(nullptr) {}
892c1f46dcSZachary Turner 
90b9c1b51eSKate Stone   PythonObject(PyRefType type, PyObject *py_obj) : m_py_obj(nullptr) {
91f8b22f8fSZachary Turner     Reset(type, py_obj);
922c1f46dcSZachary Turner   }
932c1f46dcSZachary Turner 
94b9c1b51eSKate Stone   PythonObject(const PythonObject &rhs) : m_py_obj(nullptr) { Reset(rhs); }
952c1f46dcSZachary Turner 
96b9c1b51eSKate Stone   virtual ~PythonObject() { Reset(); }
972c1f46dcSZachary Turner 
98b9c1b51eSKate Stone   void Reset() {
99f8b22f8fSZachary Turner     // Avoid calling the virtual method since it's not necessary
100f8b22f8fSZachary Turner     // to actually validate the type of the PyObject if we're
101f8b22f8fSZachary Turner     // just setting to null.
1022c1f46dcSZachary Turner     if (Py_IsInitialized())
1032c1f46dcSZachary Turner       Py_XDECREF(m_py_obj);
104f8b22f8fSZachary Turner     m_py_obj = nullptr;
1052c1f46dcSZachary Turner   }
106f8b22f8fSZachary Turner 
107b9c1b51eSKate Stone   void Reset(const PythonObject &rhs) {
108f8b22f8fSZachary Turner     // Avoid calling the virtual method if it's not necessary
109f8b22f8fSZachary Turner     // to actually validate the type of the PyObject.
11060c24f70SZachary Turner     if (!rhs.IsValid())
111f8b22f8fSZachary Turner       Reset();
112f8b22f8fSZachary Turner     else
113f8b22f8fSZachary Turner       Reset(PyRefType::Borrowed, rhs.m_py_obj);
114f8b22f8fSZachary Turner   }
115f8b22f8fSZachary Turner 
116f8b22f8fSZachary Turner   // PythonObject is implicitly convertible to PyObject *, which will call the
117f8b22f8fSZachary Turner   // wrong overload.  We want to explicitly disallow this, since a PyObject
118f8b22f8fSZachary Turner   // *always* owns its reference.  Therefore the overload which takes a
119f8b22f8fSZachary Turner   // PyRefType doesn't make sense, and the copy constructor should be used.
120b9c1b51eSKate Stone   void Reset(PyRefType type, const PythonObject &ref) = delete;
121f8b22f8fSZachary Turner 
122b9c1b51eSKate Stone   virtual void Reset(PyRefType type, PyObject *py_obj) {
123f8b22f8fSZachary Turner     if (py_obj == m_py_obj)
124f8b22f8fSZachary Turner       return;
125f8b22f8fSZachary Turner 
126f8b22f8fSZachary Turner     if (Py_IsInitialized())
127f8b22f8fSZachary Turner       Py_XDECREF(m_py_obj);
128f8b22f8fSZachary Turner 
129f8b22f8fSZachary Turner     m_py_obj = py_obj;
130f8b22f8fSZachary Turner 
131f8b22f8fSZachary Turner     // If this is a borrowed reference, we need to convert it to
132f8b22f8fSZachary Turner     // an owned reference by incrementing it.  If it is an owned
133f8b22f8fSZachary Turner     // reference (for example the caller allocated it with PyDict_New()
134f8b22f8fSZachary Turner     // then we must *not* increment it.
135f8b22f8fSZachary Turner     if (Py_IsInitialized() && type == PyRefType::Borrowed)
136f8b22f8fSZachary Turner       Py_XINCREF(m_py_obj);
1372c1f46dcSZachary Turner   }
1382c1f46dcSZachary Turner 
139b9c1b51eSKate Stone   void Dump() const {
1402c1f46dcSZachary Turner     if (m_py_obj)
1412c1f46dcSZachary Turner       _PyObject_Dump(m_py_obj);
1422c1f46dcSZachary Turner     else
1432c1f46dcSZachary Turner       puts("NULL");
1442c1f46dcSZachary Turner   }
1452c1f46dcSZachary Turner 
146b9c1b51eSKate Stone   void Dump(Stream &strm) const;
1472c1f46dcSZachary Turner 
148b9c1b51eSKate Stone   PyObject *get() const { return m_py_obj; }
1492c1f46dcSZachary Turner 
150b9c1b51eSKate Stone   PyObject *release() {
15160c24f70SZachary Turner     PyObject *result = m_py_obj;
15260c24f70SZachary Turner     m_py_obj = nullptr;
15360c24f70SZachary Turner     return result;
15460c24f70SZachary Turner   }
15560c24f70SZachary Turner 
156b9c1b51eSKate Stone   PythonObject &operator=(const PythonObject &other) {
157f8b22f8fSZachary Turner     Reset(PyRefType::Borrowed, other.get());
158f8b22f8fSZachary Turner     return *this;
1592c1f46dcSZachary Turner   }
1602c1f46dcSZachary Turner 
161b9c1b51eSKate Stone   PyObjectType GetObjectType() const;
1627841efbbSZachary Turner 
163b9c1b51eSKate Stone   PythonString Repr() const;
1647841efbbSZachary Turner 
165b9c1b51eSKate Stone   PythonString Str() const;
1667841efbbSZachary Turner 
167b9c1b51eSKate Stone   static PythonObject ResolveNameWithDictionary(llvm::StringRef name,
168b9c1b51eSKate Stone                                                 const PythonDictionary &dict);
1697841efbbSZachary Turner 
170b58fb2f4SZachary Turner   template <typename T>
171b9c1b51eSKate Stone   static T ResolveNameWithDictionary(llvm::StringRef name,
172b9c1b51eSKate Stone                                      const PythonDictionary &dict) {
173b58fb2f4SZachary Turner     return ResolveNameWithDictionary(name, dict).AsType<T>();
174b58fb2f4SZachary Turner   }
175b58fb2f4SZachary Turner 
176b9c1b51eSKate Stone   PythonObject ResolveName(llvm::StringRef name) const;
1777841efbbSZachary Turner 
178b9c1b51eSKate Stone   template <typename T> T ResolveName(llvm::StringRef name) const {
179b58fb2f4SZachary Turner     return ResolveName(name).AsType<T>();
180b58fb2f4SZachary Turner   }
181b58fb2f4SZachary Turner 
182b9c1b51eSKate Stone   bool HasAttribute(llvm::StringRef attribute) const;
1839c40264fSZachary Turner 
184b9c1b51eSKate Stone   PythonObject GetAttributeValue(llvm::StringRef attribute) const;
1857d6d218eSZachary Turner 
186b9c1b51eSKate Stone   bool IsValid() const;
187f8b22f8fSZachary Turner 
188b9c1b51eSKate Stone   bool IsAllocated() const;
189f8b22f8fSZachary Turner 
190b9c1b51eSKate Stone   bool IsNone() const;
1912c1f46dcSZachary Turner 
192b9c1b51eSKate Stone   template <typename T> T AsType() const {
1937d6d218eSZachary Turner     if (!T::Check(m_py_obj))
1947d6d218eSZachary Turner       return T();
1957d6d218eSZachary Turner     return T(PyRefType::Borrowed, m_py_obj);
1967d6d218eSZachary Turner   }
1977d6d218eSZachary Turner 
198b9c1b51eSKate Stone   StructuredData::ObjectSP CreateStructuredObject() const;
1992c1f46dcSZachary Turner 
2002c1f46dcSZachary Turner protected:
2012c1f46dcSZachary Turner   PyObject *m_py_obj;
2022c1f46dcSZachary Turner };
2032c1f46dcSZachary Turner 
204b9c1b51eSKate Stone class PythonBytes : public PythonObject {
2055a72c02bSZachary Turner public:
2065a72c02bSZachary Turner   PythonBytes();
2075a72c02bSZachary Turner   explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
2085a72c02bSZachary Turner   PythonBytes(const uint8_t *bytes, size_t length);
2095a72c02bSZachary Turner   PythonBytes(PyRefType type, PyObject *o);
2105a72c02bSZachary Turner   PythonBytes(const PythonBytes &object);
2115a72c02bSZachary Turner 
2125a72c02bSZachary Turner   ~PythonBytes() override;
2135a72c02bSZachary Turner 
214b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
2155a72c02bSZachary Turner 
2165a72c02bSZachary Turner   // Bring in the no-argument base class version
2175a72c02bSZachary Turner   using PythonObject::Reset;
2185a72c02bSZachary Turner 
219b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
2205a72c02bSZachary Turner 
221b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
2225a72c02bSZachary Turner 
223b9c1b51eSKate Stone   size_t GetSize() const;
2245a72c02bSZachary Turner 
225b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2265a72c02bSZachary Turner 
227b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
2285a72c02bSZachary Turner };
2295a72c02bSZachary Turner 
230b9c1b51eSKate Stone class PythonByteArray : public PythonObject {
231f9d6d204SZachary Turner public:
232f9d6d204SZachary Turner   PythonByteArray();
233f9d6d204SZachary Turner   explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
234f9d6d204SZachary Turner   PythonByteArray(const uint8_t *bytes, size_t length);
235f9d6d204SZachary Turner   PythonByteArray(PyRefType type, PyObject *o);
236f9d6d204SZachary Turner   PythonByteArray(const PythonBytes &object);
237f9d6d204SZachary Turner 
238f9d6d204SZachary Turner   ~PythonByteArray() override;
239f9d6d204SZachary Turner 
240b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
241f9d6d204SZachary Turner 
242f9d6d204SZachary Turner   // Bring in the no-argument base class version
243f9d6d204SZachary Turner   using PythonObject::Reset;
244f9d6d204SZachary Turner 
245b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
246f9d6d204SZachary Turner 
247b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
248f9d6d204SZachary Turner 
249b9c1b51eSKate Stone   size_t GetSize() const;
250f9d6d204SZachary Turner 
251b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
252f9d6d204SZachary Turner 
253b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
254f9d6d204SZachary Turner };
255f9d6d204SZachary Turner 
256b9c1b51eSKate Stone class PythonString : public PythonObject {
2572c1f46dcSZachary Turner public:
2582c1f46dcSZachary Turner   PythonString();
259f8b22f8fSZachary Turner   explicit PythonString(llvm::StringRef string);
260f8b22f8fSZachary Turner   explicit PythonString(const char *string);
26187f47729SZachary Turner   PythonString(PyRefType type, PyObject *o);
26287f47729SZachary Turner   PythonString(const PythonString &object);
263edb35d95SEugene Zelenko 
264f8b22f8fSZachary Turner   ~PythonString() override;
2652c1f46dcSZachary Turner 
26622c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
26722c8efcdSZachary Turner 
268f8b22f8fSZachary Turner   // Bring in the no-argument base class version
269f8b22f8fSZachary Turner   using PythonObject::Reset;
270f8b22f8fSZachary Turner 
271f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2722c1f46dcSZachary Turner 
273b9c1b51eSKate Stone   llvm::StringRef GetString() const;
2742c1f46dcSZachary Turner 
275b9c1b51eSKate Stone   size_t GetSize() const;
2762c1f46dcSZachary Turner 
2772c1f46dcSZachary Turner   void SetString(llvm::StringRef string);
2782c1f46dcSZachary Turner 
2792c1f46dcSZachary Turner   StructuredData::StringSP CreateStructuredString() const;
2802c1f46dcSZachary Turner };
2812c1f46dcSZachary Turner 
282b9c1b51eSKate Stone class PythonInteger : public PythonObject {
2832c1f46dcSZachary Turner public:
2842c1f46dcSZachary Turner   PythonInteger();
28587f47729SZachary Turner   explicit PythonInteger(int64_t value);
286f8b22f8fSZachary Turner   PythonInteger(PyRefType type, PyObject *o);
287f8b22f8fSZachary Turner   PythonInteger(const PythonInteger &object);
288edb35d95SEugene Zelenko 
289f8b22f8fSZachary Turner   ~PythonInteger() override;
2902c1f46dcSZachary Turner 
29122c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
29222c8efcdSZachary Turner 
293f8b22f8fSZachary Turner   // Bring in the no-argument base class version
294f8b22f8fSZachary Turner   using PythonObject::Reset;
295f8b22f8fSZachary Turner 
296f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2972c1f46dcSZachary Turner 
2982c1f46dcSZachary Turner   int64_t GetInteger() const;
2992c1f46dcSZachary Turner 
300b9c1b51eSKate Stone   void SetInteger(int64_t value);
3012c1f46dcSZachary Turner 
3022c1f46dcSZachary Turner   StructuredData::IntegerSP CreateStructuredInteger() const;
3032c1f46dcSZachary Turner };
3042c1f46dcSZachary Turner 
305b9c1b51eSKate Stone class PythonList : public PythonObject {
3062c1f46dcSZachary Turner public:
307a1405147SZachary Turner   PythonList() {}
30887f47729SZachary Turner   explicit PythonList(PyInitialValue value);
30987f47729SZachary Turner   explicit PythonList(int list_size);
310f8b22f8fSZachary Turner   PythonList(PyRefType type, PyObject *o);
311f8b22f8fSZachary Turner   PythonList(const PythonList &list);
312edb35d95SEugene Zelenko 
313f8b22f8fSZachary Turner   ~PythonList() override;
3142c1f46dcSZachary Turner 
31522c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
31622c8efcdSZachary Turner 
317f8b22f8fSZachary Turner   // Bring in the no-argument base class version
318f8b22f8fSZachary Turner   using PythonObject::Reset;
319f8b22f8fSZachary Turner 
320f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3212c1f46dcSZachary Turner 
3222c1f46dcSZachary Turner   uint32_t GetSize() const;
3232c1f46dcSZachary Turner 
3242c1f46dcSZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
3252c1f46dcSZachary Turner 
326f8b22f8fSZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
3272c1f46dcSZachary Turner 
328f8b22f8fSZachary Turner   void AppendItem(const PythonObject &object);
3292c1f46dcSZachary Turner 
3302c1f46dcSZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
3312c1f46dcSZachary Turner };
3322c1f46dcSZachary Turner 
333b9c1b51eSKate Stone class PythonTuple : public PythonObject {
334a1405147SZachary Turner public:
335a1405147SZachary Turner   PythonTuple() {}
336a1405147SZachary Turner   explicit PythonTuple(PyInitialValue value);
337a1405147SZachary Turner   explicit PythonTuple(int tuple_size);
338a1405147SZachary Turner   PythonTuple(PyRefType type, PyObject *o);
339a1405147SZachary Turner   PythonTuple(const PythonTuple &tuple);
340a1405147SZachary Turner   PythonTuple(std::initializer_list<PythonObject> objects);
341a1405147SZachary Turner   PythonTuple(std::initializer_list<PyObject *> objects);
342a1405147SZachary Turner 
343a1405147SZachary Turner   ~PythonTuple() override;
344a1405147SZachary Turner 
345a1405147SZachary Turner   static bool Check(PyObject *py_obj);
346a1405147SZachary Turner 
347a1405147SZachary Turner   // Bring in the no-argument base class version
348a1405147SZachary Turner   using PythonObject::Reset;
349a1405147SZachary Turner 
350a1405147SZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
351a1405147SZachary Turner 
352a1405147SZachary Turner   uint32_t GetSize() const;
353a1405147SZachary Turner 
354a1405147SZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
355a1405147SZachary Turner 
356a1405147SZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
357a1405147SZachary Turner 
358a1405147SZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
359a1405147SZachary Turner };
360a1405147SZachary Turner 
361b9c1b51eSKate Stone class PythonDictionary : public PythonObject {
3622c1f46dcSZachary Turner public:
363a1405147SZachary Turner   PythonDictionary() {}
36487f47729SZachary Turner   explicit PythonDictionary(PyInitialValue value);
365f8b22f8fSZachary Turner   PythonDictionary(PyRefType type, PyObject *o);
366f8b22f8fSZachary Turner   PythonDictionary(const PythonDictionary &dict);
367edb35d95SEugene Zelenko 
368f8b22f8fSZachary Turner   ~PythonDictionary() override;
3692c1f46dcSZachary Turner 
37022c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
37122c8efcdSZachary Turner 
372f8b22f8fSZachary Turner   // Bring in the no-argument base class version
373f8b22f8fSZachary Turner   using PythonObject::Reset;
374f8b22f8fSZachary Turner 
375f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3762c1f46dcSZachary Turner 
3772c1f46dcSZachary Turner   uint32_t GetSize() const;
3782c1f46dcSZachary Turner 
379f8b22f8fSZachary Turner   PythonList GetKeys() const;
3802c1f46dcSZachary Turner 
381f8b22f8fSZachary Turner   PythonObject GetItemForKey(const PythonObject &key) const;
382f8b22f8fSZachary Turner   void SetItemForKey(const PythonObject &key, const PythonObject &value);
3832c1f46dcSZachary Turner 
3842c1f46dcSZachary Turner   StructuredData::DictionarySP CreateStructuredDictionary() const;
3852c1f46dcSZachary Turner };
38687f47729SZachary Turner 
387b9c1b51eSKate Stone class PythonModule : public PythonObject {
3887841efbbSZachary Turner public:
3897841efbbSZachary Turner   PythonModule();
3907841efbbSZachary Turner   PythonModule(PyRefType type, PyObject *o);
3917841efbbSZachary Turner   PythonModule(const PythonModule &dict);
3927841efbbSZachary Turner 
3937841efbbSZachary Turner   ~PythonModule() override;
3947841efbbSZachary Turner 
3957841efbbSZachary Turner   static bool Check(PyObject *py_obj);
3967841efbbSZachary Turner 
397b9c1b51eSKate Stone   static PythonModule BuiltinsModule();
398a1405147SZachary Turner 
399b9c1b51eSKate Stone   static PythonModule MainModule();
400a1405147SZachary Turner 
401b9c1b51eSKate Stone   static PythonModule AddModule(llvm::StringRef module);
4027841efbbSZachary Turner 
403b9c1b51eSKate Stone   static PythonModule ImportModule(llvm::StringRef module);
4042419f1d5SZachary Turner 
4057841efbbSZachary Turner   // Bring in the no-argument base class version
4067841efbbSZachary Turner   using PythonObject::Reset;
4077841efbbSZachary Turner 
4087841efbbSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4097841efbbSZachary Turner 
4107841efbbSZachary Turner   PythonDictionary GetDictionary() const;
4117841efbbSZachary Turner };
4127841efbbSZachary Turner 
413b9c1b51eSKate Stone class PythonCallable : public PythonObject {
414a1405147SZachary Turner public:
415b58fb2f4SZachary Turner   struct ArgInfo {
416b58fb2f4SZachary Turner     size_t count;
417a5d6765cSEnrico Granata     bool is_bound_method : 1;
418b58fb2f4SZachary Turner     bool has_varargs : 1;
419b58fb2f4SZachary Turner     bool has_kwargs : 1;
420b58fb2f4SZachary Turner   };
421b58fb2f4SZachary Turner 
422a1405147SZachary Turner   PythonCallable();
423a1405147SZachary Turner   PythonCallable(PyRefType type, PyObject *o);
424a1405147SZachary Turner   PythonCallable(const PythonCallable &dict);
425a1405147SZachary Turner 
426a1405147SZachary Turner   ~PythonCallable() override;
427a1405147SZachary Turner 
428b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
429a1405147SZachary Turner 
430a1405147SZachary Turner   // Bring in the no-argument base class version
431a1405147SZachary Turner   using PythonObject::Reset;
432a1405147SZachary Turner 
433b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
434a1405147SZachary Turner 
435b9c1b51eSKate Stone   ArgInfo GetNumArguments() const;
436b58fb2f4SZachary Turner 
437b9c1b51eSKate Stone   PythonObject operator()();
438a1405147SZachary Turner 
439b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PyObject *> args);
440a1405147SZachary Turner 
441b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PythonObject> args);
442b58fb2f4SZachary Turner 
443b58fb2f4SZachary Turner   template <typename Arg, typename... Args>
444b9c1b51eSKate Stone   PythonObject operator()(const Arg &arg, Args... args) {
445b58fb2f4SZachary Turner     return operator()({arg, args...});
446b58fb2f4SZachary Turner   }
447a1405147SZachary Turner };
448a1405147SZachary Turner 
449b9c1b51eSKate Stone class PythonFile : public PythonObject {
4509c40264fSZachary Turner public:
45132064024SZachary Turner   PythonFile();
452eda01c31SZachary Turner   PythonFile(File &file, const char *mode);
453eda01c31SZachary Turner   PythonFile(const char *path, const char *mode);
4549c40264fSZachary Turner   PythonFile(PyRefType type, PyObject *o);
455edb35d95SEugene Zelenko 
4569c40264fSZachary Turner   ~PythonFile() override;
4579c40264fSZachary Turner 
4589c40264fSZachary Turner   static bool Check(PyObject *py_obj);
4599c40264fSZachary Turner 
4609c40264fSZachary Turner   using PythonObject::Reset;
4619c40264fSZachary Turner 
4629c40264fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4639c40264fSZachary Turner   void Reset(File &file, const char *mode);
464eda01c31SZachary Turner 
465744959b9SEnrico Granata   static uint32_t GetOptionsFromMode(llvm::StringRef mode);
466744959b9SEnrico Granata 
467eda01c31SZachary Turner   bool GetUnderlyingFile(File &file) const;
4689c40264fSZachary Turner };
4699c40264fSZachary Turner 
4702c1f46dcSZachary Turner } // namespace lldb_private
4712c1f46dcSZachary Turner 
472a281b42bSZachary Turner #endif
473a281b42bSZachary Turner 
4742c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
475