PythonDataObjects.cpp revision b2e953d1d753bc725ea78f573c150493b99e2205
1//===-- 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 "lldb/Interpreter/PythonDataObjects.h"
25
26using namespace lldb_private;
27using namespace lldb;
28
29PythonDataObject::PythonDataObject (PyObject* object) :
30    m_object(object)
31{
32}
33
34PythonDataObject::PythonDataObject () :
35    m_object()
36{
37}
38
39PythonDataObject::~PythonDataObject ()
40{
41}
42
43PythonDataString
44PythonDataObject::GetStringObject ()
45{
46    return PythonDataString(GetPythonObject());
47}
48
49PythonDataInteger
50PythonDataObject::GetIntegerObject ()
51{
52    return PythonDataInteger(GetPythonObject());
53}
54
55PythonDataArray
56PythonDataObject::GetArrayObject()
57{
58    return PythonDataArray(GetPythonObject());
59}
60
61PythonDataDictionary
62PythonDataObject::GetDictionaryObject()
63{
64    return PythonDataDictionary(GetPythonObject());
65}
66
67PythonDataInteger::PythonDataInteger (bool create_empty) :
68    m_object(create_empty ? PyInt_FromLong(0) : NULL)
69{
70}
71
72PythonDataInteger::PythonDataInteger (PyObject* object) :
73    m_object(object)
74{
75    if (object && !PyInt_Check(GetPythonObject()))
76        m_object.Reset();
77}
78
79PythonDataInteger::PythonDataInteger (int64_t value) :
80    m_object(PyInt_FromLong(value))
81{
82}
83
84
85PythonDataInteger::~PythonDataInteger ()
86{
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
104PythonDataString::PythonDataString (bool create_empty) :
105    m_object(create_empty ? PyString_FromString("") : NULL)
106{
107}
108
109PythonDataString::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))
118{
119}
120
121PythonDataString::~PythonDataString ()
122{
123}
124
125const char*
126PythonDataString::GetString() const
127{
128    if (m_object)
129        return PyString_AsString(GetPythonObject());
130    return NULL;
131}
132
133size_t
134PythonDataString::GetSize() const
135{
136    if (m_object)
137        return PyString_Size(GetPythonObject());
138    return 0;
139}
140
141void
142PythonDataString::SetString (const char* string)
143{
144    m_object.Reset(PyString_FromString(string));
145}
146
147PythonDataArray::PythonDataArray (bool create_empty) :
148    m_object(create_empty ? PyList_New(0) : NULL)
149{
150}
151
152PythonDataArray::PythonDataArray (uint32_t count) :
153    m_object(PyList_New(count))
154{
155}
156
157PythonDataArray::PythonDataArray (PyObject* object) :
158    m_object(object)
159{
160    if (object && !PyList_Check(GetPythonObject()))
161        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
176PythonDataObject
177PythonDataArray::GetItemAtIndex (uint32_t index)
178{
179    if (m_object)
180        return PythonDataObject(PyList_GetItem(GetPythonObject(), index));
181    return NULL;
182}
183
184void
185PythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object)
186{
187    if (m_object && object)
188        PyList_SetItem(GetPythonObject(), index, object.GetPythonObject());
189}
190
191void
192PythonDataArray::AppendItem (const PythonDataObject &object)
193{
194    if (m_object && object)
195        PyList_Append(GetPythonObject(), object.GetPythonObject());
196}
197
198PythonDataDictionary::PythonDataDictionary (bool create_empty) :
199    m_object(create_empty ? PyDict_New() : NULL)
200{
201}
202
203PythonDataDictionary::PythonDataDictionary (PyObject* object) :
204    m_object(object)
205{
206    if (object && !PyDict_Check(GetPythonObject()))
207        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
222PythonDataObject
223PythonDataDictionary::GetItemForKey (const char *key) const
224{
225    if (key && key[0])
226    {
227        PythonDataString python_key(key);
228        return GetItemForKey(python_key);
229    }
230    return NULL;
231}
232
233
234PythonDataObject
235PythonDataDictionary::GetItemForKey (const PythonDataString &key) const
236{
237    if (m_object && key)
238        return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject()));
239    return PythonDataObject();
240}
241
242
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
267PythonDataArray
268PythonDataDictionary::GetKeys () const
269{
270    if (m_object)
271        return PythonDataArray(PyDict_Keys(GetPythonObject()));
272    return PythonDataArray();
273}
274
275PythonDataString
276PythonDataDictionary::GetKeyAtPosition (uint32_t pos) const
277{
278    PyObject *key, *value;
279    Py_ssize_t pos_iter = 0;
280
281    if (m_object)
282    {
283        while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value))
284        {
285            if (pos-- == 0)
286                return PythonDataString(key);
287        }
288    }
289    return PythonDataString();
290}
291
292PythonDataObject
293PythonDataDictionary::GetValueAtPosition (uint32_t pos) const
294{
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)
303            return PythonDataObject(value);
304    }
305    return PythonDataObject();
306}
307
308void
309PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value)
310{
311    if (m_object && key && value)
312        PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject());
313}
314
315#endif
316