diff options
Diffstat (limited to 'lldb/source/Target')
| -rw-r--r-- | lldb/source/Target/ObjCLanguageRuntime.cpp | 19 | ||||
| -rw-r--r-- | lldb/source/Target/ThreadPlanCallFunction.cpp | 16 |
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 |

