From 8a2a0dfba5c1224bc5a79d99156133de37767e30 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Wed, 19 Feb 2014 19:35:13 +0000 Subject: [PATCH] Restore the ability of SBFrame::FindValue() to look for file global variables This should clean up the new test failures caused by r201614 llvm-svn: 201710 --- lldb/include/lldb/Symbol/VariableList.h | 5 ++++- lldb/source/API/SBFrame.cpp | 12 ++++++++++-- lldb/source/Symbol/VariableList.cpp | 10 ++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lldb/include/lldb/Symbol/VariableList.h b/lldb/include/lldb/Symbol/VariableList.h index 7abb2c650c2b..08efd3d5b9a1 100644 --- a/lldb/include/lldb/Symbol/VariableList.h +++ b/lldb/include/lldb/Symbol/VariableList.h @@ -55,7 +55,10 @@ public: uint32_t FindVariableIndex (const lldb::VariableSP &var_sp); - + + size_t + AppendVariablesIfUnique(VariableList &var_list); + // Returns the actual number of unique variables that were added to the // list. "total_matches" will get updated with the actualy number of // matches that were found regardless of whether they were unique or not diff --git a/lldb/source/API/SBFrame.cpp b/lldb/source/API/SBFrame.cpp index 7d0a03f7103f..44fc654c44b6 100644 --- a/lldb/source/API/SBFrame.cpp +++ b/lldb/source/API/SBFrame.cpp @@ -845,6 +845,8 @@ SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueTy frame = exe_ctx.GetFramePtr(); if (frame) { + VariableList variable_list; + switch (value_type) { case eValueTypeVariableGlobal: // global variable @@ -852,8 +854,7 @@ SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueTy case eValueTypeVariableArgument: // function argument variables case eValueTypeVariableLocal: // function local variables { - VariableList variable_list; - + SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); const bool can_create = true; @@ -865,6 +866,13 @@ SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueTy stop_if_block_is_inlined_function, &variable_list)) { + if (value_type == eValueTypeVariableGlobal) + { + const bool get_file_globals = true; + VariableList* frame_vars = frame->GetVariableList(get_file_globals); + if (frame_vars) + frame_vars->AppendVariablesIfUnique(variable_list); + } ConstString const_name(name); VariableSP variable_sp(variable_list.FindVariable(const_name,value_type)); if (variable_sp) diff --git a/lldb/source/Symbol/VariableList.cpp b/lldb/source/Symbol/VariableList.cpp index 15f2b2907969..75eb8700c9ff 100644 --- a/lldb/source/Symbol/VariableList.cpp +++ b/lldb/source/Symbol/VariableList.cpp @@ -131,6 +131,16 @@ VariableList::FindVariable (const ConstString& name, lldb::ValueType value_type) return var_sp; } +size_t +VariableList::AppendVariablesIfUnique(VariableList &var_list) +{ + const size_t initial_size = var_list.GetSize(); + iterator pos, end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + var_list.AddVariableIfUnique(*pos); + return var_list.GetSize() - initial_size; +} + size_t VariableList::AppendVariablesIfUnique (const RegularExpression& regex, VariableList &var_list, size_t& total_matches) {