PythonDataObjects.cpp revision 52ebc0aab1fdecb634801deceeddd71a14c2148c
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//===-- PythonDataObjects.cpp ------------------------------------*- C++ -*-===//
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//                     The LLVM Compiler Infrastructure
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This file is distributed under the University of Illinois Open Source
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// License. See LICENSE.TXT for details.
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//===----------------------------------------------------------------------===//
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// In order to guarantee correct working with Python, Python.h *MUST* be
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// the *FIRST* header file included here.
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef LLDB_DISABLE_PYTHON
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Python is disabled in this build
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined (__APPLE__)
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <Python/Python.h>
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <Python.h>
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "lldb/Interpreter/PythonDataObjects.h"
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "lldb/Interpreter/ScriptInterpreter.h"
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovusing namespace lldb_private;
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovusing namespace lldb;
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PythonObject
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonObject::PythonObject (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_py_obj (NULL)
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (script_object_sp)
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Reset ((PyObject *)script_object_sp->GetObject());
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PythonString
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::PythonString (PyObject *py_obj) :
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(py_obj)
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::PythonString (const PythonObject &object) :
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(object.GetPythonObject())
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject (script_object_sp)
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::PythonString (const char* string) :
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(PyString_FromString(string))
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::PythonString () :
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject()
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::~PythonString ()
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::Reset (PyObject *py_obj)
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (py_obj && PyString_Check(py_obj))
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PythonObject::Reset(py_obj);
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject::Reset(NULL);
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return py_obj == NULL;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst char*
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::GetString() const
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PyString_AsString(m_py_obj);
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovsize_t
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::GetSize() const
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PyString_Size(m_py_obj);
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString::SetString (const char* string)
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject::Reset(PyString_FromString(string));
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PythonInteger
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::PythonInteger (PyObject *py_obj) :
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(py_obj)
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::PythonInteger (const PythonObject &object) :
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(object.GetPythonObject())
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject (script_object_sp)
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::PythonInteger (int64_t value) :
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(PyInt_FromLong(value))
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::~PythonInteger ()
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::Reset (PyObject *py_obj)
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (py_obj && PyInt_Check(py_obj))
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PythonObject::Reset(py_obj);
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject::Reset(NULL);
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return py_obj == NULL;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint64_t
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::GetInteger()
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PyInt_AsLong(m_py_obj);
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return UINT64_MAX;
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonInteger::SetInteger (int64_t value)
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject::Reset(PyInt_FromLong(value));
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PythonList
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::PythonList () :
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(PyList_New(0))
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::PythonList (uint32_t count) :
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(PyList_New(count))
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::PythonList (PyObject *py_obj) :
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(py_obj)
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::PythonList (const PythonObject &object) :
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(object.GetPythonObject())
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject (script_object_sp)
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::~PythonList ()
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::Reset (PyObject *py_obj)
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (py_obj && PyList_Check(py_obj))
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PythonObject::Reset(py_obj);
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject::Reset(NULL);
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return py_obj == NULL;
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovuint32_t
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::GetSize()
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PyList_GET_SIZE(m_py_obj);
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonObject
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::GetItemAtIndex (uint32_t index)
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PythonObject(PyList_GetItem(m_py_obj, index));
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::SetItemAtIndex (uint32_t index, const PythonObject & object)
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj && object)
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PyList_SetItem(m_py_obj, index, object.GetPythonObject());
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList::AppendItem (const PythonObject &object)
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj && object)
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PyList_Append(m_py_obj, object.GetPythonObject());
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PythonDictionary
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::PythonDictionary () :
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(PyDict_New())
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::PythonDictionary (PyObject *py_obj) :
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(py_obj)
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::PythonDictionary (const PythonObject &object) :
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject(object.GetPythonObject())
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject (script_object_sp)
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::~PythonDictionary ()
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::Reset (PyObject *py_obj)
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (py_obj && PyDict_Check(py_obj))
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PythonObject::Reset(py_obj);
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PythonObject::Reset(NULL);
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return py_obj == NULL;
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovuint32_t
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetSize()
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PyDict_Size(m_py_obj);
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonObject
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetItemForKey (const char *key) const
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (key && key[0])
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PythonString python_key(key);
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return GetItemForKey(python_key);
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonObject
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetItemForKey (const PythonString &key) const
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj && key)
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PythonObject(PyDict_GetItem(m_py_obj, key.GetPythonObject()));
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PythonObject();
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst char *
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetItemForKeyAsString (const PythonString &key, const char *fail_value) const
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj && key)
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject());
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (py_obj && PyString_Check(py_obj))
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PyString_AsString(py_obj);
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return fail_value;
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint64_t
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value) const
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj && key)
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject());
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (py_obj && PyInt_Check(py_obj))
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PyInt_AsLong(py_obj);
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return fail_value;
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonList
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetKeys () const
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PythonList(PyDict_Keys(m_py_obj));
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PythonList();
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonString
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetKeyAtPosition (uint32_t pos) const
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PyObject *key, *value;
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Py_ssize_t pos_iter = 0;
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj)
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (PyDict_Next(m_py_obj, &pos_iter, &key, &value))
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pos-- == 0)
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return PythonString(key);
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PythonString();
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonObject
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::GetValueAtPosition (uint32_t pos) const
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PyObject *key, *value;
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Py_ssize_t pos_iter = 0;
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_py_obj)
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (PyDict_Next(m_py_obj, &pos_iter, &key, &value)) {
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pos-- == 0)
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PythonObject(value);
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PythonObject();
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPythonDictionary::SetItemForKey (const PythonString &key, const PythonObject &value)
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_py_obj && key && value)
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PyDict_SetItem(m_py_obj, key.GetPythonObject(), value.GetPythonObject());
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov