Convert the ScriptInterpreter system to a plugin-based one.
Previously embedded interpreters were handled as ad-hoc source files compiled into source/Interpreter. This made it hard to disable a specific interpreter, or to add support for other interpreters and allow the developer to choose which interpreter(s) were enabled for a particular build. This patch converts script interpreters over to a plugin-based system. Script interpreters now live in source/Plugins/ScriptInterpreter, and the canonical LLDB interpreter, ScriptInterpreterPython, is moved there as well. Any new code interfacing with the Python C API must live in this location from here on out. Additionally, generic code should never need to reference or make assumptions about the presence of a specific interpreter going forward. Differential Revision: http://reviews.llvm.org/D11431 Reviewed By: Greg Clayton llvm-svn: 243681
This commit is contained in:
279
lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
Normal file
279
lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
Normal file
@@ -0,0 +1,279 @@
|
||||
//===-- 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 LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
|
||||
#define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_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/StructuredData.h"
|
||||
#include "lldb/Core/Flags.h"
|
||||
#include "lldb/Interpreter/OptionValue.h"
|
||||
|
||||
namespace lldb_private {
|
||||
class PythonString;
|
||||
class PythonList;
|
||||
class PythonDictionary;
|
||||
class PythonObject;
|
||||
class PythonInteger;
|
||||
|
||||
class StructuredPythonObject : public StructuredData::Generic
|
||||
{
|
||||
public:
|
||||
StructuredPythonObject()
|
||||
: StructuredData::Generic()
|
||||
{
|
||||
}
|
||||
|
||||
StructuredPythonObject(void *obj)
|
||||
: StructuredData::Generic(obj)
|
||||
{
|
||||
Py_XINCREF(GetValue());
|
||||
}
|
||||
|
||||
virtual ~StructuredPythonObject()
|
||||
{
|
||||
if (Py_IsInitialized())
|
||||
Py_XDECREF(GetValue());
|
||||
SetValue(nullptr);
|
||||
}
|
||||
|
||||
bool
|
||||
IsValid() const override
|
||||
{
|
||||
return GetValue() && GetValue() != Py_None;
|
||||
}
|
||||
|
||||
void Dump(Stream &s) const override;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(StructuredPythonObject);
|
||||
};
|
||||
|
||||
enum class PyObjectType
|
||||
{
|
||||
Unknown,
|
||||
None,
|
||||
Integer,
|
||||
Dictionary,
|
||||
List,
|
||||
String
|
||||
};
|
||||
|
||||
class PythonObject
|
||||
{
|
||||
public:
|
||||
PythonObject () :
|
||||
m_py_obj(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
explicit PythonObject (PyObject* py_obj) :
|
||||
m_py_obj(NULL)
|
||||
{
|
||||
Reset (py_obj);
|
||||
}
|
||||
|
||||
PythonObject (const PythonObject &rhs) :
|
||||
m_py_obj(NULL)
|
||||
{
|
||||
Reset (rhs.m_py_obj);
|
||||
}
|
||||
|
||||
virtual
|
||||
~PythonObject ()
|
||||
{
|
||||
Reset (NULL);
|
||||
}
|
||||
|
||||
bool
|
||||
Reset (const PythonObject &object)
|
||||
{
|
||||
return Reset(object.get());
|
||||
}
|
||||
|
||||
virtual bool
|
||||
Reset (PyObject* py_obj = NULL)
|
||||
{
|
||||
if (py_obj != m_py_obj)
|
||||
{
|
||||
if (Py_IsInitialized())
|
||||
Py_XDECREF(m_py_obj);
|
||||
m_py_obj = py_obj;
|
||||
if (Py_IsInitialized())
|
||||
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*
|
||||
get () const
|
||||
{
|
||||
return m_py_obj;
|
||||
}
|
||||
|
||||
PyObjectType GetObjectType() const;
|
||||
|
||||
PythonString
|
||||
Repr ();
|
||||
|
||||
PythonString
|
||||
Str ();
|
||||
|
||||
explicit operator bool () const
|
||||
{
|
||||
return m_py_obj != NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
IsNULLOrNone () const;
|
||||
|
||||
StructuredData::ObjectSP CreateStructuredObject() const;
|
||||
|
||||
protected:
|
||||
PyObject* m_py_obj;
|
||||
};
|
||||
|
||||
class PythonString: public PythonObject
|
||||
{
|
||||
public:
|
||||
PythonString ();
|
||||
PythonString (PyObject *o);
|
||||
PythonString (const PythonObject &object);
|
||||
PythonString (llvm::StringRef string);
|
||||
PythonString (const char *string);
|
||||
virtual ~PythonString ();
|
||||
|
||||
virtual bool
|
||||
Reset (PyObject* py_obj = NULL);
|
||||
|
||||
llvm::StringRef
|
||||
GetString() const;
|
||||
|
||||
size_t
|
||||
GetSize() const;
|
||||
|
||||
void SetString(llvm::StringRef string);
|
||||
|
||||
StructuredData::StringSP CreateStructuredString() const;
|
||||
};
|
||||
|
||||
class PythonInteger: public PythonObject
|
||||
{
|
||||
public:
|
||||
|
||||
PythonInteger ();
|
||||
PythonInteger (PyObject* py_obj);
|
||||
PythonInteger (const PythonObject &object);
|
||||
PythonInteger (int64_t value);
|
||||
virtual ~PythonInteger ();
|
||||
|
||||
virtual bool
|
||||
Reset (PyObject* py_obj = NULL);
|
||||
|
||||
int64_t GetInteger() const;
|
||||
|
||||
void
|
||||
SetInteger (int64_t value);
|
||||
|
||||
StructuredData::IntegerSP CreateStructuredInteger() const;
|
||||
};
|
||||
|
||||
class PythonList: public PythonObject
|
||||
{
|
||||
public:
|
||||
|
||||
PythonList (bool create_empty);
|
||||
PythonList (PyObject* py_obj);
|
||||
PythonList (const PythonObject &object);
|
||||
PythonList (uint32_t count);
|
||||
virtual ~PythonList ();
|
||||
|
||||
virtual bool
|
||||
Reset (PyObject* py_obj = NULL);
|
||||
|
||||
uint32_t GetSize() const;
|
||||
|
||||
PythonObject GetItemAtIndex(uint32_t index) const;
|
||||
|
||||
void
|
||||
SetItemAtIndex (uint32_t index, const PythonObject &object);
|
||||
|
||||
void
|
||||
AppendItem (const PythonObject &object);
|
||||
|
||||
StructuredData::ArraySP CreateStructuredArray() const;
|
||||
};
|
||||
|
||||
class PythonDictionary: public PythonObject
|
||||
{
|
||||
public:
|
||||
|
||||
explicit PythonDictionary (bool create_empty);
|
||||
PythonDictionary (PyObject* object);
|
||||
PythonDictionary (const PythonObject &object);
|
||||
virtual ~PythonDictionary ();
|
||||
|
||||
virtual bool
|
||||
Reset (PyObject* object = NULL);
|
||||
|
||||
uint32_t GetSize() const;
|
||||
|
||||
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, PyObject *value);
|
||||
|
||||
void
|
||||
SetItemForKey (const PythonString &key, const PythonObject& value);
|
||||
|
||||
StructuredData::DictionarySP CreateStructuredDictionary() const;
|
||||
};
|
||||
|
||||
} // namespace lldb_private
|
||||
|
||||
#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_PYTHONDATAOBJECTS_H
|
||||
Reference in New Issue
Block a user