diff options
Diffstat (limited to 'source/Breakpoint/BreakpointLocation.cpp')
-rw-r--r-- | source/Breakpoint/BreakpointLocation.cpp | 87 |
1 files changed, 36 insertions, 51 deletions
diff --git a/source/Breakpoint/BreakpointLocation.cpp b/source/Breakpoint/BreakpointLocation.cpp index 5ff91102aadd..5baf4721e826 100644 --- a/source/Breakpoint/BreakpointLocation.cpp +++ b/source/Breakpoint/BreakpointLocation.cpp @@ -19,6 +19,7 @@ #include "lldb/Core/Module.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/ValueObject.h" +#include "lldb/Expression/DiagnosticManager.h" #include "lldb/Expression/ExpressionVariable.h" #include "lldb/Expression/UserExpression.h" #include "lldb/Symbol/CompileUnit.h" @@ -32,36 +33,29 @@ using namespace lldb; using namespace lldb_private; -BreakpointLocation::BreakpointLocation -( - break_id_t loc_id, - Breakpoint &owner, - const Address &addr, - lldb::tid_t tid, - bool hardware, - bool check_for_resolver -) : - StoppointLocation (loc_id, addr.GetOpcodeLoadAddress(&owner.GetTarget()), hardware), - m_being_created(true), - m_should_resolve_indirect_functions (false), - m_is_reexported (false), - m_is_indirect (false), - m_address (addr), - m_owner (owner), - m_options_ap (), - m_bp_site_sp (), - m_condition_mutex () +BreakpointLocation::BreakpointLocation(break_id_t loc_id, Breakpoint &owner, const Address &addr, lldb::tid_t tid, + bool hardware, bool check_for_resolver) + : StoppointLocation(loc_id, addr.GetOpcodeLoadAddress(&owner.GetTarget()), hardware), + m_being_created(true), + m_should_resolve_indirect_functions(false), + m_is_reexported(false), + m_is_indirect(false), + m_address(addr), + m_owner(owner), + m_options_ap(), + m_bp_site_sp(), + m_condition_mutex() { if (check_for_resolver) { Symbol *symbol = m_address.CalculateSymbolContextSymbol(); if (symbol && symbol->IsIndirect()) { - SetShouldResolveIndirectFunctions (true); + SetShouldResolveIndirectFunctions(true); } } - - SetThreadID (tid); + + SetThreadID(tid); m_being_created = false; } @@ -266,9 +260,9 @@ bool BreakpointLocation::ConditionSaysStop (ExecutionContext &exe_ctx, Error &error) { Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS); - - Mutex::Locker evaluation_locker(m_condition_mutex); - + + std::lock_guard<std::mutex> guard(m_condition_mutex); + size_t condition_hash; const char *condition_text = GetConditionText(&condition_hash); @@ -277,10 +271,10 @@ BreakpointLocation::ConditionSaysStop (ExecutionContext &exe_ctx, Error &error) m_user_expression_sp.reset(); return false; } - - if (condition_hash != m_condition_hash || - !m_user_expression_sp || - !m_user_expression_sp->MatchesContext(exe_ctx)) + + DiagnosticManager diagnostics; + + if (condition_hash != m_condition_hash || !m_user_expression_sp || !m_user_expression_sp->MatchesContext(exe_ctx)) { LanguageType language = eLanguageTypeUnknown; // See if we can figure out the language from the frame, otherwise use the default language: @@ -303,20 +297,14 @@ BreakpointLocation::ConditionSaysStop (ExecutionContext &exe_ctx, Error &error) return true; } - StreamString errors; - - if (!m_user_expression_sp->Parse(errors, - exe_ctx, - eExecutionPolicyOnlyWhenNeeded, - true, - false)) + if (!m_user_expression_sp->Parse(diagnostics, exe_ctx, eExecutionPolicyOnlyWhenNeeded, true, false)) { error.SetErrorStringWithFormat("Couldn't parse conditional expression:\n%s", - errors.GetData()); + diagnostics.GetString().c_str()); m_user_expression_sp.reset(); return false; } - + m_condition_hash = condition_hash; } @@ -329,20 +317,17 @@ BreakpointLocation::ConditionSaysStop (ExecutionContext &exe_ctx, Error &error) options.SetUnwindOnError(true); options.SetIgnoreBreakpoints(true); options.SetTryAllThreads(true); - + options.SetResultIsInternal(true); // Don't generate a user variable for condition expressions. + Error expr_error; - - StreamString execution_errors; - + + diagnostics.Clear(); + ExpressionVariableSP result_variable_sp; - + ExpressionResults result_code = - m_user_expression_sp->Execute(execution_errors, - exe_ctx, - options, - m_user_expression_sp, - result_variable_sp); - + m_user_expression_sp->Execute(diagnostics, exe_ctx, options, m_user_expression_sp, result_variable_sp); + bool ret; if (result_code == eExpressionCompleted) @@ -382,9 +367,9 @@ BreakpointLocation::ConditionSaysStop (ExecutionContext &exe_ctx, Error &error) else { ret = false; - error.SetErrorStringWithFormat("Couldn't execute expression:\n%s", execution_errors.GetData()); + error.SetErrorStringWithFormat("Couldn't execute expression:\n%s", diagnostics.GetString().c_str()); } - + return ret; } |