1*2c1f46dcSZachary Turner //===-- PythonDataObjects.h----------------------------------------*- C++ -*-===//
2*2c1f46dcSZachary Turner //
3*2c1f46dcSZachary Turner //                     The LLVM Compiler Infrastructure
4*2c1f46dcSZachary Turner //
5*2c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source
6*2c1f46dcSZachary Turner // License. See LICENSE.TXT for details.
7*2c1f46dcSZachary Turner //
8*2c1f46dcSZachary Turner //===----------------------------------------------------------------------===//
9*2c1f46dcSZachary Turner 
10*2c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
11*2c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
12*2c1f46dcSZachary Turner 
13*2c1f46dcSZachary Turner // C Includes
14*2c1f46dcSZachary Turner // C++ Includes
15*2c1f46dcSZachary Turner 
16*2c1f46dcSZachary Turner // Other libraries and framework includes
17*2c1f46dcSZachary Turner // Project includes
18*2c1f46dcSZachary Turner #include "lldb/lldb-defines.h"
19*2c1f46dcSZachary Turner #include "lldb/Core/ConstString.h"
20*2c1f46dcSZachary Turner #include "lldb/Core/StructuredData.h"
21*2c1f46dcSZachary Turner #include "lldb/Core/Flags.h"
22*2c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h"
23*2c1f46dcSZachary Turner 
24*2c1f46dcSZachary Turner namespace lldb_private {
25*2c1f46dcSZachary Turner class PythonString;
26*2c1f46dcSZachary Turner class PythonList;
27*2c1f46dcSZachary Turner class PythonDictionary;
28*2c1f46dcSZachary Turner class PythonObject;
29*2c1f46dcSZachary Turner class PythonInteger;
30*2c1f46dcSZachary Turner 
31*2c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic
32*2c1f46dcSZachary Turner {
33*2c1f46dcSZachary Turner   public:
34*2c1f46dcSZachary Turner     StructuredPythonObject()
35*2c1f46dcSZachary Turner         : StructuredData::Generic()
36*2c1f46dcSZachary Turner     {
37*2c1f46dcSZachary Turner     }
38*2c1f46dcSZachary Turner 
39*2c1f46dcSZachary Turner     StructuredPythonObject(void *obj)
40*2c1f46dcSZachary Turner         : StructuredData::Generic(obj)
41*2c1f46dcSZachary Turner     {
42*2c1f46dcSZachary Turner         Py_XINCREF(GetValue());
43*2c1f46dcSZachary Turner     }
44*2c1f46dcSZachary Turner 
45*2c1f46dcSZachary Turner     virtual ~StructuredPythonObject()
46*2c1f46dcSZachary Turner     {
47*2c1f46dcSZachary Turner         if (Py_IsInitialized())
48*2c1f46dcSZachary Turner             Py_XDECREF(GetValue());
49*2c1f46dcSZachary Turner         SetValue(nullptr);
50*2c1f46dcSZachary Turner     }
51*2c1f46dcSZachary Turner 
52*2c1f46dcSZachary Turner     bool
53*2c1f46dcSZachary Turner     IsValid() const override
54*2c1f46dcSZachary Turner     {
55*2c1f46dcSZachary Turner         return GetValue() && GetValue() != Py_None;
56*2c1f46dcSZachary Turner     }
57*2c1f46dcSZachary Turner 
58*2c1f46dcSZachary Turner     void Dump(Stream &s) const override;
59*2c1f46dcSZachary Turner 
60*2c1f46dcSZachary Turner   private:
61*2c1f46dcSZachary Turner     DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
62*2c1f46dcSZachary Turner };
63*2c1f46dcSZachary Turner 
64*2c1f46dcSZachary Turner enum class PyObjectType
65*2c1f46dcSZachary Turner {
66*2c1f46dcSZachary Turner     Unknown,
67*2c1f46dcSZachary Turner     None,
68*2c1f46dcSZachary Turner     Integer,
69*2c1f46dcSZachary Turner     Dictionary,
70*2c1f46dcSZachary Turner     List,
71*2c1f46dcSZachary Turner     String
72*2c1f46dcSZachary Turner };
73*2c1f46dcSZachary Turner 
74*2c1f46dcSZachary Turner     class PythonObject
75*2c1f46dcSZachary Turner     {
76*2c1f46dcSZachary Turner     public:
77*2c1f46dcSZachary Turner         PythonObject () :
78*2c1f46dcSZachary Turner             m_py_obj(NULL)
79*2c1f46dcSZachary Turner         {
80*2c1f46dcSZachary Turner         }
81*2c1f46dcSZachary Turner 
82*2c1f46dcSZachary Turner         explicit PythonObject (PyObject* py_obj) :
83*2c1f46dcSZachary Turner             m_py_obj(NULL)
84*2c1f46dcSZachary Turner         {
85*2c1f46dcSZachary Turner             Reset (py_obj);
86*2c1f46dcSZachary Turner         }
87*2c1f46dcSZachary Turner 
88*2c1f46dcSZachary Turner         PythonObject (const PythonObject &rhs) :
89*2c1f46dcSZachary Turner             m_py_obj(NULL)
90*2c1f46dcSZachary Turner         {
91*2c1f46dcSZachary Turner             Reset (rhs.m_py_obj);
92*2c1f46dcSZachary Turner         }
93*2c1f46dcSZachary Turner 
94*2c1f46dcSZachary Turner         virtual
95*2c1f46dcSZachary Turner         ~PythonObject ()
96*2c1f46dcSZachary Turner         {
97*2c1f46dcSZachary Turner             Reset (NULL);
98*2c1f46dcSZachary Turner         }
99*2c1f46dcSZachary Turner 
100*2c1f46dcSZachary Turner         bool
101*2c1f46dcSZachary Turner         Reset (const PythonObject &object)
102*2c1f46dcSZachary Turner         {
103*2c1f46dcSZachary Turner             return Reset(object.get());
104*2c1f46dcSZachary Turner         }
105*2c1f46dcSZachary Turner 
106*2c1f46dcSZachary Turner         virtual bool
107*2c1f46dcSZachary Turner         Reset (PyObject* py_obj = NULL)
108*2c1f46dcSZachary Turner         {
109*2c1f46dcSZachary Turner             if (py_obj != m_py_obj)
110*2c1f46dcSZachary Turner             {
111*2c1f46dcSZachary Turner                 if (Py_IsInitialized())
112*2c1f46dcSZachary Turner                     Py_XDECREF(m_py_obj);
113*2c1f46dcSZachary Turner                 m_py_obj = py_obj;
114*2c1f46dcSZachary Turner                 if (Py_IsInitialized())
115*2c1f46dcSZachary Turner                     Py_XINCREF(m_py_obj);
116*2c1f46dcSZachary Turner             }
117*2c1f46dcSZachary Turner             return true;
118*2c1f46dcSZachary Turner         }
119*2c1f46dcSZachary Turner 
120*2c1f46dcSZachary Turner         void
121*2c1f46dcSZachary Turner         Dump () const
122*2c1f46dcSZachary Turner         {
123*2c1f46dcSZachary Turner             if (m_py_obj)
124*2c1f46dcSZachary Turner                 _PyObject_Dump (m_py_obj);
125*2c1f46dcSZachary Turner             else
126*2c1f46dcSZachary Turner                 puts ("NULL");
127*2c1f46dcSZachary Turner         }
128*2c1f46dcSZachary Turner 
129*2c1f46dcSZachary Turner         void
130*2c1f46dcSZachary Turner         Dump (Stream &strm) const;
131*2c1f46dcSZachary Turner 
132*2c1f46dcSZachary Turner         PyObject*
133*2c1f46dcSZachary Turner         get () const
134*2c1f46dcSZachary Turner         {
135*2c1f46dcSZachary Turner             return m_py_obj;
136*2c1f46dcSZachary Turner         }
137*2c1f46dcSZachary Turner 
138*2c1f46dcSZachary Turner         PyObjectType GetObjectType() const;
139*2c1f46dcSZachary Turner 
140*2c1f46dcSZachary Turner         PythonString
141*2c1f46dcSZachary Turner         Repr ();
142*2c1f46dcSZachary Turner 
143*2c1f46dcSZachary Turner         PythonString
144*2c1f46dcSZachary Turner         Str ();
145*2c1f46dcSZachary Turner 
146*2c1f46dcSZachary Turner         explicit operator bool () const
147*2c1f46dcSZachary Turner         {
148*2c1f46dcSZachary Turner             return m_py_obj != NULL;
149*2c1f46dcSZachary Turner         }
150*2c1f46dcSZachary Turner 
151*2c1f46dcSZachary Turner         bool
152*2c1f46dcSZachary Turner         IsNULLOrNone () const;
153*2c1f46dcSZachary Turner 
154*2c1f46dcSZachary Turner         StructuredData::ObjectSP CreateStructuredObject() const;
155*2c1f46dcSZachary Turner 
156*2c1f46dcSZachary Turner     protected:
157*2c1f46dcSZachary Turner         PyObject* m_py_obj;
158*2c1f46dcSZachary Turner     };
159*2c1f46dcSZachary Turner 
160*2c1f46dcSZachary Turner     class PythonString: public PythonObject
161*2c1f46dcSZachary Turner     {
162*2c1f46dcSZachary Turner     public:
163*2c1f46dcSZachary Turner         PythonString ();
164*2c1f46dcSZachary Turner         PythonString (PyObject *o);
165*2c1f46dcSZachary Turner         PythonString (const PythonObject &object);
166*2c1f46dcSZachary Turner         PythonString (llvm::StringRef string);
167*2c1f46dcSZachary Turner         PythonString (const char *string);
168*2c1f46dcSZachary Turner         virtual ~PythonString ();
169*2c1f46dcSZachary Turner 
170*2c1f46dcSZachary Turner         virtual bool
171*2c1f46dcSZachary Turner         Reset (PyObject* py_obj = NULL);
172*2c1f46dcSZachary Turner 
173*2c1f46dcSZachary Turner         llvm::StringRef
174*2c1f46dcSZachary Turner         GetString() const;
175*2c1f46dcSZachary Turner 
176*2c1f46dcSZachary Turner         size_t
177*2c1f46dcSZachary Turner         GetSize() const;
178*2c1f46dcSZachary Turner 
179*2c1f46dcSZachary Turner         void SetString(llvm::StringRef string);
180*2c1f46dcSZachary Turner 
181*2c1f46dcSZachary Turner         StructuredData::StringSP CreateStructuredString() const;
182*2c1f46dcSZachary Turner     };
183*2c1f46dcSZachary Turner 
184*2c1f46dcSZachary Turner     class PythonInteger: public PythonObject
185*2c1f46dcSZachary Turner     {
186*2c1f46dcSZachary Turner     public:
187*2c1f46dcSZachary Turner 
188*2c1f46dcSZachary Turner         PythonInteger ();
189*2c1f46dcSZachary Turner         PythonInteger (PyObject* py_obj);
190*2c1f46dcSZachary Turner         PythonInteger (const PythonObject &object);
191*2c1f46dcSZachary Turner         PythonInteger (int64_t value);
192*2c1f46dcSZachary Turner         virtual ~PythonInteger ();
193*2c1f46dcSZachary Turner 
194*2c1f46dcSZachary Turner         virtual bool
195*2c1f46dcSZachary Turner         Reset (PyObject* py_obj = NULL);
196*2c1f46dcSZachary Turner 
197*2c1f46dcSZachary Turner         int64_t GetInteger() const;
198*2c1f46dcSZachary Turner 
199*2c1f46dcSZachary Turner         void
200*2c1f46dcSZachary Turner         SetInteger (int64_t value);
201*2c1f46dcSZachary Turner 
202*2c1f46dcSZachary Turner         StructuredData::IntegerSP CreateStructuredInteger() const;
203*2c1f46dcSZachary Turner     };
204*2c1f46dcSZachary Turner 
205*2c1f46dcSZachary Turner     class PythonList: public PythonObject
206*2c1f46dcSZachary Turner     {
207*2c1f46dcSZachary Turner     public:
208*2c1f46dcSZachary Turner 
209*2c1f46dcSZachary Turner         PythonList (bool create_empty);
210*2c1f46dcSZachary Turner         PythonList (PyObject* py_obj);
211*2c1f46dcSZachary Turner         PythonList (const PythonObject &object);
212*2c1f46dcSZachary Turner         PythonList (uint32_t count);
213*2c1f46dcSZachary Turner         virtual ~PythonList ();
214*2c1f46dcSZachary Turner 
215*2c1f46dcSZachary Turner         virtual bool
216*2c1f46dcSZachary Turner         Reset (PyObject* py_obj = NULL);
217*2c1f46dcSZachary Turner 
218*2c1f46dcSZachary Turner         uint32_t GetSize() const;
219*2c1f46dcSZachary Turner 
220*2c1f46dcSZachary Turner         PythonObject GetItemAtIndex(uint32_t index) const;
221*2c1f46dcSZachary Turner 
222*2c1f46dcSZachary Turner         void
223*2c1f46dcSZachary Turner         SetItemAtIndex (uint32_t index, const PythonObject &object);
224*2c1f46dcSZachary Turner 
225*2c1f46dcSZachary Turner         void
226*2c1f46dcSZachary Turner         AppendItem (const PythonObject &object);
227*2c1f46dcSZachary Turner 
228*2c1f46dcSZachary Turner         StructuredData::ArraySP CreateStructuredArray() const;
229*2c1f46dcSZachary Turner     };
230*2c1f46dcSZachary Turner 
231*2c1f46dcSZachary Turner     class PythonDictionary: public PythonObject
232*2c1f46dcSZachary Turner     {
233*2c1f46dcSZachary Turner     public:
234*2c1f46dcSZachary Turner 
235*2c1f46dcSZachary Turner         explicit PythonDictionary (bool create_empty);
236*2c1f46dcSZachary Turner         PythonDictionary (PyObject* object);
237*2c1f46dcSZachary Turner         PythonDictionary (const PythonObject &object);
238*2c1f46dcSZachary Turner         virtual ~PythonDictionary ();
239*2c1f46dcSZachary Turner 
240*2c1f46dcSZachary Turner         virtual bool
241*2c1f46dcSZachary Turner         Reset (PyObject* object = NULL);
242*2c1f46dcSZachary Turner 
243*2c1f46dcSZachary Turner         uint32_t GetSize() const;
244*2c1f46dcSZachary Turner 
245*2c1f46dcSZachary Turner         PythonObject
246*2c1f46dcSZachary Turner         GetItemForKey (const PythonString &key) const;
247*2c1f46dcSZachary Turner 
248*2c1f46dcSZachary Turner         const char *
249*2c1f46dcSZachary Turner         GetItemForKeyAsString (const PythonString &key, const char *fail_value = NULL) const;
250*2c1f46dcSZachary Turner 
251*2c1f46dcSZachary Turner         int64_t
252*2c1f46dcSZachary Turner         GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value = 0) const;
253*2c1f46dcSZachary Turner 
254*2c1f46dcSZachary Turner         PythonObject
255*2c1f46dcSZachary Turner         GetItemForKey (const char *key) const;
256*2c1f46dcSZachary Turner 
257*2c1f46dcSZachary Turner         typedef bool (*DictionaryIteratorCallback)(PythonString* key, PythonDictionary* dict);
258*2c1f46dcSZachary Turner 
259*2c1f46dcSZachary Turner         PythonList
260*2c1f46dcSZachary Turner         GetKeys () const;
261*2c1f46dcSZachary Turner 
262*2c1f46dcSZachary Turner         PythonString
263*2c1f46dcSZachary Turner         GetKeyAtPosition (uint32_t pos) const;
264*2c1f46dcSZachary Turner 
265*2c1f46dcSZachary Turner         PythonObject
266*2c1f46dcSZachary Turner         GetValueAtPosition (uint32_t pos) const;
267*2c1f46dcSZachary Turner 
268*2c1f46dcSZachary Turner         void
269*2c1f46dcSZachary Turner         SetItemForKey (const PythonString &key, PyObject *value);
270*2c1f46dcSZachary Turner 
271*2c1f46dcSZachary Turner         void
272*2c1f46dcSZachary Turner         SetItemForKey (const PythonString &key, const PythonObject& value);
273*2c1f46dcSZachary Turner 
274*2c1f46dcSZachary Turner         StructuredData::DictionarySP CreateStructuredDictionary() const;
275*2c1f46dcSZachary Turner     };
276*2c1f46dcSZachary Turner 
277*2c1f46dcSZachary Turner } // namespace lldb_private
278*2c1f46dcSZachary Turner 
279*2c1f46dcSZachary Turner #endif  // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
280