blob: ba3879e68c561ae942cfc071ed0df6c1bb4dc459 [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
215PythonDataDictionary::GetItemForKey (const char *key)
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
227PythonDataDictionary::GetItemForKey (const PythonDataString &key)
228{
229 if (m_object && key)
230 return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject()));
231 return PythonDataObject();
232}
233
234PythonDataArray
Enrico Granatac6666262012-08-23 22:02:23 +0000235PythonDataDictionary::GetKeys ()
236{
237 if (m_object)
Greg Clayton12477552012-08-23 23:49:47 +0000238 return PythonDataArray(PyDict_Keys(GetPythonObject()));
239 return PythonDataArray();
Enrico Granatac6666262012-08-23 22:02:23 +0000240}
241
Greg Clayton12477552012-08-23 23:49:47 +0000242PythonDataString
Enrico Granatac6666262012-08-23 22:02:23 +0000243PythonDataDictionary::GetKeyAtPosition (uint32_t pos)
244{
245 PyObject *key, *value;
246 Py_ssize_t pos_iter = 0;
247
Greg Clayton12477552012-08-23 23:49:47 +0000248 if (m_object)
249 {
250 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value))
251 {
252 if (pos-- == 0)
253 return PythonDataString(key);
254 }
Enrico Granatac6666262012-08-23 22:02:23 +0000255 }
Greg Clayton12477552012-08-23 23:49:47 +0000256 return PythonDataString();
Enrico Granatac6666262012-08-23 22:02:23 +0000257}
258
Greg Clayton12477552012-08-23 23:49:47 +0000259PythonDataObject
Enrico Granatac6666262012-08-23 22:02:23 +0000260PythonDataDictionary::GetValueAtPosition (uint32_t pos)
261{
262 PyObject *key, *value;
263 Py_ssize_t pos_iter = 0;
264
265 if (!m_object)
266 return NULL;
267
268 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) {
269 if (pos-- == 0)
Greg Clayton12477552012-08-23 23:49:47 +0000270 return PythonDataObject(value);
Enrico Granatac6666262012-08-23 22:02:23 +0000271 }
Greg Clayton12477552012-08-23 23:49:47 +0000272 return PythonDataObject();
Enrico Granatac6666262012-08-23 22:02:23 +0000273}
274
275void
Greg Clayton12477552012-08-23 23:49:47 +0000276PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value)
Enrico Granatac6666262012-08-23 22:02:23 +0000277{
Greg Clayton12477552012-08-23 23:49:47 +0000278 if (m_object && key && value)
279 PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject());
Enrico Granatac6666262012-08-23 22:02:23 +0000280}
281
282#endif