PythonDataObjects.cpp revision b2e953d1d753bc725ea78f573c150493b99e2205
1c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata//===-- PythonDataObjects.cpp ------------------------------------*- C++ -*-===//
2c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata//
3c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata//                     The LLVM Compiler Infrastructure
4c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata//
5c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata// This file is distributed under the University of Illinois Open Source
6c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata// License. See LICENSE.TXT for details.
7c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata//
8c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata//===----------------------------------------------------------------------===//
9c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
10c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata// In order to guarantee correct working with Python, Python.h *MUST* be
11c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata// the *FIRST* header file included here.
12c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#ifdef LLDB_DISABLE_PYTHON
13c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
14c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata// Python is disabled in this build
15c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
16c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#else
17c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
18c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#if defined (__APPLE__)
19c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#include <Python/Python.h>
20c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#else
21c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#include <Python.h>
22c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#endif
23c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
24b2e953d1d753bc725ea78f573c150493b99e2205Filipe Cabecinhas#include "lldb/Interpreter/PythonDataObjects.h"
25c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
26c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatausing namespace lldb_private;
27c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatausing namespace lldb;
28c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
2912477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataObject::PythonDataObject (PyObject* object) :
3012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(object)
31c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
32c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
33c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
3412477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataObject::PythonDataObject () :
3512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object()
3612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
3712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
3812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
3912477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataObject::~PythonDataObject ()
4012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
4112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
4212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
4312477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataString
44c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataObject::GetStringObject ()
45c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
4612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataString(GetPythonObject());
47c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
48c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
4912477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataInteger
50c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataObject::GetIntegerObject ()
51c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
5212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataInteger(GetPythonObject());
53c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
54c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
5512477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataArray
56c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataObject::GetArrayObject()
57c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
5812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataArray(GetPythonObject());
59c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
60c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
6112477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataDictionary
62c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataObject::GetDictionaryObject()
63c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
6412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataDictionary(GetPythonObject());
6512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
6612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
6712477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataInteger::PythonDataInteger (bool create_empty) :
6812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(create_empty ? PyInt_FromLong(0) : NULL)
6912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
70c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
71c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
7212477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataInteger::PythonDataInteger (PyObject* object) :
7312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(object)
74c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
7512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (object && !PyInt_Check(GetPythonObject()))
76c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        m_object.Reset();
77c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
78c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
7912477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataInteger::PythonDataInteger (int64_t value) :
8012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(PyInt_FromLong(value))
81c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
82c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
83c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
8412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
8512477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataInteger::~PythonDataInteger ()
86c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
87c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
88c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
89c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granataint64_t
90c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataInteger::GetInteger()
91c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
92c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    if (m_object)
93c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return PyInt_AsLong(GetPythonObject());
94c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    else
95c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return UINT64_MAX;
96c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
97c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
98c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
99c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataInteger::SetInteger (int64_t value)
100c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
101c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    m_object.Reset(PyInt_FromLong(value));
102c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
103c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
10412477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataString::PythonDataString (bool create_empty) :
10512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(create_empty ? PyString_FromString("") : NULL)
10612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
10712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
10812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
10912477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataString::PythonDataString (PyObject* object) :
11012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(object)
111c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
11212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (object && !PyString_Check(GetPythonObject()))
11312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        m_object.Reset();
11412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
115c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
11612477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataString::PythonDataString (const char* string) :
11712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(PyString_FromString(string))
118c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
119c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
120c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
121c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataString::~PythonDataString ()
122c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
123c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
124c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
125c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granataconst char*
126b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg ClaytonPythonDataString::GetString() const
127c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
128c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    if (m_object)
129c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return PyString_AsString(GetPythonObject());
130c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return NULL;
131c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
132c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
133b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Claytonsize_t
134b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg ClaytonPythonDataString::GetSize() const
135b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton{
136b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    if (m_object)
137b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        return PyString_Size(GetPythonObject());
138b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    return 0;
139b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton}
140b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton
141c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
142c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataString::SetString (const char* string)
143c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
144c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    m_object.Reset(PyString_FromString(string));
145c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
146c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
14712477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataArray::PythonDataArray (bool create_empty) :
14812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(create_empty ? PyList_New(0) : NULL)
149c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
150c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
151c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
15212477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataArray::PythonDataArray (uint32_t count) :
15312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(PyList_New(count))
154c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
15512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
15612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
15712477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataArray::PythonDataArray (PyObject* object) :
15812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(object)
15912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
16012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (object && !PyList_Check(GetPythonObject()))
161c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        m_object.Reset();
162c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
163c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
164c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataArray::~PythonDataArray ()
165c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
166c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
167c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
168c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatauint32_t
169c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataArray::GetSize()
170c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
171c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    if (m_object)
172c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return PyList_GET_SIZE(GetPythonObject());
173c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return 0;
174c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
175c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
17612477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataObject
177c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataArray::GetItemAtIndex (uint32_t index)
178c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
179c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    if (m_object)
18012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        return PythonDataObject(PyList_GetItem(GetPythonObject(), index));
181c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return NULL;
182c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
183c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
184c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
18512477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object)
186c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
18712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (m_object && object)
18812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        PyList_SetItem(GetPythonObject(), index, object.GetPythonObject());
189c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
190c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
191c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
19212477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataArray::AppendItem (const PythonDataObject &object)
193c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
19412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (m_object && object)
19512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        PyList_Append(GetPythonObject(), object.GetPythonObject());
196c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
197c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
19812477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataDictionary::PythonDataDictionary (bool create_empty) :
19912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(create_empty ? PyDict_New() : NULL)
200c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
201c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
202c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
20312477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataDictionary::PythonDataDictionary (PyObject* object) :
20412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    m_object(object)
205c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
20612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (object && !PyDict_Check(GetPythonObject()))
207c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        m_object.Reset();
208c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
209c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
210c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataDictionary::~PythonDataDictionary ()
211c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
212c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
213c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
214c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatauint32_t
215c66662664c44f34f891f39e4e416f766c7347f3cEnrico GranataPythonDataDictionary::GetSize()
216c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
217c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    if (m_object)
218c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return PyDict_Size(GetPythonObject());
219c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return 0;
220c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
221c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
22212477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataObject
22388b980bfd735c4691b7f0771a45a78cb75033564Greg ClaytonPythonDataDictionary::GetItemForKey (const char *key) const
224c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
22512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (key && key[0])
22612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    {
22712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        PythonDataString python_key(key);
22812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        return GetItemForKey(python_key);
22912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    }
230c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return NULL;
231c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
232c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
23312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
23412477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataObject
23588b980bfd735c4691b7f0771a45a78cb75033564Greg ClaytonPythonDataDictionary::GetItemForKey (const PythonDataString &key) const
23612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
23712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (m_object && key)
23812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject()));
23912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataObject();
24012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
24112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
24288b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
24388b980bfd735c4691b7f0771a45a78cb75033564Greg Claytonconst char *
24488b980bfd735c4691b7f0771a45a78cb75033564Greg ClaytonPythonDataDictionary::GetItemForKeyAsString (const PythonDataString &key, const char *fail_value) const
24588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton{
24688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    if (m_object && key)
24788b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    {
24888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject());
24988b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        if (object && PyString_Check(object))
25088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton            return PyString_AsString(object);
25188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    }
25288b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    return fail_value;
25388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton}
25488b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
25588b980bfd735c4691b7f0771a45a78cb75033564Greg Claytonint64_t
25688b980bfd735c4691b7f0771a45a78cb75033564Greg ClaytonPythonDataDictionary::GetItemForKeyAsInteger (const PythonDataString &key, int64_t fail_value) const
25788b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton{
25888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    if (m_object && key)
25988b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    {
26088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject());
26188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        if (object && PyInt_Check(object))
26288b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton            return PyInt_AsLong(object);
26388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    }
26488b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    return fail_value;
26588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton}
26688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
26712477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataArray
26888b980bfd735c4691b7f0771a45a78cb75033564Greg ClaytonPythonDataDictionary::GetKeys () const
269c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
270c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    if (m_object)
27112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        return PythonDataArray(PyDict_Keys(GetPythonObject()));
27212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataArray();
273c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
274c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
27512477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataString
27688b980bfd735c4691b7f0771a45a78cb75033564Greg ClaytonPythonDataDictionary::GetKeyAtPosition (uint32_t pos) const
277c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
278c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    PyObject *key, *value;
279c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    Py_ssize_t pos_iter = 0;
280c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
28112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (m_object)
28212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    {
28312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value))
28412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        {
28512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton            if (pos-- == 0)
28612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton                return PythonDataString(key);
28712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        }
288c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    }
28912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataString();
290c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
291c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
29212477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataObject
29388b980bfd735c4691b7f0771a45a78cb75033564Greg ClaytonPythonDataDictionary::GetValueAtPosition (uint32_t pos) const
294c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
295c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    PyObject *key, *value;
296c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    Py_ssize_t pos_iter = 0;
297c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
298c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    if (!m_object)
299c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return NULL;
300c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
301c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) {
302c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        if (pos-- == 0)
30312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton            return PythonDataObject(value);
304c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    }
30512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    return PythonDataObject();
306c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
307c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
308c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
30912477554ee676b775ec419575e1b091fa95bdc80Greg ClaytonPythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value)
310c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
31112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (m_object && key && value)
31212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject());
313c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
314c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
315c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#endif
316