[Lldb-commits] [lldb] r287189 - Make GetValueForVariableExpression use StringRef.
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Wed Nov 16 18:08:15 PST 2016
Good catch, I'll fix it up later tonight
On Wed, Nov 16, 2016 at 5:56 PM Jim Ingham <jingham at apple.com> wrote:
> Probably just an oversight, but changing var_expr_cstr to a StringRef, but
> leaving it called "_cstr" will cause confusion.
>
> Jim
>
> > On Nov 16, 2016, at 5:37 PM, Zachary Turner via lldb-commits <
> lldb-commits at lists.llvm.org> wrote:
> >
> > Author: zturner
> > Date: Wed Nov 16 19:37:52 2016
> > New Revision: 287189
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=287189&view=rev
> > Log:
> > Make GetValueForVariableExpression use StringRef.
> >
> > Also significantly reduced the indentation level by use of
> > early returns, and simplified some of the logic by using
> > StringRef functions such as consumeInteger() and getAsInteger()
> > instead of strtoll, etc.
> >
> > Modified:
> > lldb/trunk/include/lldb/Target/StackFrame.h
> > lldb/trunk/source/Target/StackFrame.cpp
> >
> > Modified: lldb/trunk/include/lldb/Target/StackFrame.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/StackFrame.h?rev=287189&r1=287188&r2=287189&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Target/StackFrame.h (original)
> > +++ lldb/trunk/include/lldb/Target/StackFrame.h Wed Nov 16 19:37:52 2016
> > @@ -313,7 +313,7 @@ public:
> > /// A shared pointer to the ValueObject described by var_expr.
> > //------------------------------------------------------------------
> > lldb::ValueObjectSP GetValueForVariableExpressionPath(
> > - const char *var_expr, lldb::DynamicValueType use_dynamic,
> > + llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic,
> > uint32_t options, lldb::VariableSP &var_sp, Error &error);
> >
> > //------------------------------------------------------------------
> >
> > Modified: lldb/trunk/source/Target/StackFrame.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=287189&r1=287188&r2=287189&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Target/StackFrame.cpp (original)
> > +++ lldb/trunk/source/Target/StackFrame.cpp Wed Nov 16 19:37:52 2016
> > @@ -221,18 +221,17 @@ bool StackFrame::ChangePC(addr_t pc) {
> >
> > const char *StackFrame::Disassemble() {
> > std::lock_guard<std::recursive_mutex> guard(m_mutex);
> > - if (m_disassembly.GetSize() == 0) {
> > - ExecutionContext exe_ctx(shared_from_this());
> > - Target *target = exe_ctx.GetTargetPtr();
> > - if (target) {
> > - const char *plugin_name = nullptr;
> > - const char *flavor = nullptr;
> > - Disassembler::Disassemble(target->GetDebugger(),
> > - target->GetArchitecture(), plugin_name,
> flavor,
> > - exe_ctx, 0, false, 0, 0, m_disassembly);
> > - }
> > - if (m_disassembly.GetSize() == 0)
> > - return nullptr;
> > + if (m_disassembly.Empty())
> > + return nullptr;
> > +
> > + ExecutionContext exe_ctx(shared_from_this());
> > + Target *target = exe_ctx.GetTargetPtr();
> > + if (target) {
> > + const char *plugin_name = nullptr;
> > + const char *flavor = nullptr;
> > + Disassembler::Disassemble(target->GetDebugger(),
> target->GetArchitecture(),
> > + plugin_name, flavor, exe_ctx, 0, false,
> 0, 0,
> > + m_disassembly);
> > }
> > return m_disassembly.GetData();
> > }
> > @@ -485,579 +484,557 @@ StackFrame::GetInScopeVariableList(bool
> > }
> >
> > ValueObjectSP StackFrame::GetValueForVariableExpressionPath(
> > - const char *var_expr_cstr, DynamicValueType use_dynamic, uint32_t
> options,
> > - VariableSP &var_sp, Error &error) {
> > + llvm::StringRef var_expr_cstr, DynamicValueType use_dynamic,
> > + uint32_t options, VariableSP &var_sp, Error &error) {
> > // We can't fetch variable information for a history stack frame.
> > if (m_is_history_frame)
> > return ValueObjectSP();
> >
> > - if (var_expr_cstr && var_expr_cstr[0]) {
> > - const bool check_ptr_vs_member =
> > - (options & eExpressionPathOptionCheckPtrVsMember) != 0;
> > - const bool no_fragile_ivar =
> > - (options & eExpressionPathOptionsNoFragileObjcIvar) != 0;
> > - const bool no_synth_child =
> > - (options & eExpressionPathOptionsNoSyntheticChildren) != 0;
> > - // const bool no_synth_array = (options &
> > - // eExpressionPathOptionsNoSyntheticArrayRange) != 0;
> > - error.Clear();
> > - bool deref = false;
> > - bool address_of = false;
> > - ValueObjectSP valobj_sp;
> > - const bool get_file_globals = true;
> > - // When looking up a variable for an expression, we need only
> consider the
> > - // variables that are in scope.
> > - VariableListSP
> var_list_sp(GetInScopeVariableList(get_file_globals));
> > - VariableList *variable_list = var_list_sp.get();
> > -
> > - if (variable_list) {
> > - // If first character is a '*', then show pointer contents
> > - const char *var_expr = var_expr_cstr;
> > - if (var_expr[0] == '*') {
> > - deref = true;
> > - var_expr++; // Skip the '*'
> > - } else if (var_expr[0] == '&') {
> > - address_of = true;
> > - var_expr++; // Skip the '&'
> > - }
> > -
> > - std::string var_path(var_expr);
> > - size_t separator_idx =
> var_path.find_first_of(".-[=+~|&^%#@!/?,<>{}");
> > - StreamString var_expr_path_strm;
> > -
> > - ConstString name_const_string;
> > - if (separator_idx == std::string::npos)
> > - name_const_string.SetCString(var_path.c_str());
> > - else
> > - name_const_string.SetCStringWithLength(var_path.c_str(),
> separator_idx);
> > + if (var_expr_cstr.empty()) {
> > + error.SetErrorStringWithFormat("invalid variable path '%s'",
> var_expr_cstr);
> > + return ValueObjectSP();
> > + }
> > +
> > + const bool check_ptr_vs_member =
> > + (options & eExpressionPathOptionCheckPtrVsMember) != 0;
> > + const bool no_fragile_ivar =
> > + (options & eExpressionPathOptionsNoFragileObjcIvar) != 0;
> > + const bool no_synth_child =
> > + (options & eExpressionPathOptionsNoSyntheticChildren) != 0;
> > + // const bool no_synth_array = (options &
> > + // eExpressionPathOptionsNoSyntheticArrayRange) != 0;
> > + error.Clear();
> > + bool deref = false;
> > + bool address_of = false;
> > + ValueObjectSP valobj_sp;
> > + const bool get_file_globals = true;
> > + // When looking up a variable for an expression, we need only
> consider the
> > + // variables that are in scope.
> > + VariableListSP var_list_sp(GetInScopeVariableList(get_file_globals));
> > + VariableList *variable_list = var_list_sp.get();
> > +
> > + if (!variable_list)
> > + return ValueObjectSP();
> > +
> > + // If first character is a '*', then show pointer contents
> > + llvm::StringRef var_expr = var_expr_cstr;
> > + std::string var_expr_storage;
> > + if (var_expr[0] == '*') {
> > + deref = true;
> > + var_expr = var_expr.drop_front(); // Skip the '*'
> > + } else if (var_expr[0] == '&') {
> > + address_of = true;
> > + var_expr = var_expr.drop_front(); // Skip the '&'
> > + }
> > +
> > + size_t separator_idx = var_expr.find_first_of(".-[=+~|&^%#@!/?,<>{}");
> > + StreamString var_expr_path_strm;
> >
> > - var_sp = variable_list->FindVariable(name_const_string, false);
> > + ConstString name_const_string(var_expr.substr(0, separator_idx));
> >
> > - bool synthetically_added_instance_object = false;
> > + var_sp = variable_list->FindVariable(name_const_string, false);
> >
> > - if (var_sp) {
> > - var_path.erase(0, name_const_string.GetLength());
> > + bool synthetically_added_instance_object = false;
> > +
> > + if (var_sp) {
> > + var_expr = var_expr.drop_front(name_const_string.GetLength());
> > + }
> > +
> > + if (!var_sp && (options &
> eExpressionPathOptionsAllowDirectIVarAccess)) {
> > + // Check for direct ivars access which helps us with implicit
> > + // access to ivars with the "this->" or "self->"
> > + GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock);
> > + lldb::LanguageType method_language = eLanguageTypeUnknown;
> > + bool is_instance_method = false;
> > + ConstString method_object_name;
> > + if (m_sc.GetFunctionMethodInfo(method_language, is_instance_method,
> > + method_object_name)) {
> > + if (is_instance_method && method_object_name) {
> > + var_sp = variable_list->FindVariable(method_object_name);
> > + if (var_sp) {
> > + separator_idx = 0;
> > + var_expr_storage = "->";
> > + var_expr_storage += var_expr;
> > + var_expr = var_expr_storage;
> > + synthetically_added_instance_object = true;
> > + }
> > }
> > + }
> > + }
> >
> > - if (!var_sp && (options &
> eExpressionPathOptionsAllowDirectIVarAccess)) {
> > - // Check for direct ivars access which helps us with implicit
> > - // access to ivars with the "this->" or "self->"
> > - GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock);
> > - lldb::LanguageType method_language = eLanguageTypeUnknown;
> > - bool is_instance_method = false;
> > - ConstString method_object_name;
> > - if (m_sc.GetFunctionMethodInfo(method_language,
> is_instance_method,
> > - method_object_name)) {
> > - if (is_instance_method && method_object_name) {
> > - var_sp = variable_list->FindVariable(method_object_name);
> > - if (var_sp) {
> > - separator_idx = 0;
> > - var_path.insert(0, "->");
> > - synthetically_added_instance_object = true;
> > - }
> > - }
> > + if (!var_sp && (options &
> eExpressionPathOptionsInspectAnonymousUnions)) {
> > + // Check if any anonymous unions are there which contain a variable
> with
> > + // the name we need
> > + for (size_t i = 0; i < variable_list->GetSize(); i++) {
> > + VariableSP variable_sp = variable_list->GetVariableAtIndex(i);
> > + if (!variable_sp)
> > + continue;
> > + if (!variable_sp->GetName().IsEmpty())
> > + continue;
> > +
> > + Type *var_type = variable_sp->GetType();
> > + if (!var_type)
> > + continue;
> > +
> > + if (!var_type->GetForwardCompilerType().IsAnonymousType())
> > + continue;
> > + valobj_sp = GetValueObjectForFrameVariable(variable_sp,
> use_dynamic);
> > + if (!valobj_sp)
> > + return valobj_sp;
> > + valobj_sp = valobj_sp->GetChildMemberWithName(name_const_string,
> true);
> > + if (valobj_sp)
> > + break;
> > + }
> > + }
> > +
> > + if (var_sp && !valobj_sp) {
> > + valobj_sp = GetValueObjectForFrameVariable(var_sp, use_dynamic);
> > + if (!valobj_sp)
> > + return valobj_sp;
> > + }
> > + if (!valobj_sp) {
> > + error.SetErrorStringWithFormat("no variable named '%s' found in
> this frame",
> > + name_const_string.GetCString());
> > + return ValueObjectSP();
> > + }
> > +
> > + // We are dumping at least one child
> > + while (separator_idx != std::string::npos) {
> > + // Calculate the next separator index ahead of time
> > + ValueObjectSP child_valobj_sp;
> > + const char separator_type = var_expr[0];
> > + switch (separator_type) {
> > + case '-':
> > + if (var_expr.size() >= 2 && var_expr[1] != '>')
> > + return ValueObjectSP();
> > +
> > + if (no_fragile_ivar) {
> > + // Make sure we aren't trying to deref an objective
> > + // C ivar if this is not allowed
> > + const uint32_t pointer_type_flags =
> > + valobj_sp->GetCompilerType().GetTypeInfo(nullptr);
> > + if ((pointer_type_flags & eTypeIsObjC) &&
> > + (pointer_type_flags & eTypeIsPointer)) {
> > + // This was an objective C object pointer and
> > + // it was requested we skip any fragile ivars
> > + // so return nothing here
> > + return ValueObjectSP();
> > + }
> > + }
> > + var_expr = var_expr.drop_front(); // Remove the '-'
> > + LLVM_FALLTHROUGH;
> > + case '.': {
> > + const bool expr_is_ptr = var_expr[0] == '>';
> > +
> > + var_expr = var_expr.drop_front(); // Remove the '.' or '>'
> > + separator_idx = var_expr.find_first_of(".-[");
> > + ConstString child_name(var_expr.substr(0,
> var_expr.find_first_of(".-[")));
> > +
> > + if (check_ptr_vs_member) {
> > + // We either have a pointer type and need to verify
> > + // valobj_sp is a pointer, or we have a member of a
> > + // class/union/struct being accessed with the . syntax
> > + // and need to verify we don't have a pointer.
> > + const bool actual_is_ptr = valobj_sp->IsPointerType();
> > +
> > + if (actual_is_ptr != expr_is_ptr) {
> > + // Incorrect use of "." with a pointer, or "->" with
> > + // a class/union/struct instance or reference.
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + if (actual_is_ptr)
> > + error.SetErrorStringWithFormat(
> > + "\"%s\" is a pointer and . was used to attempt to
> access "
> > + "\"%s\". Did you mean \"%s->%s\"?",
> > + var_expr_path_strm.GetData(), child_name.GetCString(),
> > + var_expr_path_strm.GetData(), var_expr.str().c_str());
> > + else
> > + error.SetErrorStringWithFormat(
> > + "\"%s\" is not a pointer and -> was used to attempt to "
> > + "access \"%s\". Did you mean \"%s.%s\"?",
> > + var_expr_path_strm.GetData(), child_name.GetCString(),
> > + var_expr_path_strm.GetData(), var_expr.str().c_str());
> > + return ValueObjectSP();
> > }
> > }
> > + child_valobj_sp = valobj_sp->GetChildMemberWithName(child_name,
> true);
> > + if (!child_valobj_sp) {
> > + if (!no_synth_child) {
> > + child_valobj_sp = valobj_sp->GetSyntheticValue();
> > + if (child_valobj_sp)
> > + child_valobj_sp =
> > + child_valobj_sp->GetChildMemberWithName(child_name,
> true);
> > + }
> >
> > - if (!var_sp && (options &
> eExpressionPathOptionsInspectAnonymousUnions)) {
> > - // Check if any anonymous unions are there which contain a
> variable with
> > - // the name we need
> > - for (size_t i = 0; i < variable_list->GetSize(); i++) {
> > - if (VariableSP variable_sp =
> variable_list->GetVariableAtIndex(i)) {
> > - if (variable_sp->GetName().IsEmpty()) {
> > - if (Type *var_type = variable_sp->GetType()) {
> > - if
> (var_type->GetForwardCompilerType().IsAnonymousType()) {
> > - valobj_sp =
> > - GetValueObjectForFrameVariable(variable_sp,
> use_dynamic);
> > - if (!valobj_sp)
> > - return valobj_sp;
> > - valobj_sp = valobj_sp->GetChildMemberWithName(
> > - name_const_string, true);
> > - if (valobj_sp)
> > - break;
> > - }
> > - }
> > + if (no_synth_child || !child_valobj_sp) {
> > + // No child member with name "child_name"
> > + if (synthetically_added_instance_object) {
> > + // We added a "this->" or "self->" to the beginning of the
> > + // expression
> > + // and this is the first pointer ivar access, so just return
> > + // the normal
> > + // error
> > + error.SetErrorStringWithFormat(
> > + "no variable or instance variable named '%s' found in "
> > + "this frame",
> > + name_const_string.GetCString());
> > + } else {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + if (child_name) {
> > + error.SetErrorStringWithFormat(
> > + "\"%s\" is not a member of \"(%s) %s\"",
> > + child_name.GetCString(),
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + } else {
> > + error.SetErrorStringWithFormat(
> > + "incomplete expression path after \"%s\" in \"%s\"",
> > + var_expr_path_strm.GetData(), var_expr_cstr);
> > }
> > }
> > + return ValueObjectSP();
> > }
> > }
> > + synthetically_added_instance_object = false;
> > + // Remove the child name from the path
> > + var_expr = var_expr.drop_front(child_name.GetLength());
> > + if (use_dynamic != eNoDynamicValues) {
> > + ValueObjectSP dynamic_value_sp(
> > + child_valobj_sp->GetDynamicValue(use_dynamic));
> > + if (dynamic_value_sp)
> > + child_valobj_sp = dynamic_value_sp;
> > + }
> > + } break;
> > +
> > + case '[': {
> > + // Array member access, or treating pointer as an array
> > + // Need at least two brackets and a number
> > + if (var_expr.size() <= 2) {
> > + error.SetErrorStringWithFormat(
> > + "invalid square bracket encountered after \"%s\" in \"%s\"",
> > + var_expr_path_strm.GetData(), var_expr.str().c_str());
> > + return ValueObjectSP();
> > + }
> >
> > - if (var_sp && !valobj_sp) {
> > - valobj_sp = GetValueObjectForFrameVariable(var_sp, use_dynamic);
> > - if (!valobj_sp)
> > - return valobj_sp;
> > - }
> > - if (valobj_sp) {
> > - // We are dumping at least one child
> > - while (separator_idx != std::string::npos) {
> > - // Calculate the next separator index ahead of time
> > - ValueObjectSP child_valobj_sp;
> > - const char separator_type = var_path[0];
> > - switch (separator_type) {
> > - case '-':
> > - if (var_path.size() >= 2 && var_path[1] != '>')
> > - return ValueObjectSP();
> > -
> > - if (no_fragile_ivar) {
> > - // Make sure we aren't trying to deref an objective
> > - // C ivar if this is not allowed
> > - const uint32_t pointer_type_flags =
> > - valobj_sp->GetCompilerType().GetTypeInfo(nullptr);
> > - if ((pointer_type_flags & eTypeIsObjC) &&
> > - (pointer_type_flags & eTypeIsPointer)) {
> > - // This was an objective C object pointer and
> > - // it was requested we skip any fragile ivars
> > - // so return nothing here
> > - return ValueObjectSP();
> > - }
> > - }
> > - var_path.erase(0, 1); // Remove the '-'
> > - LLVM_FALLTHROUGH;
> > - case '.': {
> > - const bool expr_is_ptr = var_path[0] == '>';
> > -
> > - var_path.erase(0, 1); // Remove the '.' or '>'
> > - separator_idx = var_path.find_first_of(".-[");
> > - ConstString child_name;
> > - if (separator_idx == std::string::npos)
> > - child_name.SetCString(var_path.c_str());
> > - else
> > - child_name.SetCStringWithLength(var_path.c_str(),
> separator_idx);
> > -
> > - if (check_ptr_vs_member) {
> > - // We either have a pointer type and need to verify
> > - // valobj_sp is a pointer, or we have a member of a
> > - // class/union/struct being accessed with the . syntax
> > - // and need to verify we don't have a pointer.
> > - const bool actual_is_ptr = valobj_sp->IsPointerType();
> > -
> > - if (actual_is_ptr != expr_is_ptr) {
> > - // Incorrect use of "." with a pointer, or "->" with
> > - // a class/union/struct instance or reference.
> > + // Drop the open brace.
> > + var_expr = var_expr.drop_front();
> > + long child_index = 0;
> > +
> > + // If there's no closing brace, this is an invalid expression.
> > + size_t end_pos = var_expr.find_first_of(']');
> > + if (end_pos == llvm::StringRef::npos) {
> > + error.SetErrorStringWithFormat(
> > + "missing closing square bracket in expression \"%s\"",
> > + var_expr_path_strm.GetData());
> > + return ValueObjectSP();
> > + }
> > + llvm::StringRef index_expr = var_expr.take_front(end_pos);
> > + llvm::StringRef original_index_expr = index_expr;
> > + // Drop all of "[index_expr]"
> > + var_expr = var_expr.drop_front(end_pos + 1);
> > +
> > + if (index_expr.consumeInteger(0, child_index)) {
> > + // If there was no integer anywhere in the index expression,
> this is
> > + // erroneous expression.
> > + error.SetErrorStringWithFormat("invalid index expression
> \"%s\"",
> > + index_expr.str().c_str());
> > + return ValueObjectSP();
> > + }
> > +
> > + if (index_expr.empty()) {
> > + // The entire index expression was a single integer.
> > +
> > + if (valobj_sp->GetCompilerType().IsPointerToScalarType() &&
> deref) {
> > + // what we have is *ptr[low]. the most similar C++ syntax is
> to deref
> > + // ptr and extract bit low out of it. reading array item low
> would be
> > + // done by saying ptr[low], without a deref * sign
> > + Error error;
> > + ValueObjectSP temp(valobj_sp->Dereference(error));
> > + if (error.Fail()) {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "could not dereference \"(%s) %s\"",
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + return ValueObjectSP();
> > + }
> > + valobj_sp = temp;
> > + deref = false;
> > + } else if (valobj_sp->GetCompilerType().IsArrayOfScalarType() &&
> > + deref) {
> > + // what we have is *arr[low]. the most similar C++ syntax is
> > + // to get arr[0]
> > + // (an operation that is equivalent to deref-ing arr)
> > + // and extract bit low out of it. reading array item low
> > + // would be done by saying arr[low], without a deref * sign
> > + Error error;
> > + ValueObjectSP temp(valobj_sp->GetChildAtIndex(0, true));
> > + if (error.Fail()) {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "could not get item 0 for \"(%s) %s\"",
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + return ValueObjectSP();
> > + }
> > + valobj_sp = temp;
> > + deref = false;
> > + }
> > +
> > + bool is_incomplete_array = false;
> > + if (valobj_sp->IsPointerType()) {
> > + bool is_objc_pointer = true;
> > +
> > + if (valobj_sp->GetCompilerType().GetMinimumLanguage() !=
> > + eLanguageTypeObjC)
> > + is_objc_pointer = false;
> > + else if (!valobj_sp->GetCompilerType().IsPointerType())
> > + is_objc_pointer = false;
> > +
> > + if (no_synth_child && is_objc_pointer) {
> > + error.SetErrorStringWithFormat(
> > + "\"(%s) %s\" is an Objective-C pointer, and cannot be "
> > + "subscripted",
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > +
> > + return ValueObjectSP();
> > + } else if (is_objc_pointer) {
> > + // dereferencing ObjC variables is not valid.. so let's try
> > + // and recur to synthetic children
> > + ValueObjectSP synthetic = valobj_sp->GetSyntheticValue();
> > + if (!synthetic /* no synthetic */
> > + || synthetic == valobj_sp) /* synthetic is the same as
> > + the original object */
> > + {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "\"(%s) %s\" is not an array type",
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + } else if (
> > + static_cast<uint32_t>(child_index) >=
> > + synthetic
> > + ->GetNumChildren() /* synthetic does not have that
> many values */) {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "array index %ld is not valid for \"(%s) %s\"",
> child_index,
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + } else {
> > + child_valobj_sp = synthetic->GetChildAtIndex(child_index,
> true);
> > + if (!child_valobj_sp) {
> > valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > - if (actual_is_ptr)
> > - error.SetErrorStringWithFormat(
> > - "\"%s\" is a pointer and . was used to attempt to
> access "
> > - "\"%s\". Did you mean \"%s->%s\"?",
> > - var_expr_path_strm.GetData(),
> child_name.GetCString(),
> > - var_expr_path_strm.GetData(), var_path.c_str());
> > - else
> > - error.SetErrorStringWithFormat(
> > - "\"%s\" is not a pointer and -> was used to
> attempt to "
> > - "access \"%s\". Did you mean \"%s.%s\"?",
> > - var_expr_path_strm.GetData(),
> child_name.GetCString(),
> > - var_expr_path_strm.GetData(), var_path.c_str());
> > - return ValueObjectSP();
> > + error.SetErrorStringWithFormat(
> > + "array index %ld is not valid for \"(%s) %s\"",
> child_index,
> > + valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > + var_expr_path_strm.GetData());
> > }
> > }
> > + } else {
> > child_valobj_sp =
> > - valobj_sp->GetChildMemberWithName(child_name, true);
> > + valobj_sp->GetSyntheticArrayMember(child_index, true);
> > if (!child_valobj_sp) {
> > - if (!no_synth_child) {
> > - child_valobj_sp = valobj_sp->GetSyntheticValue();
> > - if (child_valobj_sp)
> > - child_valobj_sp =
> > -
> child_valobj_sp->GetChildMemberWithName(child_name, true);
> > - }
> > -
> > - if (no_synth_child || !child_valobj_sp) {
> > - // No child member with name "child_name"
> > - if (synthetically_added_instance_object) {
> > - // We added a "this->" or "self->" to the beginning
> of the
> > - // expression
> > - // and this is the first pointer ivar access, so just
> return
> > - // the normal
> > - // error
> > - error.SetErrorStringWithFormat(
> > - "no variable or instance variable named '%s'
> found in "
> > - "this frame",
> > - name_const_string.GetCString());
> > - } else {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - if (child_name) {
> > - error.SetErrorStringWithFormat(
> > - "\"%s\" is not a member of \"(%s) %s\"",
> > - child_name.GetCString(),
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - } else {
> > - error.SetErrorStringWithFormat(
> > - "incomplete expression path after \"%s\" in
> \"%s\"",
> > - var_expr_path_strm.GetData(), var_expr_cstr);
> > - }
> > - }
> > - return ValueObjectSP();
> > - }
> > - }
> > - synthetically_added_instance_object = false;
> > - // Remove the child name from the path
> > - var_path.erase(0, child_name.GetLength());
> > - if (use_dynamic != eNoDynamicValues) {
> > - ValueObjectSP dynamic_value_sp(
> > - child_valobj_sp->GetDynamicValue(use_dynamic));
> > - if (dynamic_value_sp)
> > - child_valobj_sp = dynamic_value_sp;
> > - }
> > - } break;
> > -
> > - case '[':
> > - // Array member access, or treating pointer as an array
> > - if (var_path.size() > 2) // Need at least two brackets and
> a number
> > - {
> > - char *end = nullptr;
> > - long child_index = ::strtol(&var_path[1], &end, 0);
> > - if (end && *end == ']' &&
> > - *(end - 1) != '[') // this code forces an error in
> the case of
> > - // arr[]. as bitfield[] is not a
> good
> > - // syntax we're good to go
> > - {
> > - if
> (valobj_sp->GetCompilerType().IsPointerToScalarType() &&
> > - deref) {
> > - // what we have is *ptr[low]. the most similar C++
> syntax is
> > - // to deref ptr
> > - // and extract bit low out of it. reading array item
> low
> > - // would be done by saying ptr[low], without a deref
> * sign
> > - Error error;
> > - ValueObjectSP temp(valobj_sp->Dereference(error));
> > - if (error.Fail()) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "could not dereference \"(%s) %s\"",
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - return ValueObjectSP();
> > - }
> > - valobj_sp = temp;
> > - deref = false;
> > - } else if
> (valobj_sp->GetCompilerType().IsArrayOfScalarType() &&
> > - deref) {
> > - // what we have is *arr[low]. the most similar C++
> syntax is
> > - // to get arr[0]
> > - // (an operation that is equivalent to deref-ing arr)
> > - // and extract bit low out of it. reading array item
> low
> > - // would be done by saying arr[low], without a deref
> * sign
> > - Error error;
> > - ValueObjectSP temp(valobj_sp->GetChildAtIndex(0,
> true));
> > - if (error.Fail()) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "could not get item 0 for \"(%s) %s\"",
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - return ValueObjectSP();
> > - }
> > - valobj_sp = temp;
> > - deref = false;
> > - }
> > -
> > - bool is_incomplete_array = false;
> > - if (valobj_sp->IsPointerType()) {
> > - bool is_objc_pointer = true;
> > -
> > - if (valobj_sp->GetCompilerType().GetMinimumLanguage()
> !=
> > - eLanguageTypeObjC)
> > - is_objc_pointer = false;
> > - else if
> (!valobj_sp->GetCompilerType().IsPointerType())
> > - is_objc_pointer = false;
> > -
> > - if (no_synth_child && is_objc_pointer) {
> > - error.SetErrorStringWithFormat(
> > - "\"(%s) %s\" is an Objective-C pointer, and
> cannot be "
> > - "subscripted",
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > -
> > - return ValueObjectSP();
> > - } else if (is_objc_pointer) {
> > - // dereferencing ObjC variables is not valid.. so
> let's try
> > - // and recur to synthetic children
> > - ValueObjectSP synthetic =
> valobj_sp->GetSyntheticValue();
> > - if (!synthetic /* no synthetic */
> > - || synthetic == valobj_sp) /* synthetic is the
> same as
> > - the original
> object */
> > - {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "\"(%s) %s\" is not an array type",
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - } else if (
> > - static_cast<uint32_t>(child_index) >=
> > - synthetic
> > - ->GetNumChildren() /* synthetic does not
> have that many values */) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "array index %ld is not valid for \"(%s)
> %s\"",
> > - child_index,
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - } else {
> > - child_valobj_sp =
> > - synthetic->GetChildAtIndex(child_index, true);
> > - if (!child_valobj_sp) {
> > -
> valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > - error.SetErrorStringWithFormat(
> > - "array index %ld is not valid for \"(%s)
> %s\"",
> > - child_index,
> valobj_sp->GetTypeName().AsCString(
> > - "<invalid type>"),
> > - var_expr_path_strm.GetData());
> > - }
> > - }
> > - } else {
> > - child_valobj_sp =
> > - valobj_sp->GetSyntheticArrayMember(child_index,
> true);
> > - if (!child_valobj_sp) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "failed to use pointer as array for index %ld
> for "
> > - "\"(%s) %s\"",
> > - child_index,
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - }
> > - }
> > - } else if (valobj_sp->GetCompilerType().IsArrayType(
> > - nullptr, nullptr, &is_incomplete_array))
> {
> > - // Pass false to dynamic_value here so we can tell the
> > - // difference between
> > - // no dynamic value and no member of this type...
> > - child_valobj_sp =
> > - valobj_sp->GetChildAtIndex(child_index, true);
> > - if (!child_valobj_sp &&
> > - (is_incomplete_array || !no_synth_child))
> > - child_valobj_sp =
> > - valobj_sp->GetSyntheticArrayMember(child_index,
> true);
> > -
> > - if (!child_valobj_sp) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "array index %ld is not valid for \"(%s) %s\"",
> > - child_index,
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - }
> > - } else if (valobj_sp->GetCompilerType().IsScalarType())
> {
> > - // this is a bitfield asking to display just one bit
> > - child_valobj_sp =
> valobj_sp->GetSyntheticBitFieldChild(
> > - child_index, child_index, true);
> > - if (!child_valobj_sp) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "bitfield range %ld-%ld is not valid for \"(%s)
> %s\"",
> > - child_index, child_index,
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - }
> > - } else {
> > - ValueObjectSP synthetic =
> valobj_sp->GetSyntheticValue();
> > - if (no_synth_child /* synthetic is forbidden */ ||
> > - !synthetic /* no synthetic */
> > - || synthetic == valobj_sp) /* synthetic is the
> same as the
> > - original object */
> > - {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "\"(%s) %s\" is not an array type",
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - } else if (
> > - static_cast<uint32_t>(child_index) >=
> > - synthetic
> > - ->GetNumChildren() /* synthetic does not have
> that many values */) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "array index %ld is not valid for \"(%s) %s\"",
> > - child_index,
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - } else {
> > - child_valobj_sp =
> > - synthetic->GetChildAtIndex(child_index, true);
> > - if (!child_valobj_sp) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "array index %ld is not valid for \"(%s)
> %s\"",
> > - child_index,
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - }
> > - }
> > - }
> > -
> > - if (!child_valobj_sp) {
> > - // Invalid array index...
> > - return ValueObjectSP();
> > - }
> > -
> > - // Erase the array member specification '[%i]' where
> > - // %i is the array index
> > - var_path.erase(0, (end - var_path.c_str()) + 1);
> > - separator_idx = var_path.find_first_of(".-[");
> > - if (use_dynamic != eNoDynamicValues) {
> > - ValueObjectSP dynamic_value_sp(
> > - child_valobj_sp->GetDynamicValue(use_dynamic));
> > - if (dynamic_value_sp)
> > - child_valobj_sp = dynamic_value_sp;
> > - }
> > - // Break out early from the switch since we were
> > - // able to find the child member
> > - break;
> > - } else if (end && *end == '-') {
> > - // this is most probably a BitField, let's take a look
> > - char *real_end = nullptr;
> > - long final_index = ::strtol(end + 1, &real_end, 0);
> > - bool expand_bitfield = true;
> > - if (real_end && *real_end == ']') {
> > - // if the format given is [high-low], swap range
> > - if (child_index > final_index) {
> > - long temp = child_index;
> > - child_index = final_index;
> > - final_index = temp;
> > - }
> > -
> > - if
> (valobj_sp->GetCompilerType().IsPointerToScalarType() &&
> > - deref) {
> > - // what we have is *ptr[low-high]. the most similar
> C++
> > - // syntax is to deref ptr
> > - // and extract bits low thru high out of it.
> reading array
> > - // items low thru high
> > - // would be done by saying ptr[low-high], without a
> deref *
> > - // sign
> > - Error error;
> > - ValueObjectSP temp(valobj_sp->Dereference(error));
> > - if (error.Fail()) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "could not dereference \"(%s) %s\"",
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - return ValueObjectSP();
> > - }
> > - valobj_sp = temp;
> > - deref = false;
> > - } else if (valobj_sp->GetCompilerType()
> > - .IsArrayOfScalarType() &&
> > - deref) {
> > - // what we have is *arr[low-high]. the most similar
> C++
> > - // syntax is to get arr[0]
> > - // (an operation that is equivalent to deref-ing
> arr)
> > - // and extract bits low thru high out of it.
> reading array
> > - // items low thru high
> > - // would be done by saying arr[low-high], without a
> deref *
> > - // sign
> > - Error error;
> > - ValueObjectSP temp(valobj_sp->GetChildAtIndex(0,
> true));
> > - if (error.Fail()) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "could not get item 0 for \"(%s) %s\"",
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - return ValueObjectSP();
> > - }
> > - valobj_sp = temp;
> > - deref = false;
> > - }
> > - /*else if (valobj_sp->IsArrayType() ||
> > - valobj_sp->IsPointerType())
> > - {
> > - child_valobj_sp =
> > - valobj_sp->GetSyntheticArrayRangeChild(child_index,
> > - final_index, true);
> > - expand_bitfield = false;
> > - if (!child_valobj_sp)
> > - {
> > - valobj_sp->GetExpressionPath
> (var_expr_path_strm,
> > - false);
> > - error.SetErrorStringWithFormat ("array range
> %i-%i is
> > - not valid for \"(%s) %s\"",
> > - child_index,
> > - final_index,
> > -
> valobj_sp->GetTypeName().AsCString("<invalid
> > - type>"),
> > -
> var_expr_path_strm.c_str());
> > - }
> > - }*/
> > -
> > - if (expand_bitfield) {
> > - child_valobj_sp =
> valobj_sp->GetSyntheticBitFieldChild(
> > - child_index, final_index, true);
> > - if (!child_valobj_sp) {
> > - valobj_sp->GetExpressionPath(var_expr_path_strm,
> false);
> > - error.SetErrorStringWithFormat(
> > - "bitfield range %ld-%ld is not valid for
> \"(%s) %s\"",
> > - child_index, final_index,
> > - valobj_sp->GetTypeName().AsCString("<invalid
> type>"),
> > - var_expr_path_strm.GetData());
> > - }
> > - }
> > - }
> > -
> > - if (!child_valobj_sp) {
> > - // Invalid bitfield range...
> > - return ValueObjectSP();
> > - }
> > -
> > - // Erase the bitfield member specification '[%i-%i]'
> where
> > - // %i is the index
> > - var_path.erase(0, (real_end - var_path.c_str()) + 1);
> > - separator_idx = var_path.find_first_of(".-[");
> > - if (use_dynamic != eNoDynamicValues) {
> > - ValueObjectSP dynamic_value_sp(
> > - child_valobj_sp->GetDynamicValue(use_dynamic));
> > - if (dynamic_value_sp)
> > - child_valobj_sp = dynamic_value_sp;
> > - }
> > - // Break out early from the switch since we were
> > - // able to find the child member
> > - break;
> > - }
> > - } else {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > error.SetErrorStringWithFormat(
> > - "invalid square bracket encountered after \"%s\" in
> \"%s\"",
> > - var_expr_path_strm.GetData(), var_path.c_str());
> > + "failed to use pointer as array for index %ld for "
> > + "\"(%s) %s\"",
> > + child_index,
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > }
> > - return ValueObjectSP();
> > + }
> > + } else if (valobj_sp->GetCompilerType().IsArrayType(
> > + nullptr, nullptr, &is_incomplete_array)) {
> > + // Pass false to dynamic_value here so we can tell the
> > + // difference between
> > + // no dynamic value and no member of this type...
> > + child_valobj_sp = valobj_sp->GetChildAtIndex(child_index,
> true);
> > + if (!child_valobj_sp && (is_incomplete_array ||
> !no_synth_child))
> > + child_valobj_sp =
> > + valobj_sp->GetSyntheticArrayMember(child_index, true);
> >
> > - default:
> > - // Failure...
> > - {
> > + if (!child_valobj_sp) {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "array index %ld is not valid for \"(%s) %s\"",
> child_index,
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + }
> > + } else if (valobj_sp->GetCompilerType().IsScalarType()) {
> > + // this is a bitfield asking to display just one bit
> > + child_valobj_sp = valobj_sp->GetSyntheticBitFieldChild(
> > + child_index, child_index, true);
> > + if (!child_valobj_sp) {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "bitfield range %ld-%ld is not valid for \"(%s) %s\"",
> > + child_index, child_index,
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + }
> > + } else {
> > + ValueObjectSP synthetic = valobj_sp->GetSyntheticValue();
> > + if (no_synth_child /* synthetic is forbidden */ ||
> > + !synthetic /* no synthetic */
> > + || synthetic == valobj_sp) /* synthetic is the same as the
> > + original object */
> > + {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "\"(%s) %s\" is not an array type",
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + } else if (
> > + static_cast<uint32_t>(child_index) >=
> > + synthetic
> > + ->GetNumChildren() /* synthetic does not have that
> many values */) {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "array index %ld is not valid for \"(%s) %s\"",
> child_index,
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + } else {
> > + child_valobj_sp = synthetic->GetChildAtIndex(child_index,
> true);
> > + if (!child_valobj_sp) {
> > valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > error.SetErrorStringWithFormat(
> > - "unexpected char '%c' encountered after \"%s\" in
> \"%s\"",
> > - separator_type, var_expr_path_strm.GetData(),
> > - var_path.c_str());
> > -
> > - return ValueObjectSP();
> > + "array index %ld is not valid for \"(%s) %s\"",
> child_index,
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > }
> > }
> > -
> > - if (child_valobj_sp)
> > - valobj_sp = child_valobj_sp;
> > -
> > - if (var_path.empty())
> > - break;
> > - }
> > - if (valobj_sp) {
> > - if (deref) {
> > - ValueObjectSP
> deref_valobj_sp(valobj_sp->Dereference(error));
> > - valobj_sp = deref_valobj_sp;
> > - } else if (address_of) {
> > - ValueObjectSP
> address_of_valobj_sp(valobj_sp->AddressOf(error));
> > - valobj_sp = address_of_valobj_sp;
> > - }
> > }
> > - return valobj_sp;
> > - } else {
> > +
> > + if (!child_valobj_sp) {
> > + // Invalid array index...
> > + return ValueObjectSP();
> > + }
> > +
> > + separator_idx = var_expr.find_first_of(".-[");
> > + if (use_dynamic != eNoDynamicValues) {
> > + ValueObjectSP dynamic_value_sp(
> > + child_valobj_sp->GetDynamicValue(use_dynamic));
> > + if (dynamic_value_sp)
> > + child_valobj_sp = dynamic_value_sp;
> > + }
> > + // Break out early from the switch since we were able to find
> the child
> > + // member
> > + break;
> > + }
> > +
> > + // this is most probably a BitField, let's take a look
> > + if (index_expr.front() != '-') {
> > + error.SetErrorStringWithFormat("invalid range expression
> \"'%s'\"",
> > +
> original_index_expr.str().c_str());
> > + return ValueObjectSP();
> > + }
> > +
> > + index_expr.drop_front();
> > + long final_index = 0;
> > + if (index_expr.getAsInteger(0, final_index)) {
> > + error.SetErrorStringWithFormat("invalid range expression
> \"'%s'\"",
> > +
> original_index_expr.str().c_str());
> > + return ValueObjectSP();
> > + }
> > +
> > + // if the format given is [high-low], swap range
> > + if (child_index > final_index) {
> > + long temp = child_index;
> > + child_index = final_index;
> > + final_index = temp;
> > + }
> > +
> > + if (valobj_sp->GetCompilerType().IsPointerToScalarType() &&
> deref) {
> > + // what we have is *ptr[low-high]. the most similar C++ syntax
> is to
> > + // deref ptr and extract bits low thru high out of it. reading
> array
> > + // items low thru high would be done by saying ptr[low-high],
> without
> > + // a deref * sign
> > + Error error;
> > + ValueObjectSP temp(valobj_sp->Dereference(error));
> > + if (error.Fail()) {
> > + valobj_sp->GetExpressionPath(var_expr_path_strm, false);
> > + error.SetErrorStringWithFormat(
> > + "could not dereference \"(%s) %s\"",
> > + valobj_sp->GetTypeName().AsCString("<invalid type>"),
> > + var_expr_path_strm.GetData());
> > + return ValueObjectSP();
> > + }
> > + valobj_sp = temp;
> > + deref = false;
> > + } else if (valobj_sp->GetCompilerType().
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20161117/509c067b/attachment-0001.html>
More information about the lldb-commits
mailing list