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 
132c1f46dcSZachary Turner // C Includes
142c1f46dcSZachary Turner // C++ Includes
152c1f46dcSZachary Turner // Other libraries and framework includes
162c1f46dcSZachary Turner // Project includes
172c1f46dcSZachary Turner #include "lldb/lldb-defines.h"
182c1f46dcSZachary Turner #include "lldb/Core/ConstString.h"
192c1f46dcSZachary Turner #include "lldb/Core/StructuredData.h"
202c1f46dcSZachary Turner #include "lldb/Core/Flags.h"
219c40264fSZachary Turner #include "lldb/Host/File.h"
222c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h"
232c1f46dcSZachary Turner 
242c1f46dcSZachary Turner namespace lldb_private {
25edb35d95SEugene Zelenko 
262c1f46dcSZachary Turner class PythonString;
272c1f46dcSZachary Turner class PythonList;
282c1f46dcSZachary Turner class PythonDictionary;
292c1f46dcSZachary Turner class PythonInteger;
302c1f46dcSZachary Turner 
312c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic
322c1f46dcSZachary Turner {
332c1f46dcSZachary Turner public:
342c1f46dcSZachary Turner     StructuredPythonObject()
352c1f46dcSZachary Turner         : StructuredData::Generic()
362c1f46dcSZachary Turner     {
372c1f46dcSZachary Turner     }
382c1f46dcSZachary Turner 
392c1f46dcSZachary Turner     StructuredPythonObject(void *obj)
402c1f46dcSZachary Turner         : StructuredData::Generic(obj)
412c1f46dcSZachary Turner     {
422c1f46dcSZachary Turner         Py_XINCREF(GetValue());
432c1f46dcSZachary Turner     }
442c1f46dcSZachary Turner 
45edb35d95SEugene Zelenko     ~StructuredPythonObject() override
462c1f46dcSZachary Turner     {
472c1f46dcSZachary Turner         if (Py_IsInitialized())
482c1f46dcSZachary Turner             Py_XDECREF(GetValue());
492c1f46dcSZachary Turner         SetValue(nullptr);
502c1f46dcSZachary Turner     }
512c1f46dcSZachary Turner 
522c1f46dcSZachary Turner     bool
532c1f46dcSZachary Turner     IsValid() const override
542c1f46dcSZachary Turner     {
552c1f46dcSZachary Turner         return GetValue() && GetValue() != Py_None;
562c1f46dcSZachary Turner     }
572c1f46dcSZachary Turner 
582c1f46dcSZachary Turner     void Dump(Stream &s) const override;
592c1f46dcSZachary Turner 
602c1f46dcSZachary Turner private:
612c1f46dcSZachary Turner     DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
622c1f46dcSZachary Turner };
632c1f46dcSZachary Turner 
642c1f46dcSZachary Turner enum class PyObjectType
652c1f46dcSZachary Turner {
662c1f46dcSZachary Turner     Unknown,
672c1f46dcSZachary Turner     None,
682c1f46dcSZachary Turner     Integer,
692c1f46dcSZachary Turner     Dictionary,
702c1f46dcSZachary Turner     List,
719c40264fSZachary Turner     String,
727841efbbSZachary Turner     Module,
73a1405147SZachary Turner     Callable,
74a1405147SZachary Turner     Tuple,
759c40264fSZachary Turner     File
762c1f46dcSZachary Turner };
772c1f46dcSZachary Turner 
78f8b22f8fSZachary Turner enum class PyRefType
79f8b22f8fSZachary Turner {
80f8b22f8fSZachary Turner     Borrowed, // We are not given ownership of the incoming PyObject.
81f8b22f8fSZachary Turner               // We cannot safely hold it without calling Py_INCREF.
82f8b22f8fSZachary Turner     Owned     // We have ownership of the incoming PyObject.  We should
83f8b22f8fSZachary Turner               // not call Py_INCREF.
84f8b22f8fSZachary Turner };
85f8b22f8fSZachary Turner 
86f8b22f8fSZachary Turner enum class PyInitialValue
87f8b22f8fSZachary Turner {
88f8b22f8fSZachary Turner     Invalid,
89f8b22f8fSZachary Turner     Empty
90f8b22f8fSZachary Turner };
91f8b22f8fSZachary Turner 
922c1f46dcSZachary Turner class PythonObject
932c1f46dcSZachary Turner {
942c1f46dcSZachary Turner public:
95f8b22f8fSZachary Turner     PythonObject()
96f8b22f8fSZachary Turner         : m_py_obj(nullptr)
972c1f46dcSZachary Turner     {
982c1f46dcSZachary Turner     }
992c1f46dcSZachary Turner 
100f8b22f8fSZachary Turner     PythonObject(PyRefType type, PyObject *py_obj)
101f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1022c1f46dcSZachary Turner     {
103f8b22f8fSZachary Turner         Reset(type, py_obj);
1042c1f46dcSZachary Turner     }
1052c1f46dcSZachary Turner 
106f8b22f8fSZachary Turner     PythonObject(const PythonObject &rhs)
107f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1082c1f46dcSZachary Turner     {
109f8b22f8fSZachary Turner         Reset(rhs);
1102c1f46dcSZachary Turner     }
1112c1f46dcSZachary Turner 
112edb35d95SEugene Zelenko     virtual ~PythonObject()
113edb35d95SEugene Zelenko     {
114edb35d95SEugene Zelenko         Reset();
115edb35d95SEugene Zelenko     }
1162c1f46dcSZachary Turner 
117f8b22f8fSZachary Turner     void
118f8b22f8fSZachary Turner     Reset()
1192c1f46dcSZachary Turner     {
120f8b22f8fSZachary Turner         // Avoid calling the virtual method since it's not necessary
121f8b22f8fSZachary Turner         // to actually validate the type of the PyObject if we're
122f8b22f8fSZachary Turner         // just setting to null.
1232c1f46dcSZachary Turner         if (Py_IsInitialized())
1242c1f46dcSZachary Turner             Py_XDECREF(m_py_obj);
125f8b22f8fSZachary Turner         m_py_obj = nullptr;
1262c1f46dcSZachary Turner     }
127f8b22f8fSZachary Turner 
128f8b22f8fSZachary Turner     void
129f8b22f8fSZachary Turner     Reset(const PythonObject &rhs)
130f8b22f8fSZachary Turner     {
131f8b22f8fSZachary Turner         // Avoid calling the virtual method if it's not necessary
132f8b22f8fSZachary Turner         // to actually validate the type of the PyObject.
13360c24f70SZachary Turner         if (!rhs.IsValid())
134f8b22f8fSZachary Turner             Reset();
135f8b22f8fSZachary Turner         else
136f8b22f8fSZachary Turner             Reset(PyRefType::Borrowed, rhs.m_py_obj);
137f8b22f8fSZachary Turner     }
138f8b22f8fSZachary Turner 
139f8b22f8fSZachary Turner     // PythonObject is implicitly convertible to PyObject *, which will call the
140f8b22f8fSZachary Turner     // wrong overload.  We want to explicitly disallow this, since a PyObject
141f8b22f8fSZachary Turner     // *always* owns its reference.  Therefore the overload which takes a
142f8b22f8fSZachary Turner     // PyRefType doesn't make sense, and the copy constructor should be used.
143f8b22f8fSZachary Turner     void
144f8b22f8fSZachary Turner     Reset(PyRefType type, const PythonObject &ref) = delete;
145f8b22f8fSZachary Turner 
146f8b22f8fSZachary Turner     virtual void
147f8b22f8fSZachary Turner     Reset(PyRefType type, PyObject *py_obj)
148f8b22f8fSZachary Turner     {
149f8b22f8fSZachary Turner         if (py_obj == m_py_obj)
150f8b22f8fSZachary Turner             return;
151f8b22f8fSZachary Turner 
152f8b22f8fSZachary Turner         if (Py_IsInitialized())
153f8b22f8fSZachary Turner             Py_XDECREF(m_py_obj);
154f8b22f8fSZachary Turner 
155f8b22f8fSZachary Turner         m_py_obj = py_obj;
156f8b22f8fSZachary Turner 
157f8b22f8fSZachary Turner         // If this is a borrowed reference, we need to convert it to
158f8b22f8fSZachary Turner         // an owned reference by incrementing it.  If it is an owned
159f8b22f8fSZachary Turner         // reference (for example the caller allocated it with PyDict_New()
160f8b22f8fSZachary Turner         // then we must *not* increment it.
161f8b22f8fSZachary Turner         if (Py_IsInitialized() && type == PyRefType::Borrowed)
162f8b22f8fSZachary Turner             Py_XINCREF(m_py_obj);
1632c1f46dcSZachary Turner     }
1642c1f46dcSZachary Turner 
1652c1f46dcSZachary Turner     void
1662c1f46dcSZachary Turner     Dump () const
1672c1f46dcSZachary Turner     {
1682c1f46dcSZachary Turner         if (m_py_obj)
1692c1f46dcSZachary Turner             _PyObject_Dump (m_py_obj);
1702c1f46dcSZachary Turner         else
1712c1f46dcSZachary Turner             puts ("NULL");
1722c1f46dcSZachary Turner     }
1732c1f46dcSZachary Turner 
1742c1f46dcSZachary Turner     void
1752c1f46dcSZachary Turner     Dump (Stream &strm) const;
1762c1f46dcSZachary Turner 
1772c1f46dcSZachary Turner     PyObject*
1782c1f46dcSZachary Turner     get() const
1792c1f46dcSZachary Turner     {
1802c1f46dcSZachary Turner         return m_py_obj;
1812c1f46dcSZachary Turner     }
1822c1f46dcSZachary Turner 
18360c24f70SZachary Turner     PyObject*
18460c24f70SZachary Turner     release()
18560c24f70SZachary Turner     {
18660c24f70SZachary Turner         PyObject *result = m_py_obj;
18760c24f70SZachary Turner         m_py_obj = nullptr;
18860c24f70SZachary Turner         return result;
18960c24f70SZachary Turner     }
19060c24f70SZachary Turner 
191f8b22f8fSZachary Turner     PythonObject &
192f8b22f8fSZachary Turner     operator=(const PythonObject &other)
1932c1f46dcSZachary Turner     {
194f8b22f8fSZachary Turner         Reset(PyRefType::Borrowed, other.get());
195f8b22f8fSZachary Turner         return *this;
1962c1f46dcSZachary Turner     }
1972c1f46dcSZachary Turner 
1987841efbbSZachary Turner     PyObjectType
1997841efbbSZachary Turner     GetObjectType() const;
2007841efbbSZachary Turner 
2017841efbbSZachary Turner     PythonString
2027841efbbSZachary Turner     Repr() const;
2037841efbbSZachary Turner 
2047841efbbSZachary Turner     PythonString
2057841efbbSZachary Turner     Str() const;
2067841efbbSZachary Turner 
2077841efbbSZachary Turner     static PythonObject
208a1405147SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, PythonDictionary dict);
2097841efbbSZachary Turner 
210*b58fb2f4SZachary Turner     template<typename T>
211*b58fb2f4SZachary Turner     static T
212*b58fb2f4SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, PythonDictionary dict)
213*b58fb2f4SZachary Turner     {
214*b58fb2f4SZachary Turner         return ResolveNameWithDictionary(name, dict).AsType<T>();
215*b58fb2f4SZachary Turner     }
216*b58fb2f4SZachary Turner 
2177841efbbSZachary Turner     PythonObject
2187841efbbSZachary Turner     ResolveName(llvm::StringRef name) const;
2197841efbbSZachary Turner 
220*b58fb2f4SZachary Turner     template<typename T>
221*b58fb2f4SZachary Turner     T
222*b58fb2f4SZachary Turner     ResolveName(llvm::StringRef name) const
223*b58fb2f4SZachary Turner     {
224*b58fb2f4SZachary Turner         return ResolveName(name).AsType<T>();
225*b58fb2f4SZachary Turner     }
226*b58fb2f4SZachary Turner 
2272c1f46dcSZachary Turner     bool
2289c40264fSZachary Turner     HasAttribute(llvm::StringRef attribute) const;
2299c40264fSZachary Turner 
2307d6d218eSZachary Turner     PythonObject
2317d6d218eSZachary Turner     GetAttributeValue(llvm::StringRef attribute) const;
2327d6d218eSZachary Turner 
2339c40264fSZachary Turner     bool
234f8b22f8fSZachary Turner     IsValid() const;
235f8b22f8fSZachary Turner 
236f8b22f8fSZachary Turner     bool
237f8b22f8fSZachary Turner     IsAllocated() const;
238f8b22f8fSZachary Turner 
239f8b22f8fSZachary Turner     bool
240f8b22f8fSZachary Turner     IsNone() const;
2412c1f46dcSZachary Turner 
2427d6d218eSZachary Turner     template<typename T>
2437d6d218eSZachary Turner     T AsType() const
2447d6d218eSZachary Turner     {
2457d6d218eSZachary Turner         if (!T::Check(m_py_obj))
2467d6d218eSZachary Turner             return T();
2477d6d218eSZachary Turner         return T(PyRefType::Borrowed, m_py_obj);
2487d6d218eSZachary Turner     }
2497d6d218eSZachary Turner 
2507841efbbSZachary Turner     StructuredData::ObjectSP
2517841efbbSZachary Turner     CreateStructuredObject() const;
2522c1f46dcSZachary Turner 
2532c1f46dcSZachary Turner protected:
2542c1f46dcSZachary Turner     PyObject* m_py_obj;
2552c1f46dcSZachary Turner };
2562c1f46dcSZachary Turner 
2572c1f46dcSZachary Turner class PythonString : public PythonObject
2582c1f46dcSZachary Turner {
2592c1f46dcSZachary Turner public:
2602c1f46dcSZachary Turner     PythonString();
261f8b22f8fSZachary Turner     explicit PythonString(llvm::StringRef string);
262f8b22f8fSZachary Turner     explicit PythonString(const char *string);
26387f47729SZachary Turner     PythonString(PyRefType type, PyObject *o);
26487f47729SZachary Turner     PythonString(const PythonString &object);
265edb35d95SEugene Zelenko 
266f8b22f8fSZachary Turner     ~PythonString() override;
2672c1f46dcSZachary Turner 
26822c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
26922c8efcdSZachary Turner 
270f8b22f8fSZachary Turner     // Bring in the no-argument base class version
271f8b22f8fSZachary Turner     using PythonObject::Reset;
272f8b22f8fSZachary Turner 
273f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
2742c1f46dcSZachary Turner 
2752c1f46dcSZachary Turner     llvm::StringRef
2762c1f46dcSZachary Turner     GetString() const;
2772c1f46dcSZachary Turner 
2782c1f46dcSZachary Turner     size_t
2792c1f46dcSZachary Turner     GetSize() const;
2802c1f46dcSZachary Turner 
2812c1f46dcSZachary Turner     void SetString(llvm::StringRef string);
2822c1f46dcSZachary Turner 
2832c1f46dcSZachary Turner     StructuredData::StringSP CreateStructuredString() const;
2842c1f46dcSZachary Turner };
2852c1f46dcSZachary Turner 
2862c1f46dcSZachary Turner class PythonInteger : public PythonObject
2872c1f46dcSZachary Turner {
2882c1f46dcSZachary Turner public:
2892c1f46dcSZachary Turner     PythonInteger();
29087f47729SZachary Turner     explicit PythonInteger(int64_t value);
291f8b22f8fSZachary Turner     PythonInteger(PyRefType type, PyObject *o);
292f8b22f8fSZachary Turner     PythonInteger(const PythonInteger &object);
293edb35d95SEugene Zelenko 
294f8b22f8fSZachary Turner     ~PythonInteger() override;
2952c1f46dcSZachary Turner 
29622c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
29722c8efcdSZachary Turner 
298f8b22f8fSZachary Turner     // Bring in the no-argument base class version
299f8b22f8fSZachary Turner     using PythonObject::Reset;
300f8b22f8fSZachary Turner 
301f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3022c1f46dcSZachary Turner 
3032c1f46dcSZachary Turner     int64_t GetInteger() const;
3042c1f46dcSZachary Turner 
3052c1f46dcSZachary Turner     void
3062c1f46dcSZachary Turner     SetInteger (int64_t value);
3072c1f46dcSZachary Turner 
3082c1f46dcSZachary Turner     StructuredData::IntegerSP CreateStructuredInteger() const;
3092c1f46dcSZachary Turner };
3102c1f46dcSZachary Turner 
3112c1f46dcSZachary Turner class PythonList : public PythonObject
3122c1f46dcSZachary Turner {
3132c1f46dcSZachary Turner public:
314a1405147SZachary Turner     PythonList() {}
31587f47729SZachary Turner     explicit PythonList(PyInitialValue value);
31687f47729SZachary Turner     explicit PythonList(int list_size);
317f8b22f8fSZachary Turner     PythonList(PyRefType type, PyObject *o);
318f8b22f8fSZachary Turner     PythonList(const PythonList &list);
319edb35d95SEugene Zelenko 
320f8b22f8fSZachary Turner     ~PythonList() override;
3212c1f46dcSZachary Turner 
32222c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
32322c8efcdSZachary Turner 
324f8b22f8fSZachary Turner     // Bring in the no-argument base class version
325f8b22f8fSZachary Turner     using PythonObject::Reset;
326f8b22f8fSZachary Turner 
327f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3282c1f46dcSZachary Turner 
3292c1f46dcSZachary Turner     uint32_t GetSize() const;
3302c1f46dcSZachary Turner 
3312c1f46dcSZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
3322c1f46dcSZachary Turner 
333f8b22f8fSZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
3342c1f46dcSZachary Turner 
335f8b22f8fSZachary Turner     void AppendItem(const PythonObject &object);
3362c1f46dcSZachary Turner 
3372c1f46dcSZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
3382c1f46dcSZachary Turner };
3392c1f46dcSZachary Turner 
340a1405147SZachary Turner class PythonTuple : public PythonObject
341a1405147SZachary Turner {
342a1405147SZachary Turner public:
343a1405147SZachary Turner     PythonTuple() {}
344a1405147SZachary Turner     explicit PythonTuple(PyInitialValue value);
345a1405147SZachary Turner     explicit PythonTuple(int tuple_size);
346a1405147SZachary Turner     PythonTuple(PyRefType type, PyObject *o);
347a1405147SZachary Turner     PythonTuple(const PythonTuple &tuple);
348a1405147SZachary Turner     PythonTuple(std::initializer_list<PythonObject> objects);
349a1405147SZachary Turner     PythonTuple(std::initializer_list<PyObject*> objects);
350a1405147SZachary Turner 
351a1405147SZachary Turner     ~PythonTuple() override;
352a1405147SZachary Turner 
353a1405147SZachary Turner     static bool Check(PyObject *py_obj);
354a1405147SZachary Turner 
355a1405147SZachary Turner     // Bring in the no-argument base class version
356a1405147SZachary Turner     using PythonObject::Reset;
357a1405147SZachary Turner 
358a1405147SZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
359a1405147SZachary Turner 
360a1405147SZachary Turner     uint32_t GetSize() const;
361a1405147SZachary Turner 
362a1405147SZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
363a1405147SZachary Turner 
364a1405147SZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
365a1405147SZachary Turner 
366a1405147SZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
367a1405147SZachary Turner };
368a1405147SZachary Turner 
3692c1f46dcSZachary Turner class PythonDictionary : public PythonObject
3702c1f46dcSZachary Turner {
3712c1f46dcSZachary Turner public:
372a1405147SZachary Turner     PythonDictionary() {}
37387f47729SZachary Turner     explicit PythonDictionary(PyInitialValue value);
374f8b22f8fSZachary Turner     PythonDictionary(PyRefType type, PyObject *o);
375f8b22f8fSZachary Turner     PythonDictionary(const PythonDictionary &dict);
376edb35d95SEugene Zelenko 
377f8b22f8fSZachary Turner     ~PythonDictionary() override;
3782c1f46dcSZachary Turner 
37922c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
38022c8efcdSZachary Turner 
381f8b22f8fSZachary Turner     // Bring in the no-argument base class version
382f8b22f8fSZachary Turner     using PythonObject::Reset;
383f8b22f8fSZachary Turner 
384f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3852c1f46dcSZachary Turner 
3862c1f46dcSZachary Turner     uint32_t GetSize() const;
3872c1f46dcSZachary Turner 
388f8b22f8fSZachary Turner     PythonList GetKeys() const;
3892c1f46dcSZachary Turner 
390f8b22f8fSZachary Turner     PythonObject GetItemForKey(const PythonObject &key) const;
391f8b22f8fSZachary Turner     void SetItemForKey(const PythonObject &key, const PythonObject &value);
3922c1f46dcSZachary Turner 
3932c1f46dcSZachary Turner     StructuredData::DictionarySP CreateStructuredDictionary() const;
3942c1f46dcSZachary Turner };
39587f47729SZachary Turner 
3967841efbbSZachary Turner class PythonModule : public PythonObject
3977841efbbSZachary Turner {
3987841efbbSZachary Turner   public:
3997841efbbSZachary Turner     PythonModule();
4007841efbbSZachary Turner     PythonModule(PyRefType type, PyObject *o);
4017841efbbSZachary Turner     PythonModule(const PythonModule &dict);
4027841efbbSZachary Turner 
4037841efbbSZachary Turner     ~PythonModule() override;
4047841efbbSZachary Turner 
4057841efbbSZachary Turner     static bool Check(PyObject *py_obj);
4067841efbbSZachary Turner 
407a1405147SZachary Turner     static PythonModule
408a1405147SZachary Turner     BuiltinsModule();
409a1405147SZachary Turner 
410a1405147SZachary Turner     static PythonModule
411a1405147SZachary Turner     MainModule();
412a1405147SZachary Turner 
413a1405147SZachary Turner     static PythonModule
414a1405147SZachary Turner     AddModule(llvm::StringRef module);
4157841efbbSZachary Turner 
4167841efbbSZachary Turner     // Bring in the no-argument base class version
4177841efbbSZachary Turner     using PythonObject::Reset;
4187841efbbSZachary Turner 
4197841efbbSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4207841efbbSZachary Turner 
4217841efbbSZachary Turner     PythonDictionary GetDictionary() const;
4227841efbbSZachary Turner };
4237841efbbSZachary Turner 
424a1405147SZachary Turner class PythonCallable : public PythonObject
425a1405147SZachary Turner {
426a1405147SZachary Turner public:
427*b58fb2f4SZachary Turner     struct ArgInfo {
428*b58fb2f4SZachary Turner         size_t count;
429*b58fb2f4SZachary Turner         bool has_varargs : 1;
430*b58fb2f4SZachary Turner         bool has_kwargs : 1;
431*b58fb2f4SZachary Turner     };
432*b58fb2f4SZachary Turner 
433a1405147SZachary Turner     PythonCallable();
434a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
435a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
436a1405147SZachary Turner 
437a1405147SZachary Turner     ~PythonCallable() override;
438a1405147SZachary Turner 
439a1405147SZachary Turner     static bool
440a1405147SZachary Turner     Check(PyObject *py_obj);
441a1405147SZachary Turner 
442a1405147SZachary Turner     // Bring in the no-argument base class version
443a1405147SZachary Turner     using PythonObject::Reset;
444a1405147SZachary Turner 
445a1405147SZachary Turner     void
446a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
447a1405147SZachary Turner 
448*b58fb2f4SZachary Turner     ArgInfo
449*b58fb2f4SZachary Turner     GetNumArguments() const;
450*b58fb2f4SZachary Turner 
451*b58fb2f4SZachary Turner     PythonObject
452*b58fb2f4SZachary Turner     operator ()();
453a1405147SZachary Turner 
454a1405147SZachary Turner     PythonObject
455a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
456a1405147SZachary Turner 
457a1405147SZachary Turner     PythonObject
458a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
459*b58fb2f4SZachary Turner 
460*b58fb2f4SZachary Turner     template<typename Arg, typename... Args>
461*b58fb2f4SZachary Turner     PythonObject
462*b58fb2f4SZachary Turner     operator ()(const Arg &arg, Args... args)
463*b58fb2f4SZachary Turner     {
464*b58fb2f4SZachary Turner         return operator()({ arg, args... });
465*b58fb2f4SZachary Turner     }
466a1405147SZachary Turner };
467a1405147SZachary Turner 
468a1405147SZachary Turner 
4699c40264fSZachary Turner class PythonFile : public PythonObject
4709c40264fSZachary Turner {
4719c40264fSZachary Turner   public:
47232064024SZachary Turner     PythonFile();
473eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
474eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
4759c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
476edb35d95SEugene Zelenko 
4779c40264fSZachary Turner     ~PythonFile() override;
4789c40264fSZachary Turner 
4799c40264fSZachary Turner     static bool Check(PyObject *py_obj);
4809c40264fSZachary Turner 
4819c40264fSZachary Turner     using PythonObject::Reset;
4829c40264fSZachary Turner 
4839c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4849c40264fSZachary Turner     void Reset(File &file, const char *mode);
485eda01c31SZachary Turner 
486eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
4879c40264fSZachary Turner };
4889c40264fSZachary Turner 
4892c1f46dcSZachary Turner } // namespace lldb_private
4902c1f46dcSZachary Turner 
4912c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
492