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,
73*a1405147SZachary Turner     Callable,
74*a1405147SZachary 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
208*a1405147SZachary Turner     ResolveNameWithDictionary(llvm::StringRef name, PythonDictionary dict);
2097841efbbSZachary Turner 
2107841efbbSZachary Turner     PythonObject
2117841efbbSZachary Turner     ResolveName(llvm::StringRef name) const;
2127841efbbSZachary Turner 
2132c1f46dcSZachary Turner     bool
2149c40264fSZachary Turner     HasAttribute(llvm::StringRef attribute) const;
2159c40264fSZachary Turner 
2167d6d218eSZachary Turner     PythonObject
2177d6d218eSZachary Turner     GetAttributeValue(llvm::StringRef attribute) const;
2187d6d218eSZachary Turner 
2199c40264fSZachary Turner     bool
220f8b22f8fSZachary Turner     IsValid() const;
221f8b22f8fSZachary Turner 
222f8b22f8fSZachary Turner     bool
223f8b22f8fSZachary Turner     IsAllocated() const;
224f8b22f8fSZachary Turner 
225f8b22f8fSZachary Turner     bool
226f8b22f8fSZachary Turner     IsNone() const;
2272c1f46dcSZachary Turner 
2287d6d218eSZachary Turner     template<typename T>
2297d6d218eSZachary Turner     T AsType() const
2307d6d218eSZachary Turner     {
2317d6d218eSZachary Turner         if (!T::Check(m_py_obj))
2327d6d218eSZachary Turner             return T();
2337d6d218eSZachary Turner         return T(PyRefType::Borrowed, m_py_obj);
2347d6d218eSZachary Turner     }
2357d6d218eSZachary Turner 
2367841efbbSZachary Turner     StructuredData::ObjectSP
2377841efbbSZachary Turner     CreateStructuredObject() const;
2382c1f46dcSZachary Turner 
2392c1f46dcSZachary Turner protected:
2402c1f46dcSZachary Turner     PyObject* m_py_obj;
2412c1f46dcSZachary Turner };
2422c1f46dcSZachary Turner 
2432c1f46dcSZachary Turner class PythonString : public PythonObject
2442c1f46dcSZachary Turner {
2452c1f46dcSZachary Turner public:
2462c1f46dcSZachary Turner     PythonString();
247f8b22f8fSZachary Turner     explicit PythonString(llvm::StringRef string);
248f8b22f8fSZachary Turner     explicit PythonString(const char *string);
24987f47729SZachary Turner     PythonString(PyRefType type, PyObject *o);
25087f47729SZachary Turner     PythonString(const PythonString &object);
251edb35d95SEugene Zelenko 
252f8b22f8fSZachary Turner     ~PythonString() override;
2532c1f46dcSZachary Turner 
25422c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
25522c8efcdSZachary Turner 
256f8b22f8fSZachary Turner     // Bring in the no-argument base class version
257f8b22f8fSZachary Turner     using PythonObject::Reset;
258f8b22f8fSZachary Turner 
259f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
2602c1f46dcSZachary Turner 
2612c1f46dcSZachary Turner     llvm::StringRef
2622c1f46dcSZachary Turner     GetString() const;
2632c1f46dcSZachary Turner 
2642c1f46dcSZachary Turner     size_t
2652c1f46dcSZachary Turner     GetSize() const;
2662c1f46dcSZachary Turner 
2672c1f46dcSZachary Turner     void SetString(llvm::StringRef string);
2682c1f46dcSZachary Turner 
2692c1f46dcSZachary Turner     StructuredData::StringSP CreateStructuredString() const;
2702c1f46dcSZachary Turner };
2712c1f46dcSZachary Turner 
2722c1f46dcSZachary Turner class PythonInteger : public PythonObject
2732c1f46dcSZachary Turner {
2742c1f46dcSZachary Turner public:
2752c1f46dcSZachary Turner     PythonInteger();
27687f47729SZachary Turner     explicit PythonInteger(int64_t value);
277f8b22f8fSZachary Turner     PythonInteger(PyRefType type, PyObject *o);
278f8b22f8fSZachary Turner     PythonInteger(const PythonInteger &object);
279edb35d95SEugene Zelenko 
280f8b22f8fSZachary Turner     ~PythonInteger() override;
2812c1f46dcSZachary Turner 
28222c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
28322c8efcdSZachary Turner 
284f8b22f8fSZachary Turner     // Bring in the no-argument base class version
285f8b22f8fSZachary Turner     using PythonObject::Reset;
286f8b22f8fSZachary Turner 
287f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
2882c1f46dcSZachary Turner 
2892c1f46dcSZachary Turner     int64_t GetInteger() const;
2902c1f46dcSZachary Turner 
2912c1f46dcSZachary Turner     void
2922c1f46dcSZachary Turner     SetInteger (int64_t value);
2932c1f46dcSZachary Turner 
2942c1f46dcSZachary Turner     StructuredData::IntegerSP CreateStructuredInteger() const;
2952c1f46dcSZachary Turner };
2962c1f46dcSZachary Turner 
2972c1f46dcSZachary Turner class PythonList : public PythonObject
2982c1f46dcSZachary Turner {
2992c1f46dcSZachary Turner public:
300*a1405147SZachary Turner     PythonList() {}
30187f47729SZachary Turner     explicit PythonList(PyInitialValue value);
30287f47729SZachary Turner     explicit PythonList(int list_size);
303f8b22f8fSZachary Turner     PythonList(PyRefType type, PyObject *o);
304f8b22f8fSZachary Turner     PythonList(const PythonList &list);
305edb35d95SEugene Zelenko 
306f8b22f8fSZachary Turner     ~PythonList() override;
3072c1f46dcSZachary Turner 
30822c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
30922c8efcdSZachary Turner 
310f8b22f8fSZachary Turner     // Bring in the no-argument base class version
311f8b22f8fSZachary Turner     using PythonObject::Reset;
312f8b22f8fSZachary Turner 
313f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3142c1f46dcSZachary Turner 
3152c1f46dcSZachary Turner     uint32_t GetSize() const;
3162c1f46dcSZachary Turner 
3172c1f46dcSZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
3182c1f46dcSZachary Turner 
319f8b22f8fSZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
3202c1f46dcSZachary Turner 
321f8b22f8fSZachary Turner     void AppendItem(const PythonObject &object);
3222c1f46dcSZachary Turner 
3232c1f46dcSZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
3242c1f46dcSZachary Turner };
3252c1f46dcSZachary Turner 
326*a1405147SZachary Turner class PythonTuple : public PythonObject
327*a1405147SZachary Turner {
328*a1405147SZachary Turner public:
329*a1405147SZachary Turner     PythonTuple() {}
330*a1405147SZachary Turner     explicit PythonTuple(PyInitialValue value);
331*a1405147SZachary Turner     explicit PythonTuple(int tuple_size);
332*a1405147SZachary Turner     PythonTuple(PyRefType type, PyObject *o);
333*a1405147SZachary Turner     PythonTuple(const PythonTuple &tuple);
334*a1405147SZachary Turner     PythonTuple(std::initializer_list<PythonObject> objects);
335*a1405147SZachary Turner     PythonTuple(std::initializer_list<PyObject*> objects);
336*a1405147SZachary Turner 
337*a1405147SZachary Turner     ~PythonTuple() override;
338*a1405147SZachary Turner 
339*a1405147SZachary Turner     static bool Check(PyObject *py_obj);
340*a1405147SZachary Turner 
341*a1405147SZachary Turner     // Bring in the no-argument base class version
342*a1405147SZachary Turner     using PythonObject::Reset;
343*a1405147SZachary Turner 
344*a1405147SZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
345*a1405147SZachary Turner 
346*a1405147SZachary Turner     uint32_t GetSize() const;
347*a1405147SZachary Turner 
348*a1405147SZachary Turner     PythonObject GetItemAtIndex(uint32_t index) const;
349*a1405147SZachary Turner 
350*a1405147SZachary Turner     void SetItemAtIndex(uint32_t index, const PythonObject &object);
351*a1405147SZachary Turner 
352*a1405147SZachary Turner     StructuredData::ArraySP CreateStructuredArray() const;
353*a1405147SZachary Turner };
354*a1405147SZachary Turner 
3552c1f46dcSZachary Turner class PythonDictionary : public PythonObject
3562c1f46dcSZachary Turner {
3572c1f46dcSZachary Turner public:
358*a1405147SZachary Turner     PythonDictionary() {}
35987f47729SZachary Turner     explicit PythonDictionary(PyInitialValue value);
360f8b22f8fSZachary Turner     PythonDictionary(PyRefType type, PyObject *o);
361f8b22f8fSZachary Turner     PythonDictionary(const PythonDictionary &dict);
362edb35d95SEugene Zelenko 
363f8b22f8fSZachary Turner     ~PythonDictionary() override;
3642c1f46dcSZachary Turner 
36522c8efcdSZachary Turner     static bool Check(PyObject *py_obj);
36622c8efcdSZachary Turner 
367f8b22f8fSZachary Turner     // Bring in the no-argument base class version
368f8b22f8fSZachary Turner     using PythonObject::Reset;
369f8b22f8fSZachary Turner 
370f8b22f8fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
3712c1f46dcSZachary Turner 
3722c1f46dcSZachary Turner     uint32_t GetSize() const;
3732c1f46dcSZachary Turner 
374f8b22f8fSZachary Turner     PythonList GetKeys() const;
3752c1f46dcSZachary Turner 
376f8b22f8fSZachary Turner     PythonObject GetItemForKey(const PythonObject &key) const;
377f8b22f8fSZachary Turner     void SetItemForKey(const PythonObject &key, const PythonObject &value);
3782c1f46dcSZachary Turner 
3792c1f46dcSZachary Turner     StructuredData::DictionarySP CreateStructuredDictionary() const;
3802c1f46dcSZachary Turner };
38187f47729SZachary Turner 
3827841efbbSZachary Turner class PythonModule : public PythonObject
3837841efbbSZachary Turner {
3847841efbbSZachary Turner   public:
3857841efbbSZachary Turner     PythonModule();
3867841efbbSZachary Turner     PythonModule(PyRefType type, PyObject *o);
3877841efbbSZachary Turner     PythonModule(const PythonModule &dict);
3887841efbbSZachary Turner 
3897841efbbSZachary Turner     ~PythonModule() override;
3907841efbbSZachary Turner 
3917841efbbSZachary Turner     static bool Check(PyObject *py_obj);
3927841efbbSZachary Turner 
393*a1405147SZachary Turner     static PythonModule
394*a1405147SZachary Turner     BuiltinsModule();
395*a1405147SZachary Turner 
396*a1405147SZachary Turner     static PythonModule
397*a1405147SZachary Turner     MainModule();
398*a1405147SZachary Turner 
399*a1405147SZachary Turner     static PythonModule
400*a1405147SZachary Turner     AddModule(llvm::StringRef module);
4017841efbbSZachary Turner 
4027841efbbSZachary Turner     // Bring in the no-argument base class version
4037841efbbSZachary Turner     using PythonObject::Reset;
4047841efbbSZachary Turner 
4057841efbbSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4067841efbbSZachary Turner 
4077841efbbSZachary Turner     PythonDictionary GetDictionary() const;
4087841efbbSZachary Turner };
4097841efbbSZachary Turner 
410*a1405147SZachary Turner class PythonCallable : public PythonObject
411*a1405147SZachary Turner {
412*a1405147SZachary Turner public:
413*a1405147SZachary Turner     PythonCallable();
414*a1405147SZachary Turner     PythonCallable(PyRefType type, PyObject *o);
415*a1405147SZachary Turner     PythonCallable(const PythonCallable &dict);
416*a1405147SZachary Turner 
417*a1405147SZachary Turner     ~PythonCallable() override;
418*a1405147SZachary Turner 
419*a1405147SZachary Turner     static bool
420*a1405147SZachary Turner     Check(PyObject *py_obj);
421*a1405147SZachary Turner 
422*a1405147SZachary Turner     // Bring in the no-argument base class version
423*a1405147SZachary Turner     using PythonObject::Reset;
424*a1405147SZachary Turner 
425*a1405147SZachary Turner     void
426*a1405147SZachary Turner     Reset(PyRefType type, PyObject *py_obj) override;
427*a1405147SZachary Turner 
428*a1405147SZachary Turner     void
429*a1405147SZachary Turner     GetNumArguments(size_t &num_args, bool &has_varargs, bool &has_kwargs) const;
430*a1405147SZachary Turner 
431*a1405147SZachary Turner     PythonObject
432*a1405147SZachary Turner     operator ()(std::initializer_list<PyObject*> args);
433*a1405147SZachary Turner 
434*a1405147SZachary Turner     PythonObject
435*a1405147SZachary Turner     operator ()(std::initializer_list<PythonObject> args);
436*a1405147SZachary Turner };
437*a1405147SZachary Turner 
438*a1405147SZachary Turner 
4399c40264fSZachary Turner class PythonFile : public PythonObject
4409c40264fSZachary Turner {
4419c40264fSZachary Turner   public:
44232064024SZachary Turner     PythonFile();
443eda01c31SZachary Turner     PythonFile(File &file, const char *mode);
444eda01c31SZachary Turner     PythonFile(const char *path, const char *mode);
4459c40264fSZachary Turner     PythonFile(PyRefType type, PyObject *o);
446edb35d95SEugene Zelenko 
4479c40264fSZachary Turner     ~PythonFile() override;
4489c40264fSZachary Turner 
4499c40264fSZachary Turner     static bool Check(PyObject *py_obj);
4509c40264fSZachary Turner 
4519c40264fSZachary Turner     using PythonObject::Reset;
4529c40264fSZachary Turner 
4539c40264fSZachary Turner     void Reset(PyRefType type, PyObject *py_obj) override;
4549c40264fSZachary Turner     void Reset(File &file, const char *mode);
455eda01c31SZachary Turner 
456eda01c31SZachary Turner     bool GetUnderlyingFile(File &file) const;
4579c40264fSZachary Turner };
4589c40264fSZachary Turner 
4592c1f46dcSZachary Turner } // namespace lldb_private
4602c1f46dcSZachary Turner 
4612c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
462