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 
152c1f46dcSZachary Turner // C Includes
162c1f46dcSZachary Turner // C++ Includes
172c1f46dcSZachary Turner // Other libraries and framework includes
182c1f46dcSZachary Turner // Project includes
192c1f46dcSZachary Turner #include "lldb/lldb-defines.h"
202c1f46dcSZachary Turner #include "lldb/Core/ConstString.h"
212c1f46dcSZachary Turner #include "lldb/Core/StructuredData.h"
222c1f46dcSZachary Turner #include "lldb/Core/Flags.h"
239c40264fSZachary Turner #include "lldb/Host/File.h"
242c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h"
252c1f46dcSZachary Turner 
262c1f46dcSZachary Turner namespace lldb_private {
27edb35d95SEugene Zelenko 
282c1f46dcSZachary Turner class PythonString;
292c1f46dcSZachary Turner class PythonList;
302c1f46dcSZachary Turner class PythonDictionary;
312c1f46dcSZachary Turner class PythonInteger;
322c1f46dcSZachary Turner 
332c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic
342c1f46dcSZachary Turner {
352c1f46dcSZachary Turner public:
362c1f46dcSZachary Turner     StructuredPythonObject()
372c1f46dcSZachary Turner         : StructuredData::Generic()
382c1f46dcSZachary Turner     {
392c1f46dcSZachary Turner     }
402c1f46dcSZachary Turner 
412c1f46dcSZachary Turner     StructuredPythonObject(void *obj)
422c1f46dcSZachary Turner         : StructuredData::Generic(obj)
432c1f46dcSZachary Turner     {
442c1f46dcSZachary Turner         Py_XINCREF(GetValue());
452c1f46dcSZachary Turner     }
462c1f46dcSZachary Turner 
47edb35d95SEugene Zelenko     ~StructuredPythonObject() override
482c1f46dcSZachary Turner     {
492c1f46dcSZachary Turner         if (Py_IsInitialized())
502c1f46dcSZachary Turner             Py_XDECREF(GetValue());
512c1f46dcSZachary Turner         SetValue(nullptr);
522c1f46dcSZachary Turner     }
532c1f46dcSZachary Turner 
542c1f46dcSZachary Turner     bool
552c1f46dcSZachary Turner     IsValid() const override
562c1f46dcSZachary Turner     {
572c1f46dcSZachary Turner         return GetValue() && GetValue() != Py_None;
582c1f46dcSZachary Turner     }
592c1f46dcSZachary Turner 
602c1f46dcSZachary Turner     void Dump(Stream &s) const override;
612c1f46dcSZachary Turner 
622c1f46dcSZachary Turner private:
632c1f46dcSZachary Turner     DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
642c1f46dcSZachary Turner };
652c1f46dcSZachary Turner 
662c1f46dcSZachary Turner enum class PyObjectType
672c1f46dcSZachary Turner {
682c1f46dcSZachary Turner     Unknown,
692c1f46dcSZachary Turner     None,
702c1f46dcSZachary Turner     Integer,
712c1f46dcSZachary Turner     Dictionary,
722c1f46dcSZachary Turner     List,
739c40264fSZachary Turner     String,
747841efbbSZachary Turner     Module,
75a1405147SZachary Turner     Callable,
76a1405147SZachary Turner     Tuple,
779c40264fSZachary Turner     File
782c1f46dcSZachary Turner };
792c1f46dcSZachary Turner 
80f8b22f8fSZachary Turner enum class PyRefType
81f8b22f8fSZachary Turner {
82f8b22f8fSZachary Turner     Borrowed, // We are not given ownership of the incoming PyObject.
83f8b22f8fSZachary Turner               // We cannot safely hold it without calling Py_INCREF.
84f8b22f8fSZachary Turner     Owned     // We have ownership of the incoming PyObject.  We should
85f8b22f8fSZachary Turner               // not call Py_INCREF.
86f8b22f8fSZachary Turner };
87f8b22f8fSZachary Turner 
88f8b22f8fSZachary Turner enum class PyInitialValue
89f8b22f8fSZachary Turner {
90f8b22f8fSZachary Turner     Invalid,
91f8b22f8fSZachary Turner     Empty
92f8b22f8fSZachary Turner };
93f8b22f8fSZachary Turner 
942c1f46dcSZachary Turner class PythonObject
952c1f46dcSZachary Turner {
962c1f46dcSZachary Turner public:
97f8b22f8fSZachary Turner     PythonObject()
98f8b22f8fSZachary Turner         : m_py_obj(nullptr)
992c1f46dcSZachary Turner     {
1002c1f46dcSZachary Turner     }
1012c1f46dcSZachary Turner 
102f8b22f8fSZachary Turner     PythonObject(PyRefType type, PyObject *py_obj)
103f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1042c1f46dcSZachary Turner     {
105f8b22f8fSZachary Turner         Reset(type, py_obj);
1062c1f46dcSZachary Turner     }
1072c1f46dcSZachary Turner 
108f8b22f8fSZachary Turner     PythonObject(const PythonObject &rhs)
109f8b22f8fSZachary Turner         : m_py_obj(nullptr)
1102c1f46dcSZachary Turner     {
111f8b22f8fSZachary Turner         Reset(rhs);
1122c1f46dcSZachary Turner     }
1132c1f46dcSZachary Turner 
114edb35d95SEugene Zelenko     virtual ~PythonObject()
115edb35d95SEugene Zelenko     {
116edb35d95SEugene Zelenko         Reset();
117edb35d95SEugene Zelenko     }
1182c1f46dcSZachary Turner 
119f8b22f8fSZachary Turner     void
120f8b22f8fSZachary Turner     Reset()
1212c1f46dcSZachary Turner     {
122f8b22f8fSZachary Turner         // Avoid calling the virtual method since it's not necessary
123f8b22f8fSZachary Turner         // to actually validate the type of the PyObject if we're
124f8b22f8fSZachary Turner         // just setting to null.
1252c1f46dcSZachary Turner         if (Py_IsInitialized())
1262c1f46dcSZachary Turner             Py_XDECREF(m_py_obj);
127f8b22f8fSZachary Turner         m_py_obj = nullptr;
1282c1f46dcSZachary Turner     }
129f8b22f8fSZachary Turner 
130f8b22f8fSZachary Turner     void
131f8b22f8fSZachary Turner     Reset(const PythonObject &rhs)
132f8b22f8fSZachary Turner     {
133f8b22f8fSZachary Turner         // Avoid calling the virtual method if it's not necessary
134f8b22f8fSZachary Turner         // to actually validate the type of the PyObject.
13560c24f70SZachary Turner         if (!rhs.IsValid())
136f8b22f8fSZachary Turner             Reset();
137f8b22f8fSZachary Turner         else
138f8b22f8fSZachary Turner             Reset(PyRefType::Borrowed, rhs.m_py_obj);
139f8b22f8fSZachary Turner     }
140f8b22f8fSZachary Turner 
141f8b22f8fSZachary Turner     // PythonObject is implicitly convertible to PyObject *, which will call the
142f8b22f8fSZachary Turner     // wrong overload.  We want to explicitly disallow this, since a PyObject
143f8b22f8fSZachary Turner     // *always* owns its reference.  Therefore the overload which takes a
144f8b22f8fSZachary Turner     // PyRefType doesn't make sense, and the copy constructor should be used.
145f8b22f8fSZachary Turner     void
146f8b22f8fSZachary Turner     Reset(PyRefType type, const PythonObject &ref) = delete;
147f8b22f8fSZachary Turner 
148f8b22f8fSZachary Turner     virtual void
149f8b22f8fSZachary Turner     Reset(PyRefType type, PyObject *py_obj)
150f8b22f8fSZachary Turner     {
151f8b22f8fSZachary Turner         if (py_obj == m_py_obj)
152f8b22f8fSZachary Turner             return;
153f8b22f8fSZachary Turner 
154f8b22f8fSZachary Turner         if (Py_IsInitialized())
155f8b22f8fSZachary Turner             Py_XDECREF(m_py_obj);
156f8b22f8fSZachary Turner 
157f8b22f8fSZachary Turner         m_py_obj = py_obj;
158f8b22f8fSZachary Turner 
159f8b22f8fSZachary Turner         // If this is a borrowed reference, we need to convert it to
160f8b22f8fSZachary Turner         // an owned reference by incrementing it.  If it is an owned
161f8b22f8fSZachary Turner         // reference (for example the caller allocated it with PyDict_New()
162f8b22f8fSZachary Turner         // then we must *not* increment it.
163f8b22f8fSZachary Turner         if (Py_IsInitialized() && type == PyRefType::Borrowed)
164f8b22f8fSZachary Turner             Py_XINCREF(m_py_obj);
1652c1f46dcSZachary Turner     }
1662c1f46dcSZachary Turner 
1672c1f46dcSZachary Turner     void
1682c1f46dcSZachary Turner     Dump () const
1692c1f46dcSZachary Turner     {
1702c1f46dcSZachary Turner         if (m_py_obj)
1712c1f46dcSZachary Turner             _PyObject_Dump (m_py_obj);
1722c1f46dcSZachary Turner         else
1732c1f46dcSZachary Turner             puts ("NULL");
1742c1f46dcSZachary Turner     }
1752c1f46dcSZachary Turner 
1762c1f46dcSZachary Turner     void
1772c1f46dcSZachary Turner     Dump (Stream &strm) const;
1782c1f46dcSZachary Turner 
1792c1f46dcSZachary Turner     PyObject*
1802c1f46dcSZachary Turner     get() const
1812c1f46dcSZachary Turner     {
1822c1f46dcSZachary Turner         return m_py_obj;
1832c1f46dcSZachary Turner     }
1842c1f46dcSZachary Turner 
18560c24f70SZachary Turner     PyObject*
18660c24f70SZachary Turner     release()
18760c24f70SZachary Turner     {
18860c24f70SZachary Turner         PyObject *result = m_py_obj;
18960c24f70SZachary Turner         m_py_obj = nullptr;
19060c24f70SZachary Turner         return result;
19160c24f70SZachary Turner     }
19260c24f70SZachary Turner 
193f8b22f8fSZachary Turner     PythonObject &
194f8b22f8fSZachary Turner     operator=(const PythonObject &other)
1952c1f46dcSZachary Turner     {
196f8b22f8fSZachary Turner         Reset(PyRefType::Borrowed, other.get());
197f8b22f8fSZachary Turner         return *this;
1982c1f46dcSZachary Turner     }
1992c1f46dcSZachary Turner 
2007841efbbSZachary Turner     PyObjectType
2017841efbbSZachary Turner     GetObjectType() const;
2027841efbbSZachary Turner 
2037841efbbSZachary Turner     PythonString
2047841efbbSZachary Turner     Repr() const;
2057841efbbSZachary Turner 
2067841efbbSZachary Turner     PythonString
2077841efbbSZachary Turner     Str() const;
2087841efbbSZachary Turner 
2097841efbbSZachary Turner     static PythonObject
21002bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict);
2117841efbbSZachary Turner 
212b58fb2f4SZachary Turner     template<typename T>
213b58fb2f4SZachary Turner     static T
21402bf92d2SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict)
215b58fb2f4SZachary Turner     {
216b58fb2f4SZachary Turner         return ResolveNameWithDictionary(name, dict).AsType<T>();
217b58fb2f4SZachary Turner     }
218b58fb2f4SZachary Turner 
2197841efbbSZachary Turner     PythonObject
2207841efbbSZachary Turner     ResolveName(llvm::StringRef name) const;
2217841efbbSZachary Turner 
222b58fb2f4SZachary Turner     template<typename T>
223b58fb2f4SZachary Turner     T
224b58fb2f4SZachary Turner     ResolveName(llvm::StringRef name) const
225b58fb2f4SZachary Turner     {
226b58fb2f4SZachary Turner         return ResolveName(name).AsType<T>();
227b58fb2f4SZachary Turner     }
228b58fb2f4SZachary Turner 
2292c1f46dcSZachary Turner     bool
2309c40264fSZachary Turner     HasAttribute(llvm::StringRef attribute) const;
2319c40264fSZachary Turner 
2327d6d218eSZachary Turner     PythonObject
2337d6d218eSZachary Turner     GetAttributeValue(llvm::StringRef attribute) const;
2347d6d218eSZachary Turner 
2359c40264fSZachary Turner     bool
236f8b22f8fSZachary Turner     IsValid() const;
237f8b22f8fSZachary Turner 
238f8b22f8fSZachary Turner     bool
239f8b22f8fSZachary Turner     IsAllocated() const;
240f8b22f8fSZachary Turner 
241f8b22f8fSZachary Turner     bool
242f8b22f8fSZachary Turner     IsNone() const;
2432c1f46dcSZachary Turner 
2447d6d218eSZachary Turner     template<typename T>
2457d6d218eSZachary Turner     T AsType() const
2467d6d218eSZachary Turner     {
2477d6d218eSZachary Turner         if (!T::Check(m_py_obj))
2487d6d218eSZachary Turner             return T();
2497d6d218eSZachary Turner         return T(PyRefType::Borrowed, m_py_obj);
2507d6d218eSZachary Turner     }
2517d6d218eSZachary Turner 
2527841efbbSZachary Turner     StructuredData::ObjectSP
2537841efbbSZachary Turner     CreateStructuredObject() const;
2542c1f46dcSZachary Turner 
2552c1f46dcSZachary Turner protected:
2562c1f46dcSZachary Turner     PyObject* m_py_obj;
2572c1f46dcSZachary Turner };
2582c1f46dcSZachary Turner 
2592c1f46dcSZachary Turner class PythonString : public PythonObject
2602c1f46dcSZachary Turner {
2612c1f46dcSZachary Turner public:
2622c1f46dcSZachary Turner     PythonString();
263f8b22f8fSZachary Turner     explicit PythonString(llvm::StringRef string);
264f8b22f8fSZachary Turner     explicit PythonString(const char *string);
26587f47729SZachary Turner     PythonString(PyRefType type, PyObject *o);
26687f47729SZachary Turner     PythonString(const PythonString &object);
267edb35d95SEugene Zelenko 
268f8b22f8fSZachary Turner     ~PythonString() override;
2692c1f46dcSZachary Turner 
27022c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
27122c8efcdSZachary Turner 
272f8b22f8fSZachary Turner     // Bring in the no-argument base class version
273f8b22f8fSZachary Turner     using PythonObject::Reset;
274f8b22f8fSZachary Turner 
275f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
2762c1f46dcSZachary Turner 
2772c1f46dcSZachary Turner     llvm::StringRef
2782c1f46dcSZachary Turner     GetString() const;
2792c1f46dcSZachary Turner 
2802c1f46dcSZachary Turner     size_t
2812c1f46dcSZachary Turner     GetSize() const;
2822c1f46dcSZachary Turner 
2832c1f46dcSZachary Turner     void SetString(llvm::StringRef string);
2842c1f46dcSZachary Turner 
2852c1f46dcSZachary Turner     StructuredData::StringSP CreateStructuredString() const;
2862c1f46dcSZachary Turner };
2872c1f46dcSZachary Turner 
2882c1f46dcSZachary Turner class PythonInteger : public PythonObject
2892c1f46dcSZachary Turner {
2902c1f46dcSZachary Turner public:
2912c1f46dcSZachary Turner     PythonInteger();
29287f47729SZachary Turner     explicit PythonInteger(int64_t value);
293f8b22f8fSZachary Turner     PythonInteger(PyRefType type, PyObject *o);
294f8b22f8fSZachary Turner     PythonInteger(const PythonInteger &object);
295edb35d95SEugene Zelenko 
296f8b22f8fSZachary Turner     ~PythonInteger() override;
2972c1f46dcSZachary Turner 
29822c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
29922c8efcdSZachary Turner 
300f8b22f8fSZachary Turner     // Bring in the no-argument base class version
301f8b22f8fSZachary Turner     using PythonObject::Reset;
302f8b22f8fSZachary Turner 
303f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3042c1f46dcSZachary Turner 
3052c1f46dcSZachary Turner     int64_t GetInteger() const;
3062c1f46dcSZachary Turner 
3072c1f46dcSZachary Turner     void
3082c1f46dcSZachary Turner     SetInteger (int64_t value);
3092c1f46dcSZachary Turner 
3102c1f46dcSZachary Turner     StructuredData::IntegerSP CreateStructuredInteger() const;
3112c1f46dcSZachary Turner };
3122c1f46dcSZachary Turner 
3132c1f46dcSZachary Turner class PythonList : public PythonObject
3142c1f46dcSZachary Turner {
3152c1f46dcSZachary Turner public:
316a1405147SZachary Turner     PythonList() {}
31787f47729SZachary Turner     explicit PythonList(PyInitialValue value);
31887f47729SZachary Turner     explicit PythonList(int list_size);
319f8b22f8fSZachary Turner     PythonList(PyRefType type, PyObject *o);
320f8b22f8fSZachary Turner     PythonList(const PythonList &list);
321edb35d95SEugene Zelenko 
322f8b22f8fSZachary Turner     ~PythonList() override;
3232c1f46dcSZachary Turner 
32422c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
32522c8efcdSZachary Turner 
326f8b22f8fSZachary Turner     // Bring in the no-argument base class version
327f8b22f8fSZachary Turner     using PythonObject::Reset;
328f8b22f8fSZachary Turner 
329f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3302c1f46dcSZachary Turner 
3312c1f46dcSZachary Turner     uint32_t GetSize() const;
3322c1f46dcSZachary Turner 
3332c1f46dcSZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
3342c1f46dcSZachary Turner 
335f8b22f8fSZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
3362c1f46dcSZachary Turner 
337f8b22f8fSZachary Turner     void AppendItem(const PythonObject &object);
3382c1f46dcSZachary Turner 
3392c1f46dcSZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
3402c1f46dcSZachary Turner };
3412c1f46dcSZachary Turner 
342a1405147SZachary Turner class PythonTuple : public PythonObject
343a1405147SZachary Turner {
344a1405147SZachary Turner public:
345a1405147SZachary Turner     PythonTuple() {}
346a1405147SZachary Turner     explicit PythonTuple(PyInitialValue value);
347a1405147SZachary Turner     explicit PythonTuple(int tuple_size);
348a1405147SZachary Turner     PythonTuple(PyRefType type, PyObject *o);
349a1405147SZachary Turner     PythonTuple(const PythonTuple &tuple);
350a1405147SZachary Turner     PythonTuple(std::initializer_list<PythonObject> objects);
351a1405147SZachary Turner     PythonTuple(std::initializer_list<PyObject*> objects);
352a1405147SZachary Turner 
353a1405147SZachary Turner     ~PythonTuple() override;
354a1405147SZachary Turner 
355a1405147SZachary Turner     static bool Check(PyObject *py_obj);
356a1405147SZachary Turner 
357a1405147SZachary Turner     // Bring in the no-argument base class version
358a1405147SZachary Turner     using PythonObject::Reset;
359a1405147SZachary Turner 
360a1405147SZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
361a1405147SZachary Turner 
362a1405147SZachary Turner     uint32_t GetSize() const;
363a1405147SZachary Turner 
364a1405147SZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
365a1405147SZachary Turner 
366a1405147SZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
367a1405147SZachary Turner 
368a1405147SZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
369a1405147SZachary Turner };
370a1405147SZachary Turner 
3712c1f46dcSZachary Turner class PythonDictionary : public PythonObject
3722c1f46dcSZachary Turner {
3732c1f46dcSZachary Turner public:
374a1405147SZachary Turner     PythonDictionary() {}
37587f47729SZachary Turner     explicit PythonDictionary(PyInitialValue value);
376f8b22f8fSZachary Turner     PythonDictionary(PyRefType type, PyObject *o);
377f8b22f8fSZachary Turner     PythonDictionary(const PythonDictionary &dict);
378edb35d95SEugene Zelenko 
379f8b22f8fSZachary Turner     ~PythonDictionary() override;
3802c1f46dcSZachary Turner 
38122c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
38222c8efcdSZachary Turner 
383f8b22f8fSZachary Turner     // Bring in the no-argument base class version
384f8b22f8fSZachary Turner     using PythonObject::Reset;
385f8b22f8fSZachary Turner 
386f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3872c1f46dcSZachary Turner 
3882c1f46dcSZachary Turner     uint32_t GetSize() const;
3892c1f46dcSZachary Turner 
390f8b22f8fSZachary Turner     PythonList GetKeys() const;
3912c1f46dcSZachary Turner 
392f8b22f8fSZachary Turner     PythonObject GetItemForKey(const PythonObject &key) const;
393f8b22f8fSZachary Turner     void SetItemForKey(const PythonObject &key, const PythonObject &value);
3942c1f46dcSZachary Turner 
3952c1f46dcSZachary Turner     StructuredData::DictionarySP CreateStructuredDictionary() const;
3962c1f46dcSZachary Turner };
39787f47729SZachary Turner 
3987841efbbSZachary Turner class PythonModule : public PythonObject
3997841efbbSZachary Turner {
4007841efbbSZachary Turner   public:
4017841efbbSZachary Turner     PythonModule();
4027841efbbSZachary Turner     PythonModule(PyRefType type, PyObject *o);
4037841efbbSZachary Turner     PythonModule(const PythonModule &dict);
4047841efbbSZachary Turner 
4057841efbbSZachary Turner     ~PythonModule() override;
4067841efbbSZachary Turner 
4077841efbbSZachary Turner     static bool Check(PyObject *py_obj);
4087841efbbSZachary Turner 
409a1405147SZachary Turner     static PythonModule
410a1405147SZachary Turner     BuiltinsModule();
411a1405147SZachary Turner 
412a1405147SZachary Turner     static PythonModule
413a1405147SZachary Turner     MainModule();
414a1405147SZachary Turner 
415a1405147SZachary Turner     static PythonModule
416a1405147SZachary Turner     AddModule(llvm::StringRef module);
4177841efbbSZachary Turner 
418*2419f1d5SZachary Turner     static PythonModule
419*2419f1d5SZachary Turner     ImportModule(llvm::StringRef module);
420*2419f1d5SZachary Turner 
4217841efbbSZachary Turner     // Bring in the no-argument base class version
4227841efbbSZachary Turner     using PythonObject::Reset;
4237841efbbSZachary Turner 
4247841efbbSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4257841efbbSZachary Turner 
4267841efbbSZachary Turner     PythonDictionary GetDictionary() const;
4277841efbbSZachary Turner };
4287841efbbSZachary Turner 
429a1405147SZachary Turner class PythonCallable : public PythonObject
430a1405147SZachary Turner {
431a1405147SZachary Turner public:
432b58fb2f4SZachary Turner     struct ArgInfo {
433b58fb2f4SZachary Turner         size_t count;
434b58fb2f4SZachary Turner         bool has_varargs : 1;
435b58fb2f4SZachary Turner         bool has_kwargs : 1;
436b58fb2f4SZachary Turner     };
437b58fb2f4SZachary Turner 
438a1405147SZachary Turner     PythonCallable();
439a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
440a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
441a1405147SZachary Turner 
442a1405147SZachary Turner     ~PythonCallable() override;
443a1405147SZachary Turner 
444a1405147SZachary Turner     static bool
445a1405147SZachary Turner     Check(PyObject *py_obj);
446a1405147SZachary Turner 
447a1405147SZachary Turner     // Bring in the no-argument base class version
448a1405147SZachary Turner     using PythonObject::Reset;
449a1405147SZachary Turner 
450a1405147SZachary Turner     void
451a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
452a1405147SZachary Turner 
453b58fb2f4SZachary Turner     ArgInfo
454b58fb2f4SZachary Turner     GetNumArguments() const;
455b58fb2f4SZachary Turner 
456b58fb2f4SZachary Turner     PythonObject
457b58fb2f4SZachary Turner     operator ()();
458a1405147SZachary Turner 
459a1405147SZachary Turner     PythonObject
460a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
461a1405147SZachary Turner 
462a1405147SZachary Turner     PythonObject
463a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
464b58fb2f4SZachary Turner 
465b58fb2f4SZachary Turner     template<typename Arg, typename... Args>
466b58fb2f4SZachary Turner     PythonObject
467b58fb2f4SZachary Turner     operator ()(const Arg &arg, Args... args)
468b58fb2f4SZachary Turner     {
469b58fb2f4SZachary Turner         return operator()({ arg, args... });
470b58fb2f4SZachary Turner     }
471a1405147SZachary Turner };
472a1405147SZachary Turner 
473a1405147SZachary Turner 
4749c40264fSZachary Turner class PythonFile : public PythonObject
4759c40264fSZachary Turner {
4769c40264fSZachary Turner   public:
47732064024SZachary Turner     PythonFile();
478eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
479eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
4809c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
481edb35d95SEugene Zelenko 
4829c40264fSZachary Turner     ~PythonFile() override;
4839c40264fSZachary Turner 
4849c40264fSZachary Turner     static bool Check(PyObject *py_obj);
4859c40264fSZachary Turner 
4869c40264fSZachary Turner     using PythonObject::Reset;
4879c40264fSZachary Turner 
4889c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4899c40264fSZachary Turner     void Reset(File &file, const char *mode);
490eda01c31SZachary Turner 
491eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
4929c40264fSZachary Turner };
4939c40264fSZachary Turner 
4942c1f46dcSZachary Turner } // namespace lldb_private
4952c1f46dcSZachary Turner 
496a281b42bSZachary Turner #endif
497a281b42bSZachary Turner 
4982c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
499