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