PythonDataObjects.cpp revision 9565e9dde3e33483f127815b10d6e9d5b8f46049
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
189565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton#include <stdio.h>
199565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton
20c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#if defined (__APPLE__)
21c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#include <Python/Python.h>
22c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#else
23c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#include <Python.h>
24c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#endif
25e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton#include "lldb/Core/Stream.h"
26e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton#include "lldb/Host/File.h"
27b2e953d1d753bc725ea78f573c150493b99e2205Filipe Cabecinhas#include "lldb/Interpreter/PythonDataObjects.h"
2852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton#include "lldb/Interpreter/ScriptInterpreter.h"
29c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
30c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatausing namespace lldb_private;
31c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatausing namespace lldb;
32c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
3352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
3452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonObject
3552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
3652ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject::PythonObject (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
3752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    m_py_obj (NULL)
38c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
3952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (script_object_sp)
4052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        Reset ((PyObject *)script_object_sp->GetObject());
41c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
42c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
43e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Claytonvoid
44e15e58facd4814a2be1cc1aa385e9f9125b92993Greg ClaytonPythonObject::Dump (Stream &strm) const
45e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton{
46e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    if (m_py_obj)
47e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    {
489565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton        FILE *file = ::tmpfile();
49e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        if (file)
50e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        {
519565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton            ::PyObject_Print (m_py_obj, file, 0);
52e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            const long length = ftell (file);
53e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            if (length)
54e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            {
559565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton                ::rewind(file);
56e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton                std::vector<char> file_contents (length,'\0');
579565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton                const size_t length_read = ::fread (file_contents.data(), 1, file_contents.size(), file);
58e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton                if (length_read > 0)
599565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton                    strm.Write (file_contents.data(), length_read);
60e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            }
619565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton            ::fclose (file);
62e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        }
63e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    }
64e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    else
65e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        strm.PutCString ("NULL");
66e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton}
67e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton
6852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
6952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonString
7052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
7152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
7252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (PyObject *py_obj) :
7352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
7412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
7512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
7612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
7752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (const PythonObject &object) :
7852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
7912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
8012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
8112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
8252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
8352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
84c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
85c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
8652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
8752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (const char* string) :
8852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyString_FromString(string))
8952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
9052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
9152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
9252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString () :
9352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject()
94c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
95c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
96c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
9752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::~PythonString ()
98c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
99c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
100c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
10152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
10252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::Reset (PyObject *py_obj)
103c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
10452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyString_Check(py_obj))
10552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
10652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
10752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
10852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
10912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
11012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
11152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonconst char*
11252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::GetString() const
11312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
11452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
11552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyString_AsString(m_py_obj);
11652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return NULL;
117c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
118c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
11952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonsize_t
12052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::GetSize() const
121c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
12252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
12352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyString_Size(m_py_obj);
12452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return 0;
125c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
126c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
12752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonvoid
12852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::SetString (const char* string)
129c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
13052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(PyString_FromString(string));
131c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
132c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
13352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
13452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonInteger
13552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
13612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
13752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (PyObject *py_obj) :
13852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
139c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
140c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
141c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
14252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (const PythonObject &object) :
14352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
144c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
145c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
146c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
14752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
14852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
149c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
150c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
151c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
15252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (int64_t value) :
15352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyInt_FromLong(value))
15412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
15512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
15612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
15752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
15852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::~PythonInteger ()
159c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
16012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
161c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
16252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
16352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::Reset (PyObject *py_obj)
164c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
16552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyInt_Check(py_obj))
16652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
16752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
16852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
16952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
170c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
171c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
17252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonint64_t
17352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::GetInteger()
174c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
17552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
17652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyInt_AsLong(m_py_obj);
17752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    else
17852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return UINT64_MAX;
179c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
180c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
18152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonvoid
18252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::SetInteger (int64_t value)
183c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
18452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(PyInt_FromLong(value));
185c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
186c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
18752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
18852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonList
18952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
19052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
19152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList () :
19252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyList_New(0))
193b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton{
194b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton}
195b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton
19652ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (uint32_t count) :
19752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyList_New(count))
198c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
199c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
200c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
20152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (PyObject *py_obj) :
20252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
203c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
204c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
205c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
20652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
20752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (const PythonObject &object) :
20852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
209c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
21012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
21112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
21252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
21352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
21412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
215c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
216c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
21752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::~PythonList ()
218c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
219c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
220c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
22152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
22252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::Reset (PyObject *py_obj)
22352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
22452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyList_Check(py_obj))
22552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
22652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
22752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
22852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
22952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
23052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
231c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatauint32_t
23252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::GetSize()
233c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
23452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
23552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyList_GET_SIZE(m_py_obj);
236c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return 0;
237c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
238c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
23952ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
24052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::GetItemAtIndex (uint32_t index)
241c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
24252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
24352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject(PyList_GetItem(m_py_obj, index));
244c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return NULL;
245c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
246c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
247c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
24852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::SetItemAtIndex (uint32_t index, const PythonObject & object)
249c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
25052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && object)
25152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyList_SetItem(m_py_obj, index, object.GetPythonObject());
252c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
253c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
254c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
25552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::AppendItem (const PythonObject &object)
25652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
25752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && object)
25852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyList_Append(m_py_obj, object.GetPythonObject());
25952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
26052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
26152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
26252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonDictionary
26352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
26452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
26552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary () :
26652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyDict_New())
267c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
268c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
269c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
27052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary (PyObject *py_obj) :
27152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
272c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
273c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
274c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
27552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
27652ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary (const PythonObject &object) :
27752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
278c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
279c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
280c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
28152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
28252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
283c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
284c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
285c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
28652ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::~PythonDictionary ()
28752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
28852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
28952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
29052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
29152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::Reset (PyObject *py_obj)
29252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
29352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyDict_Check(py_obj))
29452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
29552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
29652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
29752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
29852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
29952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
300c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatauint32_t
30152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetSize()
302c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
30352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
30452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyDict_Size(m_py_obj);
305c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return 0;
306c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
307c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
30852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
30952ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKey (const char *key) const
310c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
31112477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (key && key[0])
31212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    {
31352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PythonString python_key(key);
31412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        return GetItemForKey(python_key);
31512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    }
316c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return NULL;
317c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
318c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
31912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
32052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
32152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKey (const PythonString &key) const
32212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
32352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key)
32452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject(PyDict_GetItem(m_py_obj, key.GetPythonObject()));
32552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonObject();
32612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
32712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
32888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
32988b980bfd735c4691b7f0771a45a78cb75033564Greg Claytonconst char *
33052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKeyAsString (const PythonString &key, const char *fail_value) const
33188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton{
33252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key)
33388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    {
33452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject());
33552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        if (py_obj && PyString_Check(py_obj))
33652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton            return PyString_AsString(py_obj);
33788b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    }
33888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    return fail_value;
33988b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton}
34088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
34188b980bfd735c4691b7f0771a45a78cb75033564Greg Claytonint64_t
34252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value) const
34388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton{
34452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key)
34588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    {
34652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject());
34736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        if (py_obj)
34836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        {
34936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            if (PyInt_Check(py_obj))
35036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                return PyInt_AsLong(py_obj);
35136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton
35236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            if (PyLong_Check(py_obj))
35336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                return PyLong_AsLong(py_obj);
35436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        }
35588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    }
35688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    return fail_value;
35788b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton}
35888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
35952ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList
36052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetKeys () const
361c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
36252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
36352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonList(PyDict_Keys(m_py_obj));
36452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonList();
365c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
366c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
36752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString
36852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetKeyAtPosition (uint32_t pos) const
369c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
370c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    PyObject *key, *value;
371c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    Py_ssize_t pos_iter = 0;
372c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
37352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
37412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    {
37552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        while (PyDict_Next(m_py_obj, &pos_iter, &key, &value))
37612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        {
37712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton            if (pos-- == 0)
37852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton                return PythonString(key);
37912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        }
380c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    }
38152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonString();
382c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
383c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
38452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
38552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetValueAtPosition (uint32_t pos) const
386c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
387c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    PyObject *key, *value;
388c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    Py_ssize_t pos_iter = 0;
389c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
39052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (!m_py_obj)
391c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return NULL;
392c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
39352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    while (PyDict_Next(m_py_obj, &pos_iter, &key, &value)) {
394c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        if (pos-- == 0)
39552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton            return PythonObject(value);
396c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    }
39752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonObject();
398c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
399c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
400c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
40152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::SetItemForKey (const PythonString &key, const PythonObject &value)
402c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
40352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key && value)
40452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyDict_SetItem(m_py_obj, key.GetPythonObject(), value.GetPythonObject());
405c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
406c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
407c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#endif
408