PythonDataObjects.cpp revision 12477554ee676b775ec419575e1b091fa95bdc80
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 "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()
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
139PythonDataArray::PythonDataArray (bool create_empty) :
140    m_object(create_empty ? PyList_New(0) : NULL)
141{
142}
143
144PythonDataArray::PythonDataArray (uint32_t count) :
145    m_object(PyList_New(count))
146{
147}
148
149PythonDataArray::PythonDataArray (PyObject* object) :
150    m_object(object)
151{
152    if (object && !PyList_Check(GetPythonObject()))
153        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
168PythonDataObject
169PythonDataArray::GetItemAtIndex (uint32_t index)
170{
171    if (m_object)
172        return PythonDataObject(PyList_GetItem(GetPythonObject(), index));
173    return NULL;
174}
175
176void
177PythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object)
178{
179    if (m_object && object)
180        PyList_SetItem(GetPythonObject(), index, object.GetPythonObject());
181}
182
183void
184PythonDataArray::AppendItem (const PythonDataObject &object)
185{
186    if (m_object && object)
187        PyList_Append(GetPythonObject(), object.GetPythonObject());
188}
189
190PythonDataDictionary::PythonDataDictionary (bool create_empty) :
191    m_object(create_empty ? PyDict_New() : NULL)
192{
193}
194
195PythonDataDictionary::PythonDataDictionary (PyObject* object) :
196    m_object(object)
197{
198    if (object && !PyDict_Check(GetPythonObject()))
199        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
214PythonDataObject
215PythonDataDictionary::GetItemForKey (const char *key)
216{
217    if (key && key[0])
218    {
219        PythonDataString python_key(key);
220        return GetItemForKey(python_key);
221    }
222    return NULL;
223}
224
225
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
235PythonDataDictionary::GetKeys ()
236{
237    if (m_object)
238        return PythonDataArray(PyDict_Keys(GetPythonObject()));
239    return PythonDataArray();
240}
241
242PythonDataString
243PythonDataDictionary::GetKeyAtPosition (uint32_t pos)
244{
245    PyObject *key, *value;
246    Py_ssize_t pos_iter = 0;
247
248    if (m_object)
249    {
250        while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value))
251        {
252            if (pos-- == 0)
253                return PythonDataString(key);
254        }
255    }
256    return PythonDataString();
257}
258
259PythonDataObject
260PythonDataDictionary::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)
270            return PythonDataObject(value);
271    }
272    return PythonDataObject();
273}
274
275void
276PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value)
277{
278    if (m_object && key && value)
279        PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject());
280}
281
282#endif
283