1*2c1f46dcSZachary Turner //===-- PythonDataObjects.h----------------------------------------*- C++ -*-===// 2*2c1f46dcSZachary Turner // 3*2c1f46dcSZachary Turner // The LLVM Compiler Infrastructure 4*2c1f46dcSZachary Turner // 5*2c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source 6*2c1f46dcSZachary Turner // License. See LICENSE.TXT for details. 7*2c1f46dcSZachary Turner // 8*2c1f46dcSZachary Turner //===----------------------------------------------------------------------===// 9*2c1f46dcSZachary Turner 10*2c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 11*2c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 12*2c1f46dcSZachary Turner 13*2c1f46dcSZachary Turner // C Includes 14*2c1f46dcSZachary Turner // C++ Includes 15*2c1f46dcSZachary Turner 16*2c1f46dcSZachary Turner // Other libraries and framework includes 17*2c1f46dcSZachary Turner // Project includes 18*2c1f46dcSZachary Turner #include "lldb/lldb-defines.h" 19*2c1f46dcSZachary Turner #include "lldb/Core/ConstString.h" 20*2c1f46dcSZachary Turner #include "lldb/Core/StructuredData.h" 21*2c1f46dcSZachary Turner #include "lldb/Core/Flags.h" 22*2c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h" 23*2c1f46dcSZachary Turner 24*2c1f46dcSZachary Turner namespace lldb_private { 25*2c1f46dcSZachary Turner class PythonString; 26*2c1f46dcSZachary Turner class PythonList; 27*2c1f46dcSZachary Turner class PythonDictionary; 28*2c1f46dcSZachary Turner class PythonObject; 29*2c1f46dcSZachary Turner class PythonInteger; 30*2c1f46dcSZachary Turner 31*2c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic 32*2c1f46dcSZachary Turner { 33*2c1f46dcSZachary Turner public: 34*2c1f46dcSZachary Turner StructuredPythonObject() 35*2c1f46dcSZachary Turner : StructuredData::Generic() 36*2c1f46dcSZachary Turner { 37*2c1f46dcSZachary Turner } 38*2c1f46dcSZachary Turner 39*2c1f46dcSZachary Turner StructuredPythonObject(void *obj) 40*2c1f46dcSZachary Turner : StructuredData::Generic(obj) 41*2c1f46dcSZachary Turner { 42*2c1f46dcSZachary Turner Py_XINCREF(GetValue()); 43*2c1f46dcSZachary Turner } 44*2c1f46dcSZachary Turner 45*2c1f46dcSZachary Turner virtual ~StructuredPythonObject() 46*2c1f46dcSZachary Turner { 47*2c1f46dcSZachary Turner if (Py_IsInitialized()) 48*2c1f46dcSZachary Turner Py_XDECREF(GetValue()); 49*2c1f46dcSZachary Turner SetValue(nullptr); 50*2c1f46dcSZachary Turner } 51*2c1f46dcSZachary Turner 52*2c1f46dcSZachary Turner bool 53*2c1f46dcSZachary Turner IsValid() const override 54*2c1f46dcSZachary Turner { 55*2c1f46dcSZachary Turner return GetValue() && GetValue() != Py_None; 56*2c1f46dcSZachary Turner } 57*2c1f46dcSZachary Turner 58*2c1f46dcSZachary Turner void Dump(Stream &s) const override; 59*2c1f46dcSZachary Turner 60*2c1f46dcSZachary Turner private: 61*2c1f46dcSZachary Turner DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject); 62*2c1f46dcSZachary Turner }; 63*2c1f46dcSZachary Turner 64*2c1f46dcSZachary Turner enum class PyObjectType 65*2c1f46dcSZachary Turner { 66*2c1f46dcSZachary Turner Unknown, 67*2c1f46dcSZachary Turner None, 68*2c1f46dcSZachary Turner Integer, 69*2c1f46dcSZachary Turner Dictionary, 70*2c1f46dcSZachary Turner List, 71*2c1f46dcSZachary Turner String 72*2c1f46dcSZachary Turner }; 73*2c1f46dcSZachary Turner 74*2c1f46dcSZachary Turner class PythonObject 75*2c1f46dcSZachary Turner { 76*2c1f46dcSZachary Turner public: 77*2c1f46dcSZachary Turner PythonObject () : 78*2c1f46dcSZachary Turner m_py_obj(NULL) 79*2c1f46dcSZachary Turner { 80*2c1f46dcSZachary Turner } 81*2c1f46dcSZachary Turner 82*2c1f46dcSZachary Turner explicit PythonObject (PyObject* py_obj) : 83*2c1f46dcSZachary Turner m_py_obj(NULL) 84*2c1f46dcSZachary Turner { 85*2c1f46dcSZachary Turner Reset (py_obj); 86*2c1f46dcSZachary Turner } 87*2c1f46dcSZachary Turner 88*2c1f46dcSZachary Turner PythonObject (const PythonObject &rhs) : 89*2c1f46dcSZachary Turner m_py_obj(NULL) 90*2c1f46dcSZachary Turner { 91*2c1f46dcSZachary Turner Reset (rhs.m_py_obj); 92*2c1f46dcSZachary Turner } 93*2c1f46dcSZachary Turner 94*2c1f46dcSZachary Turner virtual 95*2c1f46dcSZachary Turner ~PythonObject () 96*2c1f46dcSZachary Turner { 97*2c1f46dcSZachary Turner Reset (NULL); 98*2c1f46dcSZachary Turner } 99*2c1f46dcSZachary Turner 100*2c1f46dcSZachary Turner bool 101*2c1f46dcSZachary Turner Reset (const PythonObject &object) 102*2c1f46dcSZachary Turner { 103*2c1f46dcSZachary Turner return Reset(object.get()); 104*2c1f46dcSZachary Turner } 105*2c1f46dcSZachary Turner 106*2c1f46dcSZachary Turner virtual bool 107*2c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL) 108*2c1f46dcSZachary Turner { 109*2c1f46dcSZachary Turner if (py_obj != m_py_obj) 110*2c1f46dcSZachary Turner { 111*2c1f46dcSZachary Turner if (Py_IsInitialized()) 112*2c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 113*2c1f46dcSZachary Turner m_py_obj = py_obj; 114*2c1f46dcSZachary Turner if (Py_IsInitialized()) 115*2c1f46dcSZachary Turner Py_XINCREF(m_py_obj); 116*2c1f46dcSZachary Turner } 117*2c1f46dcSZachary Turner return true; 118*2c1f46dcSZachary Turner } 119*2c1f46dcSZachary Turner 120*2c1f46dcSZachary Turner void 121*2c1f46dcSZachary Turner Dump () const 122*2c1f46dcSZachary Turner { 123*2c1f46dcSZachary Turner if (m_py_obj) 124*2c1f46dcSZachary Turner _PyObject_Dump (m_py_obj); 125*2c1f46dcSZachary Turner else 126*2c1f46dcSZachary Turner puts ("NULL"); 127*2c1f46dcSZachary Turner } 128*2c1f46dcSZachary Turner 129*2c1f46dcSZachary Turner void 130*2c1f46dcSZachary Turner Dump (Stream &strm) const; 131*2c1f46dcSZachary Turner 132*2c1f46dcSZachary Turner PyObject* 133*2c1f46dcSZachary Turner get () const 134*2c1f46dcSZachary Turner { 135*2c1f46dcSZachary Turner return m_py_obj; 136*2c1f46dcSZachary Turner } 137*2c1f46dcSZachary Turner 138*2c1f46dcSZachary Turner PyObjectType GetObjectType() const; 139*2c1f46dcSZachary Turner 140*2c1f46dcSZachary Turner PythonString 141*2c1f46dcSZachary Turner Repr (); 142*2c1f46dcSZachary Turner 143*2c1f46dcSZachary Turner PythonString 144*2c1f46dcSZachary Turner Str (); 145*2c1f46dcSZachary Turner 146*2c1f46dcSZachary Turner explicit operator bool () const 147*2c1f46dcSZachary Turner { 148*2c1f46dcSZachary Turner return m_py_obj != NULL; 149*2c1f46dcSZachary Turner } 150*2c1f46dcSZachary Turner 151*2c1f46dcSZachary Turner bool 152*2c1f46dcSZachary Turner IsNULLOrNone () const; 153*2c1f46dcSZachary Turner 154*2c1f46dcSZachary Turner StructuredData::ObjectSP CreateStructuredObject() const; 155*2c1f46dcSZachary Turner 156*2c1f46dcSZachary Turner protected: 157*2c1f46dcSZachary Turner PyObject* m_py_obj; 158*2c1f46dcSZachary Turner }; 159*2c1f46dcSZachary Turner 160*2c1f46dcSZachary Turner class PythonString: public PythonObject 161*2c1f46dcSZachary Turner { 162*2c1f46dcSZachary Turner public: 163*2c1f46dcSZachary Turner PythonString (); 164*2c1f46dcSZachary Turner PythonString (PyObject *o); 165*2c1f46dcSZachary Turner PythonString (const PythonObject &object); 166*2c1f46dcSZachary Turner PythonString (llvm::StringRef string); 167*2c1f46dcSZachary Turner PythonString (const char *string); 168*2c1f46dcSZachary Turner virtual ~PythonString (); 169*2c1f46dcSZachary Turner 170*2c1f46dcSZachary Turner virtual bool 171*2c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL); 172*2c1f46dcSZachary Turner 173*2c1f46dcSZachary Turner llvm::StringRef 174*2c1f46dcSZachary Turner GetString() const; 175*2c1f46dcSZachary Turner 176*2c1f46dcSZachary Turner size_t 177*2c1f46dcSZachary Turner GetSize() const; 178*2c1f46dcSZachary Turner 179*2c1f46dcSZachary Turner void SetString(llvm::StringRef string); 180*2c1f46dcSZachary Turner 181*2c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 182*2c1f46dcSZachary Turner }; 183*2c1f46dcSZachary Turner 184*2c1f46dcSZachary Turner class PythonInteger: public PythonObject 185*2c1f46dcSZachary Turner { 186*2c1f46dcSZachary Turner public: 187*2c1f46dcSZachary Turner 188*2c1f46dcSZachary Turner PythonInteger (); 189*2c1f46dcSZachary Turner PythonInteger (PyObject* py_obj); 190*2c1f46dcSZachary Turner PythonInteger (const PythonObject &object); 191*2c1f46dcSZachary Turner PythonInteger (int64_t value); 192*2c1f46dcSZachary Turner virtual ~PythonInteger (); 193*2c1f46dcSZachary Turner 194*2c1f46dcSZachary Turner virtual bool 195*2c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL); 196*2c1f46dcSZachary Turner 197*2c1f46dcSZachary Turner int64_t GetInteger() const; 198*2c1f46dcSZachary Turner 199*2c1f46dcSZachary Turner void 200*2c1f46dcSZachary Turner SetInteger (int64_t value); 201*2c1f46dcSZachary Turner 202*2c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 203*2c1f46dcSZachary Turner }; 204*2c1f46dcSZachary Turner 205*2c1f46dcSZachary Turner class PythonList: public PythonObject 206*2c1f46dcSZachary Turner { 207*2c1f46dcSZachary Turner public: 208*2c1f46dcSZachary Turner 209*2c1f46dcSZachary Turner PythonList (bool create_empty); 210*2c1f46dcSZachary Turner PythonList (PyObject* py_obj); 211*2c1f46dcSZachary Turner PythonList (const PythonObject &object); 212*2c1f46dcSZachary Turner PythonList (uint32_t count); 213*2c1f46dcSZachary Turner virtual ~PythonList (); 214*2c1f46dcSZachary Turner 215*2c1f46dcSZachary Turner virtual bool 216*2c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL); 217*2c1f46dcSZachary Turner 218*2c1f46dcSZachary Turner uint32_t GetSize() const; 219*2c1f46dcSZachary Turner 220*2c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 221*2c1f46dcSZachary Turner 222*2c1f46dcSZachary Turner void 223*2c1f46dcSZachary Turner SetItemAtIndex (uint32_t index, const PythonObject &object); 224*2c1f46dcSZachary Turner 225*2c1f46dcSZachary Turner void 226*2c1f46dcSZachary Turner AppendItem (const PythonObject &object); 227*2c1f46dcSZachary Turner 228*2c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 229*2c1f46dcSZachary Turner }; 230*2c1f46dcSZachary Turner 231*2c1f46dcSZachary Turner class PythonDictionary: public PythonObject 232*2c1f46dcSZachary Turner { 233*2c1f46dcSZachary Turner public: 234*2c1f46dcSZachary Turner 235*2c1f46dcSZachary Turner explicit PythonDictionary (bool create_empty); 236*2c1f46dcSZachary Turner PythonDictionary (PyObject* object); 237*2c1f46dcSZachary Turner PythonDictionary (const PythonObject &object); 238*2c1f46dcSZachary Turner virtual ~PythonDictionary (); 239*2c1f46dcSZachary Turner 240*2c1f46dcSZachary Turner virtual bool 241*2c1f46dcSZachary Turner Reset (PyObject* object = NULL); 242*2c1f46dcSZachary Turner 243*2c1f46dcSZachary Turner uint32_t GetSize() const; 244*2c1f46dcSZachary Turner 245*2c1f46dcSZachary Turner PythonObject 246*2c1f46dcSZachary Turner GetItemForKey (const PythonString &key) const; 247*2c1f46dcSZachary Turner 248*2c1f46dcSZachary Turner const char * 249*2c1f46dcSZachary Turner GetItemForKeyAsString (const PythonString &key, const char *fail_value = NULL) const; 250*2c1f46dcSZachary Turner 251*2c1f46dcSZachary Turner int64_t 252*2c1f46dcSZachary Turner GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value = 0) const; 253*2c1f46dcSZachary Turner 254*2c1f46dcSZachary Turner PythonObject 255*2c1f46dcSZachary Turner GetItemForKey (const char *key) const; 256*2c1f46dcSZachary Turner 257*2c1f46dcSZachary Turner typedef bool (*DictionaryIteratorCallback)(PythonString* key, PythonDictionary* dict); 258*2c1f46dcSZachary Turner 259*2c1f46dcSZachary Turner PythonList 260*2c1f46dcSZachary Turner GetKeys () const; 261*2c1f46dcSZachary Turner 262*2c1f46dcSZachary Turner PythonString 263*2c1f46dcSZachary Turner GetKeyAtPosition (uint32_t pos) const; 264*2c1f46dcSZachary Turner 265*2c1f46dcSZachary Turner PythonObject 266*2c1f46dcSZachary Turner GetValueAtPosition (uint32_t pos) const; 267*2c1f46dcSZachary Turner 268*2c1f46dcSZachary Turner void 269*2c1f46dcSZachary Turner SetItemForKey (const PythonString &key, PyObject *value); 270*2c1f46dcSZachary Turner 271*2c1f46dcSZachary Turner void 272*2c1f46dcSZachary Turner SetItemForKey (const PythonString &key, const PythonObject& value); 273*2c1f46dcSZachary Turner 274*2c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 275*2c1f46dcSZachary Turner }; 276*2c1f46dcSZachary Turner 277*2c1f46dcSZachary Turner } // namespace lldb_private 278*2c1f46dcSZachary Turner 279*2c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 280