blob: 44584e9fca58c95bfcaa90c276417936df37088d [file] [log] [blame]
Enrico Granatac6666262012-08-23 22:02:23 +00001//===-- PythonDataObjects.cpp ------------------------------------*- 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// In order to guarantee correct working with Python, Python.h *MUST* be
11// the *FIRST* header file included here.
12#ifdef LLDB_DISABLE_PYTHON
13
14// Python is disabled in this build
15
16#else
17
18#if defined (__APPLE__)
19#include <Python/Python.h>
20#else
21#include <Python.h>
22#endif
23
Filipe Cabecinhasb2e953d2012-08-27 16:54:58 +000024#include "lldb/Interpreter/PythonDataObjects.h"
Enrico Granatac6666262012-08-23 22:02:23 +000025
26using namespace lldb_private;
27using namespace lldb;
28
Greg Clayton12477552012-08-23 23:49:47 +000029PythonDataObject::PythonDataObject (PyObject* object) :
30 m_object(object)
Enrico Granatac6666262012-08-23 22:02:23 +000031{
32}
33
Greg Clayton12477552012-08-23 23:49:47 +000034PythonDataObject::PythonDataObject () :
35 m_object()
36{
37}
38
39PythonDataObject::~PythonDataObject ()
40{
41}
42
43PythonDataString
Enrico Granatac6666262012-08-23 22:02:23 +000044PythonDataObject::GetStringObject ()
45{
Greg Clayton12477552012-08-23 23:49:47 +000046 return PythonDataString(GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +000047}
48
Greg Clayton12477552012-08-23 23:49:47 +000049PythonDataInteger
Enrico Granatac6666262012-08-23 22:02:23 +000050PythonDataObject::GetIntegerObject ()
51{
Greg Clayton12477552012-08-23 23:49:47 +000052 return PythonDataInteger(GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +000053}
54
Greg Clayton12477552012-08-23 23:49:47 +000055PythonDataArray
Enrico Granatac6666262012-08-23 22:02:23 +000056PythonDataObject::GetArrayObject()
57{
Greg Clayton12477552012-08-23 23:49:47 +000058 return PythonDataArray(GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +000059}
60
Greg Clayton12477552012-08-23 23:49:47 +000061PythonDataDictionary
Enrico Granatac6666262012-08-23 22:02:23 +000062PythonDataObject::GetDictionaryObject()
63{
Greg Clayton12477552012-08-23 23:49:47 +000064 return PythonDataDictionary(GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +000065}
66
Greg Clayton12477552012-08-23 23:49:47 +000067PythonDataInteger::PythonDataInteger (bool create_empty) :
68 m_object(create_empty ? PyInt_FromLong(0) : NULL)
Enrico Granatac6666262012-08-23 22:02:23 +000069{
Greg Clayton12477552012-08-23 23:49:47 +000070}
71
72PythonDataInteger::PythonDataInteger (PyObject* object) :
73 m_object(object)
74{
75 if (object && !PyInt_Check(GetPythonObject()))
Enrico Granatac6666262012-08-23 22:02:23 +000076 m_object.Reset();
77}
78
Greg Clayton12477552012-08-23 23:49:47 +000079PythonDataInteger::PythonDataInteger (int64_t value) :
80 m_object(PyInt_FromLong(value))
Enrico Granatac6666262012-08-23 22:02:23 +000081{
82}
83
Greg Clayton12477552012-08-23 23:49:47 +000084
85PythonDataInteger::~PythonDataInteger ()
Enrico Granatac6666262012-08-23 22:02:23 +000086{
87}
88
89int64_t
90PythonDataInteger::GetInteger()
91{
92 if (m_object)
93 return PyInt_AsLong(GetPythonObject());
94 else
95 return UINT64_MAX;
96}
97
98void
99PythonDataInteger::SetInteger (int64_t value)
100{
101 m_object.Reset(PyInt_FromLong(value));
102}
103
Greg Clayton12477552012-08-23 23:49:47 +0000104PythonDataString::PythonDataString (bool create_empty) :
105 m_object(create_empty ? PyString_FromString("") : NULL)
Enrico Granatac6666262012-08-23 22:02:23 +0000106{
Greg Clayton12477552012-08-23 23:49:47 +0000107}
Enrico Granatac6666262012-08-23 22:02:23 +0000108
Greg Clayton12477552012-08-23 23:49:47 +0000109PythonDataString::PythonDataString (PyObject* object) :
110 m_object(object)
111{
112 if (object && !PyString_Check(GetPythonObject()))
113 m_object.Reset();
114}
115
116PythonDataString::PythonDataString (const char* string) :
117 m_object(PyString_FromString(string))
Enrico Granatac6666262012-08-23 22:02:23 +0000118{
119}
120
121PythonDataString::~PythonDataString ()
122{
123}
124
125const char*
Greg Claytonb8f126a2012-08-24 05:45:15 +0000126PythonDataString::GetString() const
Enrico Granatac6666262012-08-23 22:02:23 +0000127{
128 if (m_object)
129 return PyString_AsString(GetPythonObject());
130 return NULL;
131}
132
Greg Claytonb8f126a2012-08-24 05:45:15 +0000133size_t
134PythonDataString::GetSize() const
135{
136 if (m_object)
137 return PyString_Size(GetPythonObject());
138 return 0;
139}
140
Enrico Granatac6666262012-08-23 22:02:23 +0000141void
142PythonDataString::SetString (const char* string)
143{
144 m_object.Reset(PyString_FromString(string));
145}
146
Greg Clayton12477552012-08-23 23:49:47 +0000147PythonDataArray::PythonDataArray (bool create_empty) :
148 m_object(create_empty ? PyList_New(0) : NULL)
Enrico Granatac6666262012-08-23 22:02:23 +0000149{
150}
151
Greg Clayton12477552012-08-23 23:49:47 +0000152PythonDataArray::PythonDataArray (uint32_t count) :
153 m_object(PyList_New(count))
Enrico Granatac6666262012-08-23 22:02:23 +0000154{
Greg Clayton12477552012-08-23 23:49:47 +0000155}
156
157PythonDataArray::PythonDataArray (PyObject* object) :
158 m_object(object)
159{
160 if (object && !PyList_Check(GetPythonObject()))
Enrico Granatac6666262012-08-23 22:02:23 +0000161 m_object.Reset();
162}
163
164PythonDataArray::~PythonDataArray ()
165{
166}
167
168uint32_t
169PythonDataArray::GetSize()
170{
171 if (m_object)
172 return PyList_GET_SIZE(GetPythonObject());
173 return 0;
174}
175
Greg Clayton12477552012-08-23 23:49:47 +0000176PythonDataObject
Enrico Granatac6666262012-08-23 22:02:23 +0000177PythonDataArray::GetItemAtIndex (uint32_t index)
178{
179 if (m_object)
Greg Clayton12477552012-08-23 23:49:47 +0000180 return PythonDataObject(PyList_GetItem(GetPythonObject(), index));
Enrico Granatac6666262012-08-23 22:02:23 +0000181 return NULL;
182}
183
184void
Greg Clayton12477552012-08-23 23:49:47 +0000185PythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object)
Enrico Granatac6666262012-08-23 22:02:23 +0000186{
Greg Clayton12477552012-08-23 23:49:47 +0000187 if (m_object && object)
188 PyList_SetItem(GetPythonObject(), index, object.GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +0000189}
190
191void
Greg Clayton12477552012-08-23 23:49:47 +0000192PythonDataArray::AppendItem (const PythonDataObject &object)
Enrico Granatac6666262012-08-23 22:02:23 +0000193{
Greg Clayton12477552012-08-23 23:49:47 +0000194 if (m_object && object)
195 PyList_Append(GetPythonObject(), object.GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +0000196}
197
Greg Clayton12477552012-08-23 23:49:47 +0000198PythonDataDictionary::PythonDataDictionary (bool create_empty) :
199 m_object(create_empty ? PyDict_New() : NULL)
Enrico Granatac6666262012-08-23 22:02:23 +0000200{
201}
202
Greg Clayton12477552012-08-23 23:49:47 +0000203PythonDataDictionary::PythonDataDictionary (PyObject* object) :
204 m_object(object)
Enrico Granatac6666262012-08-23 22:02:23 +0000205{
Greg Clayton12477552012-08-23 23:49:47 +0000206 if (object && !PyDict_Check(GetPythonObject()))
Enrico Granatac6666262012-08-23 22:02:23 +0000207 m_object.Reset();
208}
209
210PythonDataDictionary::~PythonDataDictionary ()
211{
212}
213
214uint32_t
215PythonDataDictionary::GetSize()
216{
217 if (m_object)
218 return PyDict_Size(GetPythonObject());
219 return 0;
220}
221
Greg Clayton12477552012-08-23 23:49:47 +0000222PythonDataObject
Greg Clayton88b980b2012-08-24 01:42:50 +0000223PythonDataDictionary::GetItemForKey (const char *key) const
Enrico Granatac6666262012-08-23 22:02:23 +0000224{
Greg Clayton12477552012-08-23 23:49:47 +0000225 if (key && key[0])
226 {
227 PythonDataString python_key(key);
228 return GetItemForKey(python_key);
229 }
Enrico Granatac6666262012-08-23 22:02:23 +0000230 return NULL;
231}
232
Greg Clayton12477552012-08-23 23:49:47 +0000233
234PythonDataObject
Greg Clayton88b980b2012-08-24 01:42:50 +0000235PythonDataDictionary::GetItemForKey (const PythonDataString &key) const
Greg Clayton12477552012-08-23 23:49:47 +0000236{
237 if (m_object && key)
238 return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject()));
239 return PythonDataObject();
240}
241
Greg Clayton88b980b2012-08-24 01:42:50 +0000242
243const char *
244PythonDataDictionary::GetItemForKeyAsString (const PythonDataString &key, const char *fail_value) const
245{
246 if (m_object && key)
247 {
248 PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject());
249 if (object && PyString_Check(object))
250 return PyString_AsString(object);
251 }
252 return fail_value;
253}
254
255int64_t
256PythonDataDictionary::GetItemForKeyAsInteger (const PythonDataString &key, int64_t fail_value) const
257{
258 if (m_object && key)
259 {
260 PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject());
261 if (object && PyInt_Check(object))
262 return PyInt_AsLong(object);
263 }
264 return fail_value;
265}
266
Greg Clayton12477552012-08-23 23:49:47 +0000267PythonDataArray
Greg Clayton88b980b2012-08-24 01:42:50 +0000268PythonDataDictionary::GetKeys () const
Enrico Granatac6666262012-08-23 22:02:23 +0000269{
270 if (m_object)
Greg Clayton12477552012-08-23 23:49:47 +0000271 return PythonDataArray(PyDict_Keys(GetPythonObject()));
272 return PythonDataArray();
Enrico Granatac6666262012-08-23 22:02:23 +0000273}
274
Greg Clayton12477552012-08-23 23:49:47 +0000275PythonDataString
Greg Clayton88b980b2012-08-24 01:42:50 +0000276PythonDataDictionary::GetKeyAtPosition (uint32_t pos) const
Enrico Granatac6666262012-08-23 22:02:23 +0000277{
278 PyObject *key, *value;
279 Py_ssize_t pos_iter = 0;
280
Greg Clayton12477552012-08-23 23:49:47 +0000281 if (m_object)
282 {
283 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value))
284 {
285 if (pos-- == 0)
286 return PythonDataString(key);
287 }
Enrico Granatac6666262012-08-23 22:02:23 +0000288 }
Greg Clayton12477552012-08-23 23:49:47 +0000289 return PythonDataString();
Enrico Granatac6666262012-08-23 22:02:23 +0000290}
291
Greg Clayton12477552012-08-23 23:49:47 +0000292PythonDataObject
Greg Clayton88b980b2012-08-24 01:42:50 +0000293PythonDataDictionary::GetValueAtPosition (uint32_t pos) const
Enrico Granatac6666262012-08-23 22:02:23 +0000294{
295 PyObject *key, *value;
296 Py_ssize_t pos_iter = 0;
297
298 if (!m_object)
299 return NULL;
300
301 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) {
302 if (pos-- == 0)
Greg Clayton12477552012-08-23 23:49:47 +0000303 return PythonDataObject(value);
Enrico Granatac6666262012-08-23 22:02:23 +0000304 }
Greg Clayton12477552012-08-23 23:49:47 +0000305 return PythonDataObject();
Enrico Granatac6666262012-08-23 22:02:23 +0000306}
307
308void
Greg Clayton12477552012-08-23 23:49:47 +0000309PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value)
Enrico Granatac6666262012-08-23 22:02:23 +0000310{
Greg Clayton12477552012-08-23 23:49:47 +0000311 if (m_object && key && value)
312 PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +0000313}
314
315#endif