PythonDataObjects.h revision 95eeb63432ac232f81cf9ee3301abddd7ce2f817
1//===-- PythonDataObjects.h----------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_PythonDataObjects_h_
11#define liblldb_PythonDataObjects_h_
12
13// C Includes
14// C++ Includes
15
16// Other libraries and framework includes
17// Project includes
18#include "lldb/lldb-defines.h"
19#include "lldb/Core/ConstString.h"
20#include "lldb/Core/Flags.h"
21#include "lldb/Interpreter/OptionValue.h"
22#if defined (__APPLE__)
23#include <Python/Python.h>
24#else
25#include <Python.h>
26#endif
27
28namespace lldb_private {
29
30    class PythonObject
31    {
32    public:
33        PythonObject () :
34            m_py_obj(NULL)
35        {
36        }
37
38        PythonObject (PyObject* py_obj) :
39            m_py_obj(NULL)
40        {
41            Reset (py_obj);
42        }
43
44        PythonObject (const PythonObject &rhs) :
45            m_py_obj(NULL)
46        {
47            Reset (rhs.m_py_obj);
48        }
49
50        PythonObject (const lldb::ScriptInterpreterObjectSP &script_object_sp);
51
52        virtual
53        ~PythonObject ()
54        {
55            Reset (NULL);
56        }
57
58        const PythonObject &
59        operator = (const PythonObject &rhs)
60        {
61            if (this != &rhs)
62                Reset (rhs.m_py_obj);
63            return *this;
64        }
65
66        bool
67        Reset (const PythonObject &object)
68        {
69            return Reset(object.GetPythonObject());
70        }
71
72        virtual bool
73        Reset (PyObject* py_obj = NULL)
74        {
75            if (py_obj != m_py_obj)
76            {
77                Py_XDECREF(m_py_obj);
78                m_py_obj = py_obj;
79                Py_XINCREF(m_py_obj);
80            }
81            return true;
82        }
83
84        void
85        Dump () const
86        {
87            if (m_py_obj)
88                _PyObject_Dump (m_py_obj);
89            else
90                puts ("NULL");
91        }
92
93        void
94        Dump (Stream &strm) const;
95
96        PyObject*
97        GetPythonObject () const
98        {
99            return m_py_obj;
100        }
101
102        PythonString
103        Repr ();
104
105        PythonString
106        Str ();
107
108        operator bool () const
109        {
110            return m_py_obj != NULL;
111        }
112
113    protected:
114        PyObject* m_py_obj;
115    };
116
117    class PythonString: public PythonObject
118    {
119    public:
120
121        PythonString ();
122        PythonString (PyObject *o);
123        PythonString (const PythonObject &object);
124        PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp);
125        PythonString (const char* string);
126        virtual ~PythonString ();
127
128        virtual bool
129        Reset (PyObject* py_obj = NULL);
130
131        const char*
132        GetString() const;
133
134        size_t
135        GetSize() const;
136
137        void
138        SetString (const char* string);
139    };
140
141    class PythonInteger: public PythonObject
142    {
143    public:
144
145        PythonInteger ();
146        PythonInteger (PyObject* py_obj);
147        PythonInteger (const PythonObject &object);
148        PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp);
149        PythonInteger (int64_t value);
150        virtual ~PythonInteger ();
151
152        virtual bool
153        Reset (PyObject* py_obj = NULL);
154
155        int64_t
156        GetInteger();
157
158        void
159        SetInteger (int64_t value);
160    };
161
162    class PythonList: public PythonObject
163    {
164    public:
165
166        PythonList ();
167        PythonList (PyObject* py_obj);
168        PythonList (const PythonObject &object);
169        PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp);
170        PythonList (uint32_t count);
171        virtual ~PythonList ();
172
173        virtual bool
174        Reset (PyObject* py_obj = NULL);
175
176        uint32_t
177        GetSize();
178
179        PythonObject
180        GetItemAtIndex (uint32_t index);
181
182        void
183        SetItemAtIndex (uint32_t index, const PythonObject &object);
184
185        void
186        AppendItem (const PythonObject &object);
187    };
188
189    class PythonDictionary: public PythonObject
190    {
191    public:
192
193        PythonDictionary ();
194        PythonDictionary (PyObject* object);
195        PythonDictionary (const PythonObject &object);
196        PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp);
197        virtual ~PythonDictionary ();
198
199        virtual bool
200        Reset (PyObject* object = NULL);
201
202        uint32_t GetSize();
203
204        PythonObject
205        GetItemForKey (const PythonString &key) const;
206
207        const char *
208        GetItemForKeyAsString (const PythonString &key, const char *fail_value = NULL) const;
209
210        int64_t
211        GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value = 0) const;
212
213        PythonObject
214        GetItemForKey (const char *key) const;
215
216        typedef bool (*DictionaryIteratorCallback)(PythonString* key, PythonDictionary* dict);
217
218        PythonList
219        GetKeys () const;
220
221        PythonString
222        GetKeyAtPosition (uint32_t pos) const;
223
224        PythonObject
225        GetValueAtPosition (uint32_t pos) const;
226
227        void
228        SetItemForKey (const PythonString &key, const PythonObject& value);
229    };
230
231} // namespace lldb_private
232
233#endif  // liblldb_PythonDataObjects_h_
234