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 
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,
60*b81d715cSTatyana Krasnukha   Boolean,
612c1f46dcSZachary Turner   Integer,
622c1f46dcSZachary Turner   Dictionary,
632c1f46dcSZachary Turner   List,
649c40264fSZachary Turner   String,
655a72c02bSZachary Turner   Bytes,
66f9d6d204SZachary Turner   ByteArray,
677841efbbSZachary Turner   Module,
68a1405147SZachary Turner   Callable,
69a1405147SZachary Turner   Tuple,
709c40264fSZachary Turner   File
712c1f46dcSZachary Turner };
722c1f46dcSZachary Turner 
73b9c1b51eSKate Stone enum class PyRefType {
74f8b22f8fSZachary Turner   Borrowed, // We are not given ownership of the incoming PyObject.
75f8b22f8fSZachary Turner             // We cannot safely hold it without calling Py_INCREF.
76f8b22f8fSZachary Turner   Owned     // We have ownership of the incoming PyObject.  We should
77f8b22f8fSZachary Turner             // not call Py_INCREF.
78f8b22f8fSZachary Turner };
79f8b22f8fSZachary Turner 
80b9c1b51eSKate Stone enum class PyInitialValue { Invalid, Empty };
81f8b22f8fSZachary Turner 
82b9c1b51eSKate Stone class PythonObject {
832c1f46dcSZachary Turner public:
84b9c1b51eSKate Stone   PythonObject() : m_py_obj(nullptr) {}
852c1f46dcSZachary Turner 
86b9c1b51eSKate Stone   PythonObject(PyRefType type, PyObject *py_obj) : m_py_obj(nullptr) {
87f8b22f8fSZachary Turner     Reset(type, py_obj);
882c1f46dcSZachary Turner   }
892c1f46dcSZachary Turner 
90b9c1b51eSKate Stone   PythonObject(const PythonObject &rhs) : m_py_obj(nullptr) { Reset(rhs); }
912c1f46dcSZachary Turner 
92b9c1b51eSKate Stone   virtual ~PythonObject() { Reset(); }
932c1f46dcSZachary Turner 
94b9c1b51eSKate Stone   void Reset() {
95f8b22f8fSZachary Turner     // Avoid calling the virtual method since it's not necessary
96f8b22f8fSZachary Turner     // to actually validate the type of the PyObject if we're
97f8b22f8fSZachary Turner     // just setting to null.
982c1f46dcSZachary Turner     if (Py_IsInitialized())
992c1f46dcSZachary Turner       Py_XDECREF(m_py_obj);
100f8b22f8fSZachary Turner     m_py_obj = nullptr;
1012c1f46dcSZachary Turner   }
102f8b22f8fSZachary Turner 
103b9c1b51eSKate Stone   void Reset(const PythonObject &rhs) {
104f8b22f8fSZachary Turner     // Avoid calling the virtual method if it's not necessary
105f8b22f8fSZachary Turner     // to actually validate the type of the PyObject.
10660c24f70SZachary Turner     if (!rhs.IsValid())
107f8b22f8fSZachary Turner       Reset();
108f8b22f8fSZachary Turner     else
109f8b22f8fSZachary Turner       Reset(PyRefType::Borrowed, rhs.m_py_obj);
110f8b22f8fSZachary Turner   }
111f8b22f8fSZachary Turner 
112f8b22f8fSZachary Turner   // PythonObject is implicitly convertible to PyObject *, which will call the
113f8b22f8fSZachary Turner   // wrong overload.  We want to explicitly disallow this, since a PyObject
114f8b22f8fSZachary Turner   // *always* owns its reference.  Therefore the overload which takes a
115f8b22f8fSZachary Turner   // PyRefType doesn't make sense, and the copy constructor should be used.
116b9c1b51eSKate Stone   void Reset(PyRefType type, const PythonObject &ref) = delete;
117f8b22f8fSZachary Turner 
118b9c1b51eSKate Stone   virtual void Reset(PyRefType type, PyObject *py_obj) {
119f8b22f8fSZachary Turner     if (py_obj == m_py_obj)
120f8b22f8fSZachary Turner       return;
121f8b22f8fSZachary Turner 
122f8b22f8fSZachary Turner     if (Py_IsInitialized())
123f8b22f8fSZachary Turner       Py_XDECREF(m_py_obj);
124f8b22f8fSZachary Turner 
125f8b22f8fSZachary Turner     m_py_obj = py_obj;
126f8b22f8fSZachary Turner 
127f8b22f8fSZachary Turner     // If this is a borrowed reference, we need to convert it to
128f8b22f8fSZachary Turner     // an owned reference by incrementing it.  If it is an owned
129f8b22f8fSZachary Turner     // reference (for example the caller allocated it with PyDict_New()
130f8b22f8fSZachary Turner     // then we must *not* increment it.
131f8b22f8fSZachary Turner     if (Py_IsInitialized() && type == PyRefType::Borrowed)
132f8b22f8fSZachary Turner       Py_XINCREF(m_py_obj);
1332c1f46dcSZachary Turner   }
1342c1f46dcSZachary Turner 
135b9c1b51eSKate Stone   void Dump() const {
1362c1f46dcSZachary Turner     if (m_py_obj)
1372c1f46dcSZachary Turner       _PyObject_Dump(m_py_obj);
1382c1f46dcSZachary Turner     else
1392c1f46dcSZachary Turner       puts("NULL");
1402c1f46dcSZachary Turner   }
1412c1f46dcSZachary Turner 
142b9c1b51eSKate Stone   void Dump(Stream &strm) const;
1432c1f46dcSZachary Turner 
144b9c1b51eSKate Stone   PyObject *get() const { return m_py_obj; }
1452c1f46dcSZachary Turner 
146b9c1b51eSKate Stone   PyObject *release() {
14760c24f70SZachary Turner     PyObject *result = m_py_obj;
14860c24f70SZachary Turner     m_py_obj = nullptr;
14960c24f70SZachary Turner     return result;
15060c24f70SZachary Turner   }
15160c24f70SZachary Turner 
152b9c1b51eSKate Stone   PythonObject &operator=(const PythonObject &other) {
153f8b22f8fSZachary Turner     Reset(PyRefType::Borrowed, other.get());
154f8b22f8fSZachary Turner     return *this;
1552c1f46dcSZachary Turner   }
1562c1f46dcSZachary Turner 
157b9c1b51eSKate Stone   PyObjectType GetObjectType() const;
1587841efbbSZachary Turner 
159b9c1b51eSKate Stone   PythonString Repr() const;
1607841efbbSZachary Turner 
161b9c1b51eSKate Stone   PythonString Str() const;
1627841efbbSZachary Turner 
163b9c1b51eSKate Stone   static PythonObject ResolveNameWithDictionary(llvm::StringRef name,
164b9c1b51eSKate Stone                                                 const PythonDictionary &dict);
1657841efbbSZachary Turner 
166b58fb2f4SZachary Turner   template <typename T>
167b9c1b51eSKate Stone   static T ResolveNameWithDictionary(llvm::StringRef name,
168b9c1b51eSKate Stone                                      const PythonDictionary &dict) {
169b58fb2f4SZachary Turner     return ResolveNameWithDictionary(name, dict).AsType<T>();
170b58fb2f4SZachary Turner   }
171b58fb2f4SZachary Turner 
172b9c1b51eSKate Stone   PythonObject ResolveName(llvm::StringRef name) const;
1737841efbbSZachary Turner 
174b9c1b51eSKate Stone   template <typename T> T ResolveName(llvm::StringRef name) const {
175b58fb2f4SZachary Turner     return ResolveName(name).AsType<T>();
176b58fb2f4SZachary Turner   }
177b58fb2f4SZachary Turner 
178b9c1b51eSKate Stone   bool HasAttribute(llvm::StringRef attribute) const;
1799c40264fSZachary Turner 
180b9c1b51eSKate Stone   PythonObject GetAttributeValue(llvm::StringRef attribute) const;
1817d6d218eSZachary Turner 
182b9c1b51eSKate Stone   bool IsValid() const;
183f8b22f8fSZachary Turner 
184b9c1b51eSKate Stone   bool IsAllocated() const;
185f8b22f8fSZachary Turner 
186b9c1b51eSKate Stone   bool IsNone() const;
1872c1f46dcSZachary Turner 
188b9c1b51eSKate Stone   template <typename T> T AsType() const {
1897d6d218eSZachary Turner     if (!T::Check(m_py_obj))
1907d6d218eSZachary Turner       return T();
1917d6d218eSZachary Turner     return T(PyRefType::Borrowed, m_py_obj);
1927d6d218eSZachary Turner   }
1937d6d218eSZachary Turner 
194b9c1b51eSKate Stone   StructuredData::ObjectSP CreateStructuredObject() const;
1952c1f46dcSZachary Turner 
1962c1f46dcSZachary Turner protected:
1972c1f46dcSZachary Turner   PyObject *m_py_obj;
1982c1f46dcSZachary Turner };
1992c1f46dcSZachary Turner 
200b9c1b51eSKate Stone class PythonBytes : public PythonObject {
2015a72c02bSZachary Turner public:
2025a72c02bSZachary Turner   PythonBytes();
2035a72c02bSZachary Turner   explicit PythonBytes(llvm::ArrayRef<uint8_t> bytes);
2045a72c02bSZachary Turner   PythonBytes(const uint8_t *bytes, size_t length);
2055a72c02bSZachary Turner   PythonBytes(PyRefType type, PyObject *o);
2065a72c02bSZachary Turner   PythonBytes(const PythonBytes &object);
2075a72c02bSZachary Turner 
2085a72c02bSZachary Turner   ~PythonBytes() override;
2095a72c02bSZachary Turner 
210b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
2115a72c02bSZachary Turner 
2125a72c02bSZachary Turner   // Bring in the no-argument base class version
2135a72c02bSZachary Turner   using PythonObject::Reset;
2145a72c02bSZachary Turner 
215b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
2165a72c02bSZachary Turner 
217b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
2185a72c02bSZachary Turner 
219b9c1b51eSKate Stone   size_t GetSize() const;
2205a72c02bSZachary Turner 
221b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
2225a72c02bSZachary Turner 
223b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
2245a72c02bSZachary Turner };
2255a72c02bSZachary Turner 
226b9c1b51eSKate Stone class PythonByteArray : public PythonObject {
227f9d6d204SZachary Turner public:
228f9d6d204SZachary Turner   PythonByteArray();
229f9d6d204SZachary Turner   explicit PythonByteArray(llvm::ArrayRef<uint8_t> bytes);
230f9d6d204SZachary Turner   PythonByteArray(const uint8_t *bytes, size_t length);
231f9d6d204SZachary Turner   PythonByteArray(PyRefType type, PyObject *o);
232f9d6d204SZachary Turner   PythonByteArray(const PythonBytes &object);
233f9d6d204SZachary Turner 
234f9d6d204SZachary Turner   ~PythonByteArray() override;
235f9d6d204SZachary Turner 
236b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
237f9d6d204SZachary Turner 
238f9d6d204SZachary Turner   // Bring in the no-argument base class version
239f9d6d204SZachary Turner   using PythonObject::Reset;
240f9d6d204SZachary Turner 
241b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
242f9d6d204SZachary Turner 
243b9c1b51eSKate Stone   llvm::ArrayRef<uint8_t> GetBytes() const;
244f9d6d204SZachary Turner 
245b9c1b51eSKate Stone   size_t GetSize() const;
246f9d6d204SZachary Turner 
247b9c1b51eSKate Stone   void SetBytes(llvm::ArrayRef<uint8_t> stringbytes);
248f9d6d204SZachary Turner 
249b9c1b51eSKate Stone   StructuredData::StringSP CreateStructuredString() const;
250f9d6d204SZachary Turner };
251f9d6d204SZachary Turner 
252b9c1b51eSKate Stone class PythonString : public PythonObject {
2532c1f46dcSZachary Turner public:
2542c1f46dcSZachary Turner   PythonString();
255f8b22f8fSZachary Turner   explicit PythonString(llvm::StringRef string);
256f8b22f8fSZachary Turner   explicit PythonString(const char *string);
25787f47729SZachary Turner   PythonString(PyRefType type, PyObject *o);
25887f47729SZachary Turner   PythonString(const PythonString &object);
259edb35d95SEugene Zelenko 
260f8b22f8fSZachary Turner   ~PythonString() override;
2612c1f46dcSZachary Turner 
26222c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
26322c8efcdSZachary Turner 
264f8b22f8fSZachary Turner   // Bring in the no-argument base class version
265f8b22f8fSZachary Turner   using PythonObject::Reset;
266f8b22f8fSZachary Turner 
267f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2682c1f46dcSZachary Turner 
269b9c1b51eSKate Stone   llvm::StringRef GetString() const;
2702c1f46dcSZachary Turner 
271b9c1b51eSKate Stone   size_t GetSize() const;
2722c1f46dcSZachary Turner 
2732c1f46dcSZachary Turner   void SetString(llvm::StringRef string);
2742c1f46dcSZachary Turner 
2752c1f46dcSZachary Turner   StructuredData::StringSP CreateStructuredString() const;
2762c1f46dcSZachary Turner };
2772c1f46dcSZachary Turner 
278b9c1b51eSKate Stone class PythonInteger : public PythonObject {
2792c1f46dcSZachary Turner public:
2802c1f46dcSZachary Turner   PythonInteger();
28187f47729SZachary Turner   explicit PythonInteger(int64_t value);
282f8b22f8fSZachary Turner   PythonInteger(PyRefType type, PyObject *o);
283f8b22f8fSZachary Turner   PythonInteger(const PythonInteger &object);
284edb35d95SEugene Zelenko 
285f8b22f8fSZachary Turner   ~PythonInteger() override;
2862c1f46dcSZachary Turner 
28722c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
28822c8efcdSZachary Turner 
289f8b22f8fSZachary Turner   // Bring in the no-argument base class version
290f8b22f8fSZachary Turner   using PythonObject::Reset;
291f8b22f8fSZachary Turner 
292f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
2932c1f46dcSZachary Turner 
2942c1f46dcSZachary Turner   int64_t GetInteger() const;
2952c1f46dcSZachary Turner 
296b9c1b51eSKate Stone   void SetInteger(int64_t value);
2972c1f46dcSZachary Turner 
2982c1f46dcSZachary Turner   StructuredData::IntegerSP CreateStructuredInteger() const;
2992c1f46dcSZachary Turner };
3002c1f46dcSZachary Turner 
301*b81d715cSTatyana Krasnukha class PythonBoolean : public PythonObject {
302*b81d715cSTatyana Krasnukha public:
303*b81d715cSTatyana Krasnukha   PythonBoolean() = default;
304*b81d715cSTatyana Krasnukha   explicit PythonBoolean(bool value);
305*b81d715cSTatyana Krasnukha   PythonBoolean(PyRefType type, PyObject *o);
306*b81d715cSTatyana Krasnukha   PythonBoolean(const PythonBoolean &object);
307*b81d715cSTatyana Krasnukha 
308*b81d715cSTatyana Krasnukha   ~PythonBoolean() override = default;
309*b81d715cSTatyana Krasnukha 
310*b81d715cSTatyana Krasnukha   static bool Check(PyObject *py_obj);
311*b81d715cSTatyana Krasnukha 
312*b81d715cSTatyana Krasnukha   // Bring in the no-argument base class version
313*b81d715cSTatyana Krasnukha   using PythonObject::Reset;
314*b81d715cSTatyana Krasnukha 
315*b81d715cSTatyana Krasnukha   void Reset(PyRefType type, PyObject *py_obj) override;
316*b81d715cSTatyana Krasnukha 
317*b81d715cSTatyana Krasnukha   bool GetValue() const;
318*b81d715cSTatyana Krasnukha 
319*b81d715cSTatyana Krasnukha   void SetValue(bool value);
320*b81d715cSTatyana Krasnukha 
321*b81d715cSTatyana Krasnukha   StructuredData::BooleanSP CreateStructuredBoolean() const;
322*b81d715cSTatyana Krasnukha };
323*b81d715cSTatyana Krasnukha 
324b9c1b51eSKate Stone class PythonList : public PythonObject {
3252c1f46dcSZachary Turner public:
326a1405147SZachary Turner   PythonList() {}
32787f47729SZachary Turner   explicit PythonList(PyInitialValue value);
32887f47729SZachary Turner   explicit PythonList(int list_size);
329f8b22f8fSZachary Turner   PythonList(PyRefType type, PyObject *o);
330f8b22f8fSZachary Turner   PythonList(const PythonList &list);
331edb35d95SEugene Zelenko 
332f8b22f8fSZachary Turner   ~PythonList() override;
3332c1f46dcSZachary Turner 
33422c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
33522c8efcdSZachary Turner 
336f8b22f8fSZachary Turner   // Bring in the no-argument base class version
337f8b22f8fSZachary Turner   using PythonObject::Reset;
338f8b22f8fSZachary Turner 
339f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3402c1f46dcSZachary Turner 
3412c1f46dcSZachary Turner   uint32_t GetSize() const;
3422c1f46dcSZachary Turner 
3432c1f46dcSZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
3442c1f46dcSZachary Turner 
345f8b22f8fSZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
3462c1f46dcSZachary Turner 
347f8b22f8fSZachary Turner   void AppendItem(const PythonObject &object);
3482c1f46dcSZachary Turner 
3492c1f46dcSZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
3502c1f46dcSZachary Turner };
3512c1f46dcSZachary Turner 
352b9c1b51eSKate Stone class PythonTuple : public PythonObject {
353a1405147SZachary Turner public:
354a1405147SZachary Turner   PythonTuple() {}
355a1405147SZachary Turner   explicit PythonTuple(PyInitialValue value);
356a1405147SZachary Turner   explicit PythonTuple(int tuple_size);
357a1405147SZachary Turner   PythonTuple(PyRefType type, PyObject *o);
358a1405147SZachary Turner   PythonTuple(const PythonTuple &tuple);
359a1405147SZachary Turner   PythonTuple(std::initializer_list<PythonObject> objects);
360a1405147SZachary Turner   PythonTuple(std::initializer_list<PyObject *> objects);
361a1405147SZachary Turner 
362a1405147SZachary Turner   ~PythonTuple() override;
363a1405147SZachary Turner 
364a1405147SZachary Turner   static bool Check(PyObject *py_obj);
365a1405147SZachary Turner 
366a1405147SZachary Turner   // Bring in the no-argument base class version
367a1405147SZachary Turner   using PythonObject::Reset;
368a1405147SZachary Turner 
369a1405147SZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
370a1405147SZachary Turner 
371a1405147SZachary Turner   uint32_t GetSize() const;
372a1405147SZachary Turner 
373a1405147SZachary Turner   PythonObject GetItemAtIndex(uint32_t index) const;
374a1405147SZachary Turner 
375a1405147SZachary Turner   void SetItemAtIndex(uint32_t index, const PythonObject &object);
376a1405147SZachary Turner 
377a1405147SZachary Turner   StructuredData::ArraySP CreateStructuredArray() const;
378a1405147SZachary Turner };
379a1405147SZachary Turner 
380b9c1b51eSKate Stone class PythonDictionary : public PythonObject {
3812c1f46dcSZachary Turner public:
382a1405147SZachary Turner   PythonDictionary() {}
38387f47729SZachary Turner   explicit PythonDictionary(PyInitialValue value);
384f8b22f8fSZachary Turner   PythonDictionary(PyRefType type, PyObject *o);
385f8b22f8fSZachary Turner   PythonDictionary(const PythonDictionary &dict);
386edb35d95SEugene Zelenko 
387f8b22f8fSZachary Turner   ~PythonDictionary() override;
3882c1f46dcSZachary Turner 
38922c8efcdSZachary Turner   static bool Check(PyObject *py_obj);
39022c8efcdSZachary Turner 
391f8b22f8fSZachary Turner   // Bring in the no-argument base class version
392f8b22f8fSZachary Turner   using PythonObject::Reset;
393f8b22f8fSZachary Turner 
394f8b22f8fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
3952c1f46dcSZachary Turner 
3962c1f46dcSZachary Turner   uint32_t GetSize() const;
3972c1f46dcSZachary Turner 
398f8b22f8fSZachary Turner   PythonList GetKeys() const;
3992c1f46dcSZachary Turner 
400f8b22f8fSZachary Turner   PythonObject GetItemForKey(const PythonObject &key) const;
401f8b22f8fSZachary Turner   void SetItemForKey(const PythonObject &key, const PythonObject &value);
4022c1f46dcSZachary Turner 
4032c1f46dcSZachary Turner   StructuredData::DictionarySP CreateStructuredDictionary() const;
4042c1f46dcSZachary Turner };
40587f47729SZachary Turner 
406b9c1b51eSKate Stone class PythonModule : public PythonObject {
4077841efbbSZachary Turner public:
4087841efbbSZachary Turner   PythonModule();
4097841efbbSZachary Turner   PythonModule(PyRefType type, PyObject *o);
4107841efbbSZachary Turner   PythonModule(const PythonModule &dict);
4117841efbbSZachary Turner 
4127841efbbSZachary Turner   ~PythonModule() override;
4137841efbbSZachary Turner 
4147841efbbSZachary Turner   static bool Check(PyObject *py_obj);
4157841efbbSZachary Turner 
416b9c1b51eSKate Stone   static PythonModule BuiltinsModule();
417a1405147SZachary Turner 
418b9c1b51eSKate Stone   static PythonModule MainModule();
419a1405147SZachary Turner 
420b9c1b51eSKate Stone   static PythonModule AddModule(llvm::StringRef module);
4217841efbbSZachary Turner 
422b9c1b51eSKate Stone   static PythonModule ImportModule(llvm::StringRef module);
4232419f1d5SZachary Turner 
4247841efbbSZachary Turner   // Bring in the no-argument base class version
4257841efbbSZachary Turner   using PythonObject::Reset;
4267841efbbSZachary Turner 
4277841efbbSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4287841efbbSZachary Turner 
4297841efbbSZachary Turner   PythonDictionary GetDictionary() const;
4307841efbbSZachary Turner };
4317841efbbSZachary Turner 
432b9c1b51eSKate Stone class PythonCallable : public PythonObject {
433a1405147SZachary Turner public:
434b58fb2f4SZachary Turner   struct ArgInfo {
435b58fb2f4SZachary Turner     size_t count;
436a5d6765cSEnrico Granata     bool is_bound_method : 1;
437b58fb2f4SZachary Turner     bool has_varargs : 1;
438b58fb2f4SZachary Turner     bool has_kwargs : 1;
439b58fb2f4SZachary Turner   };
440b58fb2f4SZachary Turner 
441a1405147SZachary Turner   PythonCallable();
442a1405147SZachary Turner   PythonCallable(PyRefType type, PyObject *o);
443a1405147SZachary Turner   PythonCallable(const PythonCallable &dict);
444a1405147SZachary Turner 
445a1405147SZachary Turner   ~PythonCallable() override;
446a1405147SZachary Turner 
447b9c1b51eSKate Stone   static bool Check(PyObject *py_obj);
448a1405147SZachary Turner 
449a1405147SZachary Turner   // Bring in the no-argument base class version
450a1405147SZachary Turner   using PythonObject::Reset;
451a1405147SZachary Turner 
452b9c1b51eSKate Stone   void Reset(PyRefType type, PyObject *py_obj) override;
453a1405147SZachary Turner 
454b9c1b51eSKate Stone   ArgInfo GetNumArguments() const;
455b58fb2f4SZachary Turner 
456b9c1b51eSKate Stone   PythonObject operator()();
457a1405147SZachary Turner 
458b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PyObject *> args);
459a1405147SZachary Turner 
460b9c1b51eSKate Stone   PythonObject operator()(std::initializer_list<PythonObject> args);
461b58fb2f4SZachary Turner 
462b58fb2f4SZachary Turner   template <typename Arg, typename... Args>
463b9c1b51eSKate Stone   PythonObject operator()(const Arg &arg, Args... args) {
464b58fb2f4SZachary Turner     return operator()({arg, args...});
465b58fb2f4SZachary Turner   }
466a1405147SZachary Turner };
467a1405147SZachary Turner 
468b9c1b51eSKate Stone class PythonFile : public PythonObject {
4699c40264fSZachary Turner public:
47032064024SZachary Turner   PythonFile();
471eda01c31SZachary Turner   PythonFile(File &file, const char *mode);
472eda01c31SZachary Turner   PythonFile(const char *path, const char *mode);
4739c40264fSZachary Turner   PythonFile(PyRefType type, PyObject *o);
474edb35d95SEugene Zelenko 
4759c40264fSZachary Turner   ~PythonFile() override;
4769c40264fSZachary Turner 
4779c40264fSZachary Turner   static bool Check(PyObject *py_obj);
4789c40264fSZachary Turner 
4799c40264fSZachary Turner   using PythonObject::Reset;
4809c40264fSZachary Turner 
4819c40264fSZachary Turner   void Reset(PyRefType type, PyObject *py_obj) override;
4829c40264fSZachary Turner   void Reset(File &file, const char *mode);
483eda01c31SZachary Turner 
484744959b9SEnrico Granata   static uint32_t GetOptionsFromMode(llvm::StringRef mode);
485744959b9SEnrico Granata 
486eda01c31SZachary Turner   bool GetUnderlyingFile(File &file) const;
4879c40264fSZachary Turner };
4889c40264fSZachary Turner 
4892c1f46dcSZachary Turner } // namespace lldb_private
4902c1f46dcSZachary Turner 
491a281b42bSZachary Turner #endif
492d68983e3SPavel Labath 
493d68983e3SPavel Labath #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
494