12c1f46dcSZachary Turner //===-- PythonDataObjects.h----------------------------------------*- C++ -*-===// 22c1f46dcSZachary Turner // 32c1f46dcSZachary Turner // The LLVM Compiler Infrastructure 42c1f46dcSZachary Turner // 52c1f46dcSZachary Turner // This file is distributed under the University of Illinois Open Source 62c1f46dcSZachary Turner // License. See LICENSE.TXT for details. 72c1f46dcSZachary Turner // 82c1f46dcSZachary Turner //===----------------------------------------------------------------------===// 92c1f46dcSZachary Turner 102c1f46dcSZachary Turner #ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 112c1f46dcSZachary Turner #define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 122c1f46dcSZachary Turner 132c1f46dcSZachary Turner // C Includes 142c1f46dcSZachary Turner // C++ Includes 152c1f46dcSZachary Turner 162c1f46dcSZachary Turner // Other libraries and framework includes 172c1f46dcSZachary Turner // Project includes 182c1f46dcSZachary Turner #include "lldb/lldb-defines.h" 192c1f46dcSZachary Turner #include "lldb/Core/ConstString.h" 202c1f46dcSZachary Turner #include "lldb/Core/StructuredData.h" 212c1f46dcSZachary Turner #include "lldb/Core/Flags.h" 222c1f46dcSZachary Turner #include "lldb/Interpreter/OptionValue.h" 232c1f46dcSZachary Turner 242c1f46dcSZachary Turner namespace lldb_private { 252c1f46dcSZachary Turner class PythonString; 262c1f46dcSZachary Turner class PythonList; 272c1f46dcSZachary Turner class PythonDictionary; 282c1f46dcSZachary Turner class PythonObject; 292c1f46dcSZachary Turner class PythonInteger; 302c1f46dcSZachary Turner 312c1f46dcSZachary Turner class StructuredPythonObject : public StructuredData::Generic 322c1f46dcSZachary Turner { 332c1f46dcSZachary Turner public: 342c1f46dcSZachary Turner StructuredPythonObject() 352c1f46dcSZachary Turner : StructuredData::Generic() 362c1f46dcSZachary Turner { 372c1f46dcSZachary Turner } 382c1f46dcSZachary Turner 392c1f46dcSZachary Turner StructuredPythonObject(void *obj) 402c1f46dcSZachary Turner : StructuredData::Generic(obj) 412c1f46dcSZachary Turner { 422c1f46dcSZachary Turner Py_XINCREF(GetValue()); 432c1f46dcSZachary Turner } 442c1f46dcSZachary Turner 452c1f46dcSZachary Turner virtual ~StructuredPythonObject() 462c1f46dcSZachary Turner { 472c1f46dcSZachary Turner if (Py_IsInitialized()) 482c1f46dcSZachary Turner Py_XDECREF(GetValue()); 492c1f46dcSZachary Turner SetValue(nullptr); 502c1f46dcSZachary Turner } 512c1f46dcSZachary Turner 522c1f46dcSZachary Turner bool 532c1f46dcSZachary Turner IsValid() const override 542c1f46dcSZachary Turner { 552c1f46dcSZachary Turner return GetValue() && GetValue() != Py_None; 562c1f46dcSZachary Turner } 572c1f46dcSZachary Turner 582c1f46dcSZachary Turner void Dump(Stream &s) const override; 592c1f46dcSZachary Turner 602c1f46dcSZachary Turner private: 612c1f46dcSZachary Turner DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject); 622c1f46dcSZachary Turner }; 632c1f46dcSZachary Turner 642c1f46dcSZachary Turner enum class PyObjectType 652c1f46dcSZachary Turner { 662c1f46dcSZachary Turner Unknown, 672c1f46dcSZachary Turner None, 682c1f46dcSZachary Turner Integer, 692c1f46dcSZachary Turner Dictionary, 702c1f46dcSZachary Turner List, 712c1f46dcSZachary Turner String 722c1f46dcSZachary Turner }; 732c1f46dcSZachary Turner 742c1f46dcSZachary Turner class PythonObject 752c1f46dcSZachary Turner { 762c1f46dcSZachary Turner public: 772c1f46dcSZachary Turner PythonObject () : 782c1f46dcSZachary Turner m_py_obj(NULL) 792c1f46dcSZachary Turner { 802c1f46dcSZachary Turner } 812c1f46dcSZachary Turner 822c1f46dcSZachary Turner explicit PythonObject (PyObject* py_obj) : 832c1f46dcSZachary Turner m_py_obj(NULL) 842c1f46dcSZachary Turner { 852c1f46dcSZachary Turner Reset (py_obj); 862c1f46dcSZachary Turner } 872c1f46dcSZachary Turner 882c1f46dcSZachary Turner PythonObject (const PythonObject &rhs) : 892c1f46dcSZachary Turner m_py_obj(NULL) 902c1f46dcSZachary Turner { 912c1f46dcSZachary Turner Reset (rhs.m_py_obj); 922c1f46dcSZachary Turner } 932c1f46dcSZachary Turner 942c1f46dcSZachary Turner virtual 952c1f46dcSZachary Turner ~PythonObject () 962c1f46dcSZachary Turner { 972c1f46dcSZachary Turner Reset (NULL); 982c1f46dcSZachary Turner } 992c1f46dcSZachary Turner 1002c1f46dcSZachary Turner bool 1012c1f46dcSZachary Turner Reset (const PythonObject &object) 1022c1f46dcSZachary Turner { 1032c1f46dcSZachary Turner return Reset(object.get()); 1042c1f46dcSZachary Turner } 1052c1f46dcSZachary Turner 1062c1f46dcSZachary Turner virtual bool 1072c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL) 1082c1f46dcSZachary Turner { 1092c1f46dcSZachary Turner if (py_obj != m_py_obj) 1102c1f46dcSZachary Turner { 1112c1f46dcSZachary Turner if (Py_IsInitialized()) 1122c1f46dcSZachary Turner Py_XDECREF(m_py_obj); 1132c1f46dcSZachary Turner m_py_obj = py_obj; 1142c1f46dcSZachary Turner if (Py_IsInitialized()) 1152c1f46dcSZachary Turner Py_XINCREF(m_py_obj); 1162c1f46dcSZachary Turner } 1172c1f46dcSZachary Turner return true; 1182c1f46dcSZachary Turner } 1192c1f46dcSZachary Turner 1202c1f46dcSZachary Turner void 1212c1f46dcSZachary Turner Dump () const 1222c1f46dcSZachary Turner { 1232c1f46dcSZachary Turner if (m_py_obj) 1242c1f46dcSZachary Turner _PyObject_Dump (m_py_obj); 1252c1f46dcSZachary Turner else 1262c1f46dcSZachary Turner puts ("NULL"); 1272c1f46dcSZachary Turner } 1282c1f46dcSZachary Turner 1292c1f46dcSZachary Turner void 1302c1f46dcSZachary Turner Dump (Stream &strm) const; 1312c1f46dcSZachary Turner 1322c1f46dcSZachary Turner PyObject* 1332c1f46dcSZachary Turner get () const 1342c1f46dcSZachary Turner { 1352c1f46dcSZachary Turner return m_py_obj; 1362c1f46dcSZachary Turner } 1372c1f46dcSZachary Turner 1382c1f46dcSZachary Turner PyObjectType GetObjectType() const; 1392c1f46dcSZachary Turner 1402c1f46dcSZachary Turner PythonString 1412c1f46dcSZachary Turner Repr (); 1422c1f46dcSZachary Turner 1432c1f46dcSZachary Turner PythonString 1442c1f46dcSZachary Turner Str (); 1452c1f46dcSZachary Turner 1462c1f46dcSZachary Turner explicit operator bool () const 1472c1f46dcSZachary Turner { 1482c1f46dcSZachary Turner return m_py_obj != NULL; 1492c1f46dcSZachary Turner } 1502c1f46dcSZachary Turner 1512c1f46dcSZachary Turner bool 1522c1f46dcSZachary Turner IsNULLOrNone () const; 1532c1f46dcSZachary Turner 1542c1f46dcSZachary Turner StructuredData::ObjectSP CreateStructuredObject() const; 1552c1f46dcSZachary Turner 1562c1f46dcSZachary Turner protected: 1572c1f46dcSZachary Turner PyObject* m_py_obj; 1582c1f46dcSZachary Turner }; 1592c1f46dcSZachary Turner 1602c1f46dcSZachary Turner class PythonString: public PythonObject 1612c1f46dcSZachary Turner { 1622c1f46dcSZachary Turner public: 1632c1f46dcSZachary Turner PythonString (); 1642c1f46dcSZachary Turner PythonString (PyObject *o); 1652c1f46dcSZachary Turner PythonString (const PythonObject &object); 1662c1f46dcSZachary Turner PythonString (llvm::StringRef string); 1672c1f46dcSZachary Turner PythonString (const char *string); 1682c1f46dcSZachary Turner virtual ~PythonString (); 1692c1f46dcSZachary Turner 170*22c8efcdSZachary Turner static bool Check(PyObject *py_obj); 171*22c8efcdSZachary Turner 1722c1f46dcSZachary Turner virtual bool 1732c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL); 1742c1f46dcSZachary Turner 1752c1f46dcSZachary Turner llvm::StringRef 1762c1f46dcSZachary Turner GetString() const; 1772c1f46dcSZachary Turner 1782c1f46dcSZachary Turner size_t 1792c1f46dcSZachary Turner GetSize() const; 1802c1f46dcSZachary Turner 1812c1f46dcSZachary Turner void SetString(llvm::StringRef string); 1822c1f46dcSZachary Turner 1832c1f46dcSZachary Turner StructuredData::StringSP CreateStructuredString() const; 1842c1f46dcSZachary Turner }; 1852c1f46dcSZachary Turner 1862c1f46dcSZachary Turner class PythonInteger: public PythonObject 1872c1f46dcSZachary Turner { 1882c1f46dcSZachary Turner public: 1892c1f46dcSZachary Turner 1902c1f46dcSZachary Turner PythonInteger (); 1912c1f46dcSZachary Turner PythonInteger (PyObject* py_obj); 1922c1f46dcSZachary Turner PythonInteger (const PythonObject &object); 1932c1f46dcSZachary Turner PythonInteger (int64_t value); 1942c1f46dcSZachary Turner virtual ~PythonInteger (); 1952c1f46dcSZachary Turner 196*22c8efcdSZachary Turner static bool Check(PyObject *py_obj); 197*22c8efcdSZachary Turner 1982c1f46dcSZachary Turner virtual bool 1992c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL); 2002c1f46dcSZachary Turner 2012c1f46dcSZachary Turner int64_t GetInteger() const; 2022c1f46dcSZachary Turner 2032c1f46dcSZachary Turner void 2042c1f46dcSZachary Turner SetInteger (int64_t value); 2052c1f46dcSZachary Turner 2062c1f46dcSZachary Turner StructuredData::IntegerSP CreateStructuredInteger() const; 2072c1f46dcSZachary Turner }; 2082c1f46dcSZachary Turner 2092c1f46dcSZachary Turner class PythonList: public PythonObject 2102c1f46dcSZachary Turner { 2112c1f46dcSZachary Turner public: 212*22c8efcdSZachary Turner PythonList(); 2132c1f46dcSZachary Turner PythonList (PyObject* py_obj); 2142c1f46dcSZachary Turner PythonList (const PythonObject &object); 2152c1f46dcSZachary Turner virtual ~PythonList (); 2162c1f46dcSZachary Turner 217*22c8efcdSZachary Turner static bool Check(PyObject *py_obj); 218*22c8efcdSZachary Turner 2192c1f46dcSZachary Turner virtual bool 2202c1f46dcSZachary Turner Reset (PyObject* py_obj = NULL); 2212c1f46dcSZachary Turner 2222c1f46dcSZachary Turner uint32_t GetSize() const; 2232c1f46dcSZachary Turner 2242c1f46dcSZachary Turner PythonObject GetItemAtIndex(uint32_t index) const; 2252c1f46dcSZachary Turner 2262c1f46dcSZachary Turner void 2272c1f46dcSZachary Turner SetItemAtIndex (uint32_t index, const PythonObject &object); 2282c1f46dcSZachary Turner 2292c1f46dcSZachary Turner void 2302c1f46dcSZachary Turner AppendItem (const PythonObject &object); 2312c1f46dcSZachary Turner 2322c1f46dcSZachary Turner StructuredData::ArraySP CreateStructuredArray() const; 2332c1f46dcSZachary Turner }; 2342c1f46dcSZachary Turner 2352c1f46dcSZachary Turner class PythonDictionary: public PythonObject 2362c1f46dcSZachary Turner { 2372c1f46dcSZachary Turner public: 238*22c8efcdSZachary Turner PythonDictionary(); 2392c1f46dcSZachary Turner PythonDictionary (PyObject* object); 2402c1f46dcSZachary Turner PythonDictionary (const PythonObject &object); 2412c1f46dcSZachary Turner virtual ~PythonDictionary (); 2422c1f46dcSZachary Turner 243*22c8efcdSZachary Turner static bool Check(PyObject *py_obj); 244*22c8efcdSZachary Turner 2452c1f46dcSZachary Turner virtual bool 2462c1f46dcSZachary Turner Reset (PyObject* object = NULL); 2472c1f46dcSZachary Turner 2482c1f46dcSZachary Turner uint32_t GetSize() const; 2492c1f46dcSZachary Turner 2502c1f46dcSZachary Turner PythonObject 2512c1f46dcSZachary Turner GetItemForKey (const PythonString &key) const; 2522c1f46dcSZachary Turner 2532c1f46dcSZachary Turner const char * 2542c1f46dcSZachary Turner GetItemForKeyAsString (const PythonString &key, const char *fail_value = NULL) const; 2552c1f46dcSZachary Turner 2562c1f46dcSZachary Turner int64_t 2572c1f46dcSZachary Turner GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value = 0) const; 2582c1f46dcSZachary Turner 2592c1f46dcSZachary Turner PythonObject 2602c1f46dcSZachary Turner GetItemForKey (const char *key) const; 2612c1f46dcSZachary Turner 2622c1f46dcSZachary Turner typedef bool (*DictionaryIteratorCallback)(PythonString* key, PythonDictionary* dict); 2632c1f46dcSZachary Turner 2642c1f46dcSZachary Turner PythonList 2652c1f46dcSZachary Turner GetKeys () const; 2662c1f46dcSZachary Turner 2672c1f46dcSZachary Turner PythonString 2682c1f46dcSZachary Turner GetKeyAtPosition (uint32_t pos) const; 2692c1f46dcSZachary Turner 2702c1f46dcSZachary Turner PythonObject 2712c1f46dcSZachary Turner GetValueAtPosition (uint32_t pos) const; 2722c1f46dcSZachary Turner 2732c1f46dcSZachary Turner void 2742c1f46dcSZachary Turner SetItemForKey (const PythonString &key, PyObject *value); 2752c1f46dcSZachary Turner 2762c1f46dcSZachary Turner void 2772c1f46dcSZachary Turner SetItemForKey (const PythonString &key, const PythonObject& value); 2782c1f46dcSZachary Turner 2792c1f46dcSZachary Turner StructuredData::DictionarySP CreateStructuredDictionary() const; 2802c1f46dcSZachary Turner }; 2812c1f46dcSZachary Turner 2822c1f46dcSZachary Turner } // namespace lldb_private 2832c1f46dcSZachary Turner 2842c1f46dcSZachary Turner #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H 285