blob: c41772cd208fae7b426428b49ad05dc824b8ebf0 [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
24#include "PythonDataObjects.h"
25
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*
126PythonDataString::GetString()
127{
128 if (m_object)
129 return PyString_AsString(GetPythonObject());
130 return NULL;
131}
132
133void
134PythonDataString::SetString (const char* string)
135{
136 m_object.Reset(PyString_FromString(string));
137}
138
Greg Clayton12477552012-08-23 23:49:47 +0000139PythonDataArray::PythonDataArray (bool create_empty) :
140 m_object(create_empty ? PyList_New(0) : NULL)
Enrico Granatac6666262012-08-23 22:02:23 +0000141{
142}
143
Greg Clayton12477552012-08-23 23:49:47 +0000144PythonDataArray::PythonDataArray (uint32_t count) :
145 m_object(PyList_New(count))
Enrico Granatac6666262012-08-23 22:02:23 +0000146{
Greg Clayton12477552012-08-23 23:49:47 +0000147}
148
149PythonDataArray::PythonDataArray (PyObject* object) :
150 m_object(object)
151{
152 if (object && !PyList_Check(GetPythonObject()))
Enrico Granatac6666262012-08-23 22:02:23 +0000153 m_object.Reset();
154}
155
156PythonDataArray::~PythonDataArray ()
157{
158}
159
160uint32_t
161PythonDataArray::GetSize()
162{
163 if (m_object)
164 return PyList_GET_SIZE(GetPythonObject());
165 return 0;
166}
167
Greg Clayton12477552012-08-23 23:49:47 +0000168PythonDataObject
Enrico Granatac6666262012-08-23 22:02:23 +0000169PythonDataArray::GetItemAtIndex (uint32_t index)
170{
171 if (m_object)
Greg Clayton12477552012-08-23 23:49:47 +0000172 return PythonDataObject(PyList_GetItem(GetPythonObject(), index));
Enrico Granatac6666262012-08-23 22:02:23 +0000173 return NULL;
174}
175
176void
Greg Clayton12477552012-08-23 23:49:47 +0000177PythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object)
Enrico Granatac6666262012-08-23 22:02:23 +0000178{
Greg Clayton12477552012-08-23 23:49:47 +0000179 if (m_object && object)
180 PyList_SetItem(GetPythonObject(), index, object.GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +0000181}
182
183void
Greg Clayton12477552012-08-23 23:49:47 +0000184PythonDataArray::AppendItem (const PythonDataObject &object)
Enrico Granatac6666262012-08-23 22:02:23 +0000185{
Greg Clayton12477552012-08-23 23:49:47 +0000186 if (m_object && object)
187 PyList_Append(GetPythonObject(), object.GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +0000188}
189
Greg Clayton12477552012-08-23 23:49:47 +0000190PythonDataDictionary::PythonDataDictionary (bool create_empty) :
191 m_object(create_empty ? PyDict_New() : NULL)
Enrico Granatac6666262012-08-23 22:02:23 +0000192{
193}
194
Greg Clayton12477552012-08-23 23:49:47 +0000195PythonDataDictionary::PythonDataDictionary (PyObject* object) :
196 m_object(object)
Enrico Granatac6666262012-08-23 22:02:23 +0000197{
Greg Clayton12477552012-08-23 23:49:47 +0000198 if (object && !PyDict_Check(GetPythonObject()))
Enrico Granatac6666262012-08-23 22:02:23 +0000199 m_object.Reset();
200}
201
202PythonDataDictionary::~PythonDataDictionary ()
203{
204}
205
206uint32_t
207PythonDataDictionary::GetSize()
208{
209 if (m_object)
210 return PyDict_Size(GetPythonObject());
211 return 0;
212}
213
Greg Clayton12477552012-08-23 23:49:47 +0000214PythonDataObject
Greg Clayton88b980b2012-08-24 01:42:50 +0000215PythonDataDictionary::GetItemForKey (const char *key) const
Enrico Granatac6666262012-08-23 22:02:23 +0000216{
Greg Clayton12477552012-08-23 23:49:47 +0000217 if (key && key[0])
218 {
219 PythonDataString python_key(key);
220 return GetItemForKey(python_key);
221 }
Enrico Granatac6666262012-08-23 22:02:23 +0000222 return NULL;
223}
224
Greg Clayton12477552012-08-23 23:49:47 +0000225
226PythonDataObject
Greg Clayton88b980b2012-08-24 01:42:50 +0000227PythonDataDictionary::GetItemForKey (const PythonDataString &key) const
Greg Clayton12477552012-08-23 23:49:47 +0000228{
229 if (m_object && key)
230 return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject()));
231 return PythonDataObject();
232}
233
Greg Clayton88b980b2012-08-24 01:42:50 +0000234
235const char *
236PythonDataDictionary::GetItemForKeyAsString (const PythonDataString &key, const char *fail_value) const
237{
238 if (m_object && key)
239 {
240 PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject());
241 if (object && PyString_Check(object))
242 return PyString_AsString(object);
243 }
244 return fail_value;
245}
246
247int64_t
248PythonDataDictionary::GetItemForKeyAsInteger (const PythonDataString &key, int64_t fail_value) const
249{
250 if (m_object && key)
251 {
252 PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject());
253 if (object && PyInt_Check(object))
254 return PyInt_AsLong(object);
255 }
256 return fail_value;
257}
258
Greg Clayton12477552012-08-23 23:49:47 +0000259PythonDataArray
Greg Clayton88b980b2012-08-24 01:42:50 +0000260PythonDataDictionary::GetKeys () const
Enrico Granatac6666262012-08-23 22:02:23 +0000261{
262 if (m_object)
Greg Clayton12477552012-08-23 23:49:47 +0000263 return PythonDataArray(PyDict_Keys(GetPythonObject()));
264 return PythonDataArray();
Enrico Granatac6666262012-08-23 22:02:23 +0000265}
266
Greg Clayton12477552012-08-23 23:49:47 +0000267PythonDataString
Greg Clayton88b980b2012-08-24 01:42:50 +0000268PythonDataDictionary::GetKeyAtPosition (uint32_t pos) const
Enrico Granatac6666262012-08-23 22:02:23 +0000269{
270 PyObject *key, *value;
271 Py_ssize_t pos_iter = 0;
272
Greg Clayton12477552012-08-23 23:49:47 +0000273 if (m_object)
274 {
275 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value))
276 {
277 if (pos-- == 0)
278 return PythonDataString(key);
279 }
Enrico Granatac6666262012-08-23 22:02:23 +0000280 }
Greg Clayton12477552012-08-23 23:49:47 +0000281 return PythonDataString();
Enrico Granatac6666262012-08-23 22:02:23 +0000282}
283
Greg Clayton12477552012-08-23 23:49:47 +0000284PythonDataObject
Greg Clayton88b980b2012-08-24 01:42:50 +0000285PythonDataDictionary::GetValueAtPosition (uint32_t pos) const
Enrico Granatac6666262012-08-23 22:02:23 +0000286{
287 PyObject *key, *value;
288 Py_ssize_t pos_iter = 0;
289
290 if (!m_object)
291 return NULL;
292
293 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) {
294 if (pos-- == 0)
Greg Clayton12477552012-08-23 23:49:47 +0000295 return PythonDataObject(value);
Enrico Granatac6666262012-08-23 22:02:23 +0000296 }
Greg Clayton12477552012-08-23 23:49:47 +0000297 return PythonDataObject();
Enrico Granatac6666262012-08-23 22:02:23 +0000298}
299
300void
Greg Clayton12477552012-08-23 23:49:47 +0000301PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value)
Enrico Granatac6666262012-08-23 22:02:23 +0000302{
Greg Clayton12477552012-08-23 23:49:47 +0000303 if (m_object && key && value)
304 PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +0000305}
306
307#endif