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
23884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec
24884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec#include <stdio.h>
25884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec
26e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton#include "lldb/Core/Stream.h"
27e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton#include "lldb/Host/File.h"
28b2e953d1d753bc725ea78f573c150493b99e2205Filipe Cabecinhas#include "lldb/Interpreter/PythonDataObjects.h"
2952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton#include "lldb/Interpreter/ScriptInterpreter.h"
30c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
31c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatausing namespace lldb_private;
32c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatausing namespace lldb;
33c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
3452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
3552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonObject
3652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
3752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject::PythonObject (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
3852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    m_py_obj (NULL)
39c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
4052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (script_object_sp)
4152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        Reset ((PyObject *)script_object_sp->GetObject());
42c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
43c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
44e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Claytonvoid
45e15e58facd4814a2be1cc1aa385e9f9125b92993Greg ClaytonPythonObject::Dump (Stream &strm) const
46e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton{
47e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    if (m_py_obj)
48e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    {
499565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton        FILE *file = ::tmpfile();
50e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        if (file)
51e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        {
529565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton            ::PyObject_Print (m_py_obj, file, 0);
53e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            const long length = ftell (file);
54e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            if (length)
55e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            {
569565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton                ::rewind(file);
57e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton                std::vector<char> file_contents (length,'\0');
589565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton                const size_t length_read = ::fread (file_contents.data(), 1, file_contents.size(), file);
59e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton                if (length_read > 0)
609565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton                    strm.Write (file_contents.data(), length_read);
61e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton            }
629565e9dde3e33483f127815b10d6e9d5b8f46049Greg Clayton            ::fclose (file);
63e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        }
64e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    }
65e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton    else
66e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton        strm.PutCString ("NULL");
67e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton}
68e15e58facd4814a2be1cc1aa385e9f9125b92993Greg Clayton
6995eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico GranataPythonString
7095eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico GranataPythonObject::Repr ()
7195eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata{
7295eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    if (!m_py_obj)
7395eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata        return PythonString ();
7495eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    PyObject *repr = PyObject_Repr(m_py_obj);
7595eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    if (!repr)
7695eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata        return PythonString ();
7795eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    return PythonString(repr);
7895eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata}
7995eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata
8095eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico GranataPythonString
8195eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico GranataPythonObject::Str ()
8295eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata{
8395eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    if (!m_py_obj)
8495eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata        return PythonString ();
8595eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    PyObject *str = PyObject_Str(m_py_obj);
8695eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    if (!str)
8795eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata        return PythonString ();
8895eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata    return PythonString(str);
8995eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata}
9095eeb63432ac232f81cf9ee3301abddd7ce2f817Enrico Granata
9152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
9252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonString
9352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
9452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
9552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (PyObject *py_obj) :
9652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
9712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
9812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
9912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
10052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (const PythonObject &object) :
10152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
10212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
10312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
10412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
10552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
10652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
107c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
108c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
10952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
11052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString (const char* string) :
11152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyString_FromString(string))
11252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
11352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
11452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
11552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::PythonString () :
11652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject()
117c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
118c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
119c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
12052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::~PythonString ()
121c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
122c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
123c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
12452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
12552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::Reset (PyObject *py_obj)
126c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
12752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyString_Check(py_obj))
12852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
12952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
13052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
13152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
13212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
13312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
13452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonconst char*
13552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::GetString() const
13612477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
13752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
13852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyString_AsString(m_py_obj);
13952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return NULL;
140c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
141c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
14252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonsize_t
14352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::GetSize() const
144c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
14552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
14652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyString_Size(m_py_obj);
14752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return 0;
148c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
149c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
15052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonvoid
15152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString::SetString (const char* string)
152c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
15352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(PyString_FromString(string));
154c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
155c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
15652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
15752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonInteger
15852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
15912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
16052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (PyObject *py_obj) :
16152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
162c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
163c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
164c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
16552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (const PythonObject &object) :
16652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
167c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
168c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
169c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
17052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
17152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
172c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
173c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
174c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
17552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::PythonInteger (int64_t value) :
17652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyInt_FromLong(value))
17712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
17812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
17912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
18052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
18152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::~PythonInteger ()
182c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
18312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
184c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
18552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
18652ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::Reset (PyObject *py_obj)
187c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
18852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyInt_Check(py_obj))
18952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
19052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
19152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
19252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
193c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
194c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
19552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonint64_t
19652ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::GetInteger()
197c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
19852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
19952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyInt_AsLong(m_py_obj);
20052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    else
20152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return UINT64_MAX;
202c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
203c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
20452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonvoid
20552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonInteger::SetInteger (int64_t value)
206c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
20752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(PyInt_FromLong(value));
208c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
209c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
21052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
21152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonList
21252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
21352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
21452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList () :
21552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyList_New(0))
216b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton{
217b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton}
218b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton
21952ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (uint32_t count) :
22052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyList_New(count))
221c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
222c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
223c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
22452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (PyObject *py_obj) :
22552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
226c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
227c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
228c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
22952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
23052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (const PythonObject &object) :
23152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
232c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
23312477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
23412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
23552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
23652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
23712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
238c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
239c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
24052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::~PythonList ()
241c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
242c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
243c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
24452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
24552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::Reset (PyObject *py_obj)
24652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
24752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyList_Check(py_obj))
24852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
24952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
25052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
25152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
25252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
25352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
254c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatauint32_t
25552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::GetSize()
256c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
25752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
25852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyList_GET_SIZE(m_py_obj);
259c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return 0;
260c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
261c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
26252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
26352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::GetItemAtIndex (uint32_t index)
264c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
26552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
26652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject(PyList_GetItem(m_py_obj, index));
267c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return NULL;
268c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
269c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
270c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
27152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::SetItemAtIndex (uint32_t index, const PythonObject & object)
272c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
27352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && object)
27452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyList_SetItem(m_py_obj, index, object.GetPythonObject());
275c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
276c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
277c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
27852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList::AppendItem (const PythonObject &object)
27952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
28052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && object)
28152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyList_Append(m_py_obj, object.GetPythonObject());
28252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
28352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
28452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
28552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton// PythonDictionary
28652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton//----------------------------------------------------------------------
28752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
28852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary () :
28952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(PyDict_New())
290c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
291c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
292c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
29352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary (PyObject *py_obj) :
29452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(py_obj)
295c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
296c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
297c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
29852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
29952ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary (const PythonObject &object) :
30052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject(object.GetPythonObject())
301c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
302c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
303c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
30452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp) :
30552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject (script_object_sp)
306c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
307c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
308c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
30952ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::~PythonDictionary ()
31052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
31152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
31252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
31352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Claytonbool
31452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::Reset (PyObject *py_obj)
31552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
31652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (py_obj && PyDict_Check(py_obj))
31752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject::Reset(py_obj);
31852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
31952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    PythonObject::Reset(NULL);
32052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return py_obj == NULL;
32152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
32252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
323c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatauint32_t
32452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetSize()
325c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
32652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
32752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PyDict_Size(m_py_obj);
328c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return 0;
329c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
330c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
33152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
33252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKey (const char *key) const
333c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
33412477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    if (key && key[0])
33512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    {
33652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PythonString python_key(key);
33712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        return GetItemForKey(python_key);
33812477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    }
339c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    return NULL;
340c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
341c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
34212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
34352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
34452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKey (const PythonString &key) const
34512477554ee676b775ec419575e1b091fa95bdc80Greg Clayton{
34652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key)
34752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonObject(PyDict_GetItem(m_py_obj, key.GetPythonObject()));
34852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonObject();
34912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton}
35012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton
35188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
35288b980bfd735c4691b7f0771a45a78cb75033564Greg Claytonconst char *
35352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKeyAsString (const PythonString &key, const char *fail_value) const
35488b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton{
35552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key)
35688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    {
35752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject());
35852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        if (py_obj && PyString_Check(py_obj))
35952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton            return PyString_AsString(py_obj);
36088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    }
36188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    return fail_value;
36288b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton}
36388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
36488b980bfd735c4691b7f0771a45a78cb75033564Greg Claytonint64_t
36552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value) const
36688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton{
36752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key)
36888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    {
36952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject());
37036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        if (py_obj)
37136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        {
37236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            if (PyInt_Check(py_obj))
37336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                return PyInt_AsLong(py_obj);
37436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton
37536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            if (PyLong_Check(py_obj))
37636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                return PyLong_AsLong(py_obj);
37736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        }
37888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    }
37988b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    return fail_value;
38088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton}
38188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
38252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonList
38352ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetKeys () const
384c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
38552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
38652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        return PythonList(PyDict_Keys(m_py_obj));
38752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonList();
388c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
389c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
39052ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonString
39152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetKeyAtPosition (uint32_t pos) const
392c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
393c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    PyObject *key, *value;
394c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    Py_ssize_t pos_iter = 0;
395c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
39652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj)
39712477554ee676b775ec419575e1b091fa95bdc80Greg Clayton    {
39852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        while (PyDict_Next(m_py_obj, &pos_iter, &key, &value))
39912477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        {
40012477554ee676b775ec419575e1b091fa95bdc80Greg Clayton            if (pos-- == 0)
40152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton                return PythonString(key);
40212477554ee676b775ec419575e1b091fa95bdc80Greg Clayton        }
403c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    }
40452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonString();
405c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
406c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
40752ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonObject
40852ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::GetValueAtPosition (uint32_t pos) const
409c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
410c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    PyObject *key, *value;
411c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    Py_ssize_t pos_iter = 0;
412c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
41352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (!m_py_obj)
414c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        return NULL;
415c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
41652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    while (PyDict_Next(m_py_obj, &pos_iter, &key, &value)) {
417c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata        if (pos-- == 0)
41852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton            return PythonObject(value);
419c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata    }
42052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return PythonObject();
421c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
422c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
423c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granatavoid
42452ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonPythonDictionary::SetItemForKey (const PythonString &key, const PythonObject &value)
425c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata{
42652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (m_py_obj && key && value)
42752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        PyDict_SetItem(m_py_obj, key.GetPythonObject(), value.GetPythonObject());
428c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata}
429c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata
430c66662664c44f34f891f39e4e416f766c7347f3cEnrico Granata#endif
431