Added a new convenience property on lldb.SBThread names "frames" which always returns a complete list of all lldb.SBFrame objects:
(lldb) script
>>> frames = lldb.thread.frames
>>> for frame in frames:
... print frame
Also changed all of the "__repr__" methods to strip any trailing newline characters so we don't end up with entra newlines.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@149466 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/scripts/Python/interface/SBThread.i b/scripts/Python/interface/SBThread.i
index c77706a..fbb1e4e 100644
--- a/scripts/Python/interface/SBThread.i
+++ b/scripts/Python/interface/SBThread.i
@@ -175,6 +175,13 @@
GetDescription (lldb::SBStream &description) const;
%pythoncode %{
+ def get_thread_frames(self):
+ frames = []
+ for frame in self:
+ frames.append(frame)
+ return frames
+
+
__swig_getmethods__["id"] = GetThreadID
if _newclass: x = property(GetThreadID, None)
@@ -190,6 +197,9 @@
__swig_getmethods__["num_frames"] = GetNumFrames
if _newclass: x = property(GetNumFrames, None)
+ __swig_getmethods__["frames"] = get_thread_frames
+ if _newclass: x = property(get_thread_frames, None)
+
__swig_getmethods__["name"] = GetName
if _newclass: x = property(GetName, None)
diff --git a/scripts/Python/python-extensions.swig b/scripts/Python/python-extensions.swig
index e0ddbeb..13ed557 100644
--- a/scripts/Python/python-extensions.swig
+++ b/scripts/Python/python-extensions.swig
@@ -3,182 +3,338 @@
PyObject *lldb::SBAddress::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBBlock {
PyObject *lldb::SBBlock::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBBreakpoint {
PyObject *lldb::SBBreakpoint::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBBreakpointLocation {
PyObject *lldb::SBBreakpointLocation::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description, lldb::eDescriptionLevelFull);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBCommandReturnObject {
PyObject *lldb::SBCommandReturnObject::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBCompileUnit {
PyObject *lldb::SBCompileUnit::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBData {
PyObject *lldb::SBData::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBDebugger {
PyObject *lldb::SBDebugger::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBError {
PyObject *lldb::SBError::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBFileSpec {
PyObject *lldb::SBFileSpec::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBFrame {
PyObject *lldb::SBFrame::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBFunction {
PyObject *lldb::SBFunction::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBInstruction {
PyObject *lldb::SBInstruction::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBInstructionList {
PyObject *lldb::SBInstructionList::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBLineEntry {
PyObject *lldb::SBLineEntry::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBModule {
PyObject *lldb::SBModule::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBProcess {
PyObject *lldb::SBProcess::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBSection {
PyObject *lldb::SBSection::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBSymbol {
PyObject *lldb::SBSymbol::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBSymbolContext {
PyObject *lldb::SBSymbolContext::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBTarget {
PyObject *lldb::SBTarget::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description, lldb::eDescriptionLevelBrief);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBType {
PyObject *lldb::SBType::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description, lldb::eDescriptionLevelBrief);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBTypeMember {
PyObject *lldb::SBTypeMember::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description, lldb::eDescriptionLevelBrief);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBThread {
PyObject *lldb::SBThread::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBValue {
PyObject *lldb::SBValue::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}
%extend lldb::SBWatchpoint {
PyObject *lldb::SBWatchpoint::__repr__ (){
lldb::SBStream description;
$self->GetDescription (description, lldb::eDescriptionLevelVerbose);
- return PyString_FromString (description.GetData());
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return PyString_FromStringAndSize (desc, desc_len);
+ return Py_None;
}
}