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