blob: 3893e3bece97d5a959952ce69a77ccb6d7da7523 [file] [log] [blame]
//===-- PythonDataObjects.h----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_PythonDataObjects_h_
#define liblldb_PythonDataObjects_h_
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-defines.h"
#include "lldb/Core/ConstString.h"
#include "lldb/Core/Flags.h"
#include "lldb/Interpreter/OptionValue.h"
#if defined (__APPLE__)
#include <Python/Python.h>
#else
#include <Python.h>
#endif
namespace lldb_private {
class PythonObject
{
public:
PythonObject () :
m_py_obj(NULL)
{
}
PythonObject (PyObject* py_obj) :
m_py_obj(NULL)
{
Reset (py_obj);
}
PythonObject (const PythonObject &rhs) :
m_py_obj(NULL)
{
Reset (rhs.m_py_obj);
}
PythonObject (const lldb::ScriptInterpreterObjectSP &script_object_sp);
virtual
~PythonObject ()
{
Reset (NULL);
}
const PythonObject &
operator = (const PythonObject &rhs)
{
if (this != &rhs)
Reset (rhs.m_py_obj);
return *this;
}
bool
Reset (const PythonObject &object)
{
return Reset(object.GetPythonObject());
}
virtual bool
Reset (PyObject* py_obj = NULL)
{
if (py_obj != m_py_obj)
{
Py_XDECREF(m_py_obj);
m_py_obj = py_obj;
Py_XINCREF(m_py_obj);
}
return true;
}
void
Dump () const
{
if (m_py_obj)
_PyObject_Dump (m_py_obj);
else
puts ("NULL");
}
void
Dump (Stream &strm) const;
PyObject*
GetPythonObject () const
{
return m_py_obj;
}
operator bool () const
{
return m_py_obj != NULL;
}
protected:
PyObject* m_py_obj;
};
class PythonString: public PythonObject
{
public:
PythonString ();
PythonString (PyObject *o);
PythonString (const PythonObject &object);
PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp);
PythonString (const char* string);
virtual ~PythonString ();
virtual bool
Reset (PyObject* py_obj = NULL);
const char*
GetString() const;
size_t
GetSize() const;
void
SetString (const char* string);
};
class PythonInteger: public PythonObject
{
public:
PythonInteger ();
PythonInteger (PyObject* py_obj);
PythonInteger (const PythonObject &object);
PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp);
PythonInteger (int64_t value);
virtual ~PythonInteger ();
virtual bool
Reset (PyObject* py_obj = NULL);
int64_t
GetInteger();
void
SetInteger (int64_t value);
};
class PythonList: public PythonObject
{
public:
PythonList ();
PythonList (PyObject* py_obj);
PythonList (const PythonObject &object);
PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp);
PythonList (uint32_t count);
virtual ~PythonList ();
virtual bool
Reset (PyObject* py_obj = NULL);
uint32_t
GetSize();
PythonObject
GetItemAtIndex (uint32_t index);
void
SetItemAtIndex (uint32_t index, const PythonObject &object);
void
AppendItem (const PythonObject &object);
};
class PythonDictionary: public PythonObject
{
public:
PythonDictionary ();
PythonDictionary (PyObject* object);
PythonDictionary (const PythonObject &object);
PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp);
virtual ~PythonDictionary ();
virtual bool
Reset (PyObject* object = NULL);
uint32_t GetSize();
PythonObject
GetItemForKey (const PythonString &key) const;
const char *
GetItemForKeyAsString (const PythonString &key, const char *fail_value = NULL) const;
int64_t
GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value = 0) const;
PythonObject
GetItemForKey (const char *key) const;
typedef bool (*DictionaryIteratorCallback)(PythonString* key, PythonDictionary* dict);
PythonList
GetKeys () const;
PythonString
GetKeyAtPosition (uint32_t pos) const;
PythonObject
GetValueAtPosition (uint32_t pos) const;
void
SetItemForKey (const PythonString &key, const PythonObject& value);
};
} // namespace lldb_private
#endif // liblldb_PythonDataObjects_h_