diff --git a/lldb/include/lldb/Symbol/Variable.h b/lldb/include/lldb/Symbol/Variable.h index c437624d1ea6d..5b9c709c8b867 100644 --- a/lldb/include/lldb/Symbol/Variable.h +++ b/lldb/include/lldb/Symbol/Variable.h @@ -89,6 +89,9 @@ class Variable : public UserID, public std::enable_shared_from_this { bool IsInScope(StackFrame *frame); + /// Returns true if this variable is in scope at `addr` inside `block`. + bool IsInScope(const Block &block, const Address &addr); + bool LocationIsValidForFrame(StackFrame *frame); bool LocationIsValidForAddress(const Address &address); diff --git a/lldb/source/Symbol/Variable.cpp b/lldb/source/Symbol/Variable.cpp index 8244725aba545..af32e0e958e51 100644 --- a/lldb/source/Symbol/Variable.cpp +++ b/lldb/source/Symbol/Variable.cpp @@ -290,28 +290,9 @@ bool Variable::IsInScope(StackFrame *frame) { // this variable was defined in is currently Block *deepest_frame_block = frame->GetSymbolContext(eSymbolContextBlock).block; - if (deepest_frame_block) { - SymbolContext variable_sc; - CalculateSymbolContext(&variable_sc); - - // Check for static or global variable defined at the compile unit - // level that wasn't defined in a block - if (variable_sc.block == nullptr) - return true; - - // Check if the variable is valid in the current block - if (variable_sc.block != deepest_frame_block && - !variable_sc.block->Contains(deepest_frame_block)) - return false; - - // If no scope range is specified then it means that the scope is the - // same as the scope of the enclosing lexical block. - if (m_scope_range.IsEmpty()) - return true; - - addr_t file_address = frame->GetFrameCodeAddress().GetFileAddress(); - return m_scope_range.FindEntryThatContains(file_address) != nullptr; - } + Address frame_addr = frame->GetFrameCodeAddress(); + if (deepest_frame_block) + return IsInScope(*deepest_frame_block, frame_addr); } break; @@ -321,6 +302,27 @@ bool Variable::IsInScope(StackFrame *frame) { return false; } +bool Variable::IsInScope(const Block &block, const Address &addr) { + SymbolContext variable_sc; + CalculateSymbolContext(&variable_sc); + + // Check for static or global variable defined at the compile unit + // level that wasn't defined in a block + if (variable_sc.block == nullptr) + return true; + + // Check if the variable is valid in the current block + if (variable_sc.block != &block && !variable_sc.block->Contains(&block)) + return false; + + // If no scope range is specified then it means that the scope is the + // same as the scope of the enclosing lexical block. + if (m_scope_range.IsEmpty()) + return true; + + return m_scope_range.FindEntryThatContains(addr.GetFileAddress()) != nullptr; +} + Status Variable::GetValuesForVariableExpressionPath( llvm::StringRef variable_expr_path, ExecutionContextScope *scope, GetVariableCallback callback, void *baton, VariableList &variable_list,