summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Target')
-rw-r--r--lldb/source/Target/ObjCLanguageRuntime.cpp19
-rw-r--r--lldb/source/Target/ThreadPlanCallFunction.cpp16
2 files changed, 31 insertions, 4 deletions
diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp
index 7f4de245116..46587a8cc68 100644
--- a/lldb/source/Target/ObjCLanguageRuntime.cpp
+++ b/lldb/source/Target/ObjCLanguageRuntime.cpp
@@ -11,6 +11,7 @@
#include "lldb/Core/Log.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/ValueObject.h"
+#include "lldb/Expression/ClangUtilityFunction.h"
#include "lldb/Symbol/ClangASTContext.h"
#include "lldb/Target/ObjCLanguageRuntime.h"
@@ -51,3 +52,21 @@ ObjCLanguageRuntime::LookupInMethodCache (lldb::addr_t class_addr, lldb::addr_t
return LLDB_INVALID_ADDRESS;
}
+ClangUtilityFunction *
+ObjCLanguageRuntime::CreateObjectChecker(const char *name)
+{
+ char buf[256];
+
+ assert(snprintf(&buf[0], sizeof(buf),
+ "extern \"C\" int gdb_object_getClass(void *);"
+ "extern \"C\" void "
+ "%s(void *$__lldb_arg_obj)"
+ "{"
+ " void **isa_ptr = (void **)$__lldb_arg_obj;"
+ " if (!isa_ptr || !gdb_class_getClass(*isa_ptr))"
+ " abort();"
+ "}",
+ name) < sizeof(buf));
+
+ return new ClangUtilityFunction(buf, name);
+}
diff --git a/lldb/source/Target/ThreadPlanCallFunction.cpp b/lldb/source/Target/ThreadPlanCallFunction.cpp
index 65349ddaeb7..85de672a63d 100644
--- a/lldb/source/Target/ThreadPlanCallFunction.cpp
+++ b/lldb/source/Target/ThreadPlanCallFunction.cpp
@@ -150,6 +150,17 @@ ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread,
ThreadPlanCallFunction::~ThreadPlanCallFunction ()
{
+ if (m_valid && !IsPlanComplete())
+ DoTakedown();
+}
+
+void
+ThreadPlanCallFunction::DoTakedown ()
+{
+ m_thread.RestoreSaveFrameZero(m_register_backup);
+ m_thread.ClearStackFrames();
+ SetPlanComplete();
+ ClearBreakpoints();
}
void
@@ -253,11 +264,8 @@ ThreadPlanCallFunction::ShouldStop (Event *event_ptr)
}
}
- m_thread.RestoreSaveFrameZero(m_register_backup);
- m_thread.ClearStackFrames();
- SetPlanComplete();
+ DoTakedown();
- ClearBreakpoints();
return true;
}
else
OpenPOWER on IntegriCloud