Home | History | Annotate | Download | only in Interpreter
      1 //===-- PythonDataObjects.h----------------------------------------*- 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 #ifndef liblldb_PythonDataObjects_h_
     11 #define liblldb_PythonDataObjects_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 
     16 // Other libraries and framework includes
     17 // Project includes
     18 #include "lldb/lldb-defines.h"
     19 #include "lldb/Core/ConstString.h"
     20 #include "lldb/Core/Flags.h"
     21 #include "lldb/Interpreter/OptionValue.h"
     22 #if defined (__APPLE__)
     23 #include <Python/Python.h>
     24 #else
     25 #include <Python.h>
     26 #endif
     27 
     28 namespace lldb_private {
     29 
     30     class PythonObject
     31     {
     32     public:
     33         PythonObject () :
     34             m_py_obj(NULL)
     35         {
     36         }
     37 
     38         PythonObject (PyObject* py_obj) :
     39             m_py_obj(NULL)
     40         {
     41             Reset (py_obj);
     42         }
     43 
     44         PythonObject (const PythonObject &rhs) :
     45             m_py_obj(NULL)
     46         {
     47             Reset (rhs.m_py_obj);
     48         }
     49 
     50         PythonObject (const lldb::ScriptInterpreterObjectSP &script_object_sp);
     51 
     52         virtual
     53         ~PythonObject ()
     54         {
     55             Reset (NULL);
     56         }
     57 
     58         const PythonObject &
     59         operator = (const PythonObject &rhs)
     60         {
     61             if (this != &rhs)
     62                 Reset (rhs.m_py_obj);
     63             return *this;
     64         }
     65 
     66         bool
     67         Reset (const PythonObject &object)
     68         {
     69             return Reset(object.GetPythonObject());
     70         }
     71 
     72         virtual bool
     73         Reset (PyObject* py_obj = NULL)
     74         {
     75             if (py_obj != m_py_obj)
     76             {
     77                 Py_XDECREF(m_py_obj);
     78                 m_py_obj = py_obj;
     79                 Py_XINCREF(m_py_obj);
     80             }
     81             return true;
     82         }
     83 
     84         void
     85         Dump () const
     86         {
     87             if (m_py_obj)
     88                 _PyObject_Dump (m_py_obj);
     89             else
     90                 puts ("NULL");
     91         }
     92 
     93         void
     94         Dump (Stream &strm) const;
     95 
     96         PyObject*
     97         GetPythonObject () const
     98         {
     99             return m_py_obj;
    100         }
    101 
    102         PythonString
    103         Repr ();
    104 
    105         PythonString
    106         Str ();
    107 
    108         operator bool () const
    109         {
    110             return m_py_obj != NULL;
    111         }
    112 
    113     protected:
    114         PyObject* m_py_obj;
    115     };
    116 
    117     class PythonString: public PythonObject
    118     {
    119     public:
    120 
    121         PythonString ();
    122         PythonString (PyObject *o);
    123         PythonString (const PythonObject &object);
    124         PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp);
    125         PythonString (const char* string);
    126         virtual ~PythonString ();
    127 
    128         virtual bool
    129         Reset (PyObject* py_obj = NULL);
    130 
    131         const char*
    132         GetString() const;
    133 
    134         size_t
    135         GetSize() const;
    136 
    137         void
    138         SetString (const char* string);
    139     };
    140 
    141     class PythonInteger: public PythonObject
    142     {
    143     public:
    144 
    145         PythonInteger ();
    146         PythonInteger (PyObject* py_obj);
    147         PythonInteger (const PythonObject &object);
    148         PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp);
    149         PythonInteger (int64_t value);
    150         virtual ~PythonInteger ();
    151 
    152         virtual bool
    153         Reset (PyObject* py_obj = NULL);
    154 
    155         int64_t
    156         GetInteger();
    157 
    158         void
    159         SetInteger (int64_t value);
    160     };
    161 
    162     class PythonList: public PythonObject
    163     {
    164     public:
    165 
    166         PythonList ();
    167         PythonList (PyObject* py_obj);
    168         PythonList (const PythonObject &object);
    169         PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp);
    170         PythonList (uint32_t count);
    171         virtual ~PythonList ();
    172 
    173         virtual bool
    174         Reset (PyObject* py_obj = NULL);
    175 
    176         uint32_t
    177         GetSize();
    178 
    179         PythonObject
    180         GetItemAtIndex (uint32_t index);
    181 
    182         void
    183         SetItemAtIndex (uint32_t index, const PythonObject &object);
    184 
    185         void
    186         AppendItem (const PythonObject &object);
    187     };
    188 
    189     class PythonDictionary: public PythonObject
    190     {
    191     public:
    192 
    193         PythonDictionary ();
    194         PythonDictionary (PyObject* object);
    195         PythonDictionary (const PythonObject &object);
    196         PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp);
    197         virtual ~PythonDictionary ();
    198 
    199         virtual bool
    200         Reset (PyObject* object = NULL);
    201 
    202         uint32_t GetSize();
    203 
    204         PythonObject
    205         GetItemForKey (const PythonString &key) const;
    206 
    207         const char *
    208         GetItemForKeyAsString (const PythonString &key, const char *fail_value = NULL) const;
    209 
    210         int64_t
    211         GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value = 0) const;
    212 
    213         PythonObject
    214         GetItemForKey (const char *key) const;
    215 
    216         typedef bool (*DictionaryIteratorCallback)(PythonString* key, PythonDictionary* dict);
    217 
    218         PythonList
    219         GetKeys () const;
    220 
    221         PythonString
    222         GetKeyAtPosition (uint32_t pos) const;
    223 
    224         PythonObject
    225         GetValueAtPosition (uint32_t pos) const;
    226 
    227         void
    228         SetItemForKey (const PythonString &key, const PythonObject& value);
    229     };
    230 
    231 } // namespace lldb_private
    232 
    233 #endif  // liblldb_PythonDataObjects_h_
    234