From d2daca770b4bd45e83da9e16413f952179bf228d Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Fri, 18 Nov 2016 17:55:04 +0000 Subject: [PATCH] Resubmit "Remove an output-parameter from Variable function". The scanning algorithm had a few little subtleties that I overlooked, but this patch should fix everything. I still haven't changed the function to take a StringRef since that has some trickle down effect and is mostly mechanical, I just wanted to get the tricky part as isolated as possible. llvm-svn: 287354 --- lldb/include/lldb/Core/ValueObject.h | 5 +- lldb/source/Core/FormatEntity.cpp | 36 ++--- lldb/source/Core/ValueObject.cpp | 186 +++++++++------------- lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp | 22 +-- lldb/source/Symbol/Variable.cpp | 6 +- 5 files changed, 108 insertions(+), 147 deletions(-) diff --git a/lldb/include/lldb/Core/ValueObject.h b/lldb/include/lldb/Core/ValueObject.h index 8260862..da7c7db 100644 --- a/lldb/include/lldb/Core/ValueObject.h +++ b/lldb/include/lldb/Core/ValueObject.h @@ -394,7 +394,7 @@ public: GetExpressionPathFormat = eGetExpressionPathFormatDereferencePointers); lldb::ValueObjectSP GetValueForExpressionPath( - const char *expression, const char **first_unparsed = nullptr, + const char *expression, ExpressionPathScanEndReason *reason_to_stop = nullptr, ExpressionPathEndResultType *final_value_type = nullptr, const GetValueForExpressionPathOptions &options = @@ -1002,8 +1002,7 @@ private: virtual CompilerType MaybeCalculateCompleteType(); lldb::ValueObjectSP GetValueForExpressionPath_Impl( - const char *expression_cstr, const char **first_unparsed, - ExpressionPathScanEndReason *reason_to_stop, + const char *expression_cstr, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target); diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp index 4d85c36..08166d2 100644 --- a/lldb/source/Core/FormatEntity.cpp +++ b/lldb/source/Core/FormatEntity.cpp @@ -614,7 +614,6 @@ static ValueObjectSP ExpandIndexedExpression(ValueObject *valobj, size_t index, if (log) log->Printf("[ExpandIndexedExpression] name to deref: %s", ptr_deref_buffer.c_str()); - const char *first_unparsed; ValueObject::GetValueForExpressionPathOptions options; ValueObject::ExpressionPathEndResultType final_value_type; ValueObject::ExpressionPathScanEndReason reason_to_stop; @@ -622,20 +621,18 @@ static ValueObjectSP ExpandIndexedExpression(ValueObject *valobj, size_t index, (deref_pointer ? ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); ValueObjectSP item = valobj->GetValueForExpressionPath( - ptr_deref_buffer.c_str(), &first_unparsed, &reason_to_stop, - &final_value_type, options, &what_next); + ptr_deref_buffer.c_str(), &reason_to_stop, &final_value_type, options, + &what_next); if (!item) { if (log) - log->Printf("[ExpandIndexedExpression] ERROR: unparsed portion = %s, why " - "stopping = %d," + log->Printf("[ExpandIndexedExpression] ERROR: why stopping = %d," " final_value_type %d", - first_unparsed, reason_to_stop, final_value_type); + reason_to_stop, final_value_type); } else { if (log) - log->Printf("[ExpandIndexedExpression] ALL RIGHT: unparsed portion = %s, " - "why stopping = %d," + log->Printf("[ExpandIndexedExpression] ALL RIGHT: why stopping = %d," " final_value_type %d", - first_unparsed, reason_to_stop, final_value_type); + reason_to_stop, final_value_type); } return item; } @@ -724,7 +721,6 @@ static bool DumpValue(Stream &s, const SymbolContext *sc, int64_t index_lower = -1; int64_t index_higher = -1; bool is_array_range = false; - const char *first_unparsed; bool was_plain_var = false; bool was_var_format = false; bool was_var_indexed = false; @@ -762,25 +758,23 @@ static bool DumpValue(Stream &s, const SymbolContext *sc, log->Printf("[Debugger::FormatPrompt] symbol to expand: %s", expr_path.c_str()); - target = valobj - ->GetValueForExpressionPath(expr_path.c_str(), &first_unparsed, - &reason_to_stop, &final_value_type, - options, &what_next) - .get(); + target = + valobj + ->GetValueForExpressionPath(expr_path.c_str(), &reason_to_stop, + &final_value_type, options, &what_next) + .get(); if (!target) { if (log) - log->Printf("[Debugger::FormatPrompt] ERROR: unparsed portion = %s, " - "why stopping = %d," + log->Printf("[Debugger::FormatPrompt] ERROR: why stopping = %d," " final_value_type %d", - first_unparsed, reason_to_stop, final_value_type); + reason_to_stop, final_value_type); return false; } else { if (log) - log->Printf("[Debugger::FormatPrompt] ALL RIGHT: unparsed portion = " - "%s, why stopping = %d," + log->Printf("[Debugger::FormatPrompt] ALL RIGHT: why stopping = %d," " final_value_type %d", - first_unparsed, reason_to_stop, final_value_type); + reason_to_stop, final_value_type); target = target ->GetQualifiedRepresentationIfAvailable( target->GetDynamicValueType(), true) diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 46cccc5..75749e7 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -1922,7 +1922,7 @@ ValueObject::GetSyntheticExpressionPathChild(const char *expression, // We haven't made a synthetic array member for expression yet, so // lets make one and cache it for any future reference. synthetic_child_sp = GetValueForExpressionPath( - expression, NULL, NULL, NULL, + expression, NULL, NULL, GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal( GetValueForExpressionPathOptions::SyntheticChildrenTraversal:: None)); @@ -2166,13 +2166,11 @@ void ValueObject::GetExpressionPath(Stream &s, bool qualify_cxx_base_classes, } ValueObjectSP ValueObject::GetValueForExpressionPath( - const char *expression, const char **first_unparsed, - ExpressionPathScanEndReason *reason_to_stop, + const char *expression, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target) { - const char *dummy_first_unparsed; ExpressionPathScanEndReason dummy_reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnknown; ExpressionPathEndResultType dummy_final_value_type = @@ -2181,8 +2179,7 @@ ValueObjectSP ValueObject::GetValueForExpressionPath( ValueObject::eExpressionPathAftermathNothing; ValueObjectSP ret_val = GetValueForExpressionPath_Impl( - expression, first_unparsed ? first_unparsed : &dummy_first_unparsed, - reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, + expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, final_value_type ? final_value_type : &dummy_final_value_type, options, final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); @@ -2237,8 +2234,7 @@ ValueObjectSP ValueObject::GetValueForExpressionPath( } ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( - const char *expression_cstr, const char **first_unparsed, - ExpressionPathScanEndReason *reason_to_stop, + const char *expression_cstr2, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_result, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *what_next) { @@ -2247,12 +2243,10 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( if (!root.get()) return ValueObjectSP(); - *first_unparsed = expression_cstr; + llvm::StringRef remainder(expression_cstr2); while (true) { - - const char *expression_cstr = - *first_unparsed; // hide the top level expression_cstr + llvm::StringRef temp_expression = remainder; CompilerType root_compiler_type = root->GetCompilerType(); CompilerType pointee_compiler_type; @@ -2263,20 +2257,20 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( if (pointee_compiler_type) pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo()); - if (!expression_cstr || *expression_cstr == '\0') { + if (temp_expression.empty()) { *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; return root; } - switch (*expression_cstr) { + switch (temp_expression.front()) { case '-': { + temp_expression = temp_expression.drop_front(); if (options.m_check_dot_vs_arrow_syntax && root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to // use -> on a // non-pointer and I // must catch the error { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2287,48 +2281,46 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( // when this is forbidden root_compiler_type_info.Test(eTypeIsPointer) && options.m_no_fragile_ivar) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; return ValueObjectSP(); } - if (expression_cstr[1] != '>') { - *first_unparsed = expression_cstr; + if (!temp_expression.startswith(">")) { *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; return ValueObjectSP(); } - expression_cstr++; // skip the - } LLVM_FALLTHROUGH; case '.': // or fallthrough from -> { - if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' && + if (options.m_check_dot_vs_arrow_syntax && + temp_expression.front() == '.' && root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to // use . on a pointer // and I must catch the // error { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } - expression_cstr++; // skip . - const char *next_separator = strpbrk(expression_cstr + 1, "-.["); + temp_expression = temp_expression.drop_front(); // skip . or > + + size_t next_sep_pos = temp_expression.find_first_of("-.[", 1); ConstString child_name; - if (!next_separator) // if no other separator just expand this last layer + if (next_sep_pos == llvm::StringRef::npos) // if no other separator just + // expand this last layer { - child_name.SetCString(expression_cstr); + child_name.SetString(temp_expression); ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); if (child_valobj_sp.get()) // we know we are done, so just return { - *first_unparsed = ""; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; *final_result = ValueObject::eExpressionPathEndResultTypePlain; @@ -2378,28 +2370,28 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( // so we hit the "else" branch, and return an error if (child_valobj_sp.get()) // if it worked, just return { - *first_unparsed = ""; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; *final_result = ValueObject::eExpressionPathEndResultTypePlain; return child_valobj_sp; } else { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } } else // other layers do expand { - child_name.SetCStringWithLength(expression_cstr, - next_separator - expression_cstr); + llvm::StringRef next_separator = temp_expression.substr(next_sep_pos); + + child_name.SetString(temp_expression.slice(0, next_sep_pos)); + ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); if (child_valobj_sp.get()) // store the new root and move on { root = child_valobj_sp; - *first_unparsed = next_separator; + remainder = next_separator; *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } else { @@ -2448,15 +2440,14 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( if (child_valobj_sp.get()) // if it worked, move on { root = child_valobj_sp; - *first_unparsed = next_separator; + remainder = next_separator; *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } else { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } } break; @@ -2474,7 +2465,6 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( GetValueForExpressionPathOptions::SyntheticChildrenTraversal:: None) // ...only chance left is synthetic { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2484,26 +2474,23 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( // check that we can // expand bitfields { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; return ValueObjectSP(); } } - if (*(expression_cstr + 1) == + if (temp_expression[1] == ']') // if this is an unbounded range it only works for arrays { if (!root_compiler_type_info.Test(eTypeIsArray)) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } else // even if something follows, we cannot expand unbounded ranges, // just let the caller do it { - *first_unparsed = expression_cstr + 2; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; *final_result = @@ -2511,32 +2498,36 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( return root; } } - const char *separator_position = ::strchr(expression_cstr + 1, '-'); - const char *close_bracket_position = ::strchr(expression_cstr + 1, ']'); - if (!close_bracket_position) // if there is no ], this is a syntax error + + size_t close_bracket_position = temp_expression.find(']', 1); + if (close_bracket_position == + llvm::StringRef::npos) // if there is no ], this is a syntax error { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } - if (!separator_position || separator_position > close_bracket_position) { + llvm::StringRef bracket_expr = + temp_expression.slice(1, close_bracket_position); + + // If this was an empty expression it would have been caught by the if + // above. + assert(!bracket_expr.empty()); + + if (!bracket_expr.contains('-')) { // if no separator, this is of the form [N]. Note that this cannot // be an unbounded range of the form [], because that case was handled // above with an unconditional return. - char *end = NULL; - unsigned long index = ::strtoul(expression_cstr + 1, &end, 0); - if (end != close_bracket_position) // if something weird is in - // our way return an error - { - *first_unparsed = expression_cstr; + unsigned long index = 0; + if (bracket_expr.getAsInteger(0, index)) { *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } + // from here on we do have a valid index if (root_compiler_type_info.Test(eTypeIsArray)) { ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true); @@ -2549,15 +2540,15 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( root->GetSyntheticValue()->GetChildAtIndex(index, true); if (child_valobj_sp) { root = child_valobj_sp; - *first_unparsed = end + 1; // skip ] + remainder = + temp_expression.substr(close_bracket_position + 1); // skip ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } else { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } } else if (root_compiler_type_info.Test(eTypeIsPointer)) { if (*what_next == @@ -2575,11 +2566,10 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( Error error; root = root->Dereference(error); if (error.Fail() || !root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } else { *what_next = eExpressionPathAftermathNothing; continue; @@ -2599,13 +2589,13 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( } else root = root->GetSyntheticArrayMember(index, true); if (!root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } else { - *first_unparsed = end + 1; // skip ] + remainder = + temp_expression.substr(close_bracket_position + 1); // skip ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } @@ -2613,15 +2603,13 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( } else if (root_compiler_type_info.Test(eTypeIsScalar)) { root = root->GetSyntheticBitFieldChild(index, index, true); if (!root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } else // we do not know how to expand members of bitfields, so we // just return and let the caller do any further processing { - *first_unparsed = end + 1; // skip ] *reason_to_stop = ValueObject:: eExpressionPathScanEndReasonBitfieldRangeOperatorMet; *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; @@ -2630,13 +2618,13 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( } else if (root_compiler_type_info.Test(eTypeIsVector)) { root = root->GetChildAtIndex(index, true); if (!root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; return ValueObjectSP(); } else { - *first_unparsed = end + 1; // skip ] + remainder = + temp_expression.substr(close_bracket_position + 1); // skip ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } @@ -2649,80 +2637,64 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( if (root->HasSyntheticValue()) root = root->GetSyntheticValue(); else if (!root->IsSynthetic()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } // if we are here, then root itself is a synthetic VO.. should be good // to go if (!root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } root = root->GetChildAtIndex(index, true); if (!root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } else { - *first_unparsed = end + 1; // skip ] + remainder = + temp_expression.substr(close_bracket_position + 1); // skip ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } } else { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); - } - } else // we have a low and a high index - { - char *end = NULL; - unsigned long index_lower = ::strtoul(expression_cstr + 1, &end, 0); - if (end != separator_position) // if something weird is in our - // way return an error - { - *first_unparsed = expression_cstr; - *reason_to_stop = - ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; - *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } - unsigned long index_higher = ::strtoul(separator_position + 1, &end, 0); - if (end != close_bracket_position) // if something weird is in - // our way return an error - { - *first_unparsed = expression_cstr; + } else { + // we have a low and a high index + llvm::StringRef sleft, sright; + unsigned long low_index, high_index; + std::tie(sleft, sright) = bracket_expr.split('-'); + if (sleft.getAsInteger(0, low_index) || + sright.getAsInteger(0, high_index)) { *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } - if (index_lower > index_higher) // swap indices if required - std::swap(index_lower, index_higher); + + if (low_index > high_index) // swap indices if required + std::swap(low_index, high_index); if (root_compiler_type_info.Test( eTypeIsScalar)) // expansion only works for scalars { - root = - root->GetSyntheticBitFieldChild(index_lower, index_higher, true); + root = root->GetSyntheticBitFieldChild(low_index, high_index, true); if (!root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } else { - *first_unparsed = end + 1; // skip ] *reason_to_stop = ValueObject:: eExpressionPathScanEndReasonBitfieldRangeOperatorMet; *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; @@ -2739,17 +2711,15 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( Error error; root = root->Dereference(error); if (error.Fail() || !root.get()) { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); + return nullptr; } else { *what_next = ValueObject::eExpressionPathAftermathNothing; continue; } } else { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange; @@ -2760,12 +2730,10 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( } default: // some non-separator is in the way { - *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; - return ValueObjectSP(); - break; + return nullptr; } } } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index 82f1a5d..82441a6 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -280,7 +280,7 @@ bool lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::Update() { // die and free their memory m_pair_ptr = valobj_sp ->GetValueForExpressionPath( - ".__i_.__ptr_->__value_", nullptr, nullptr, nullptr, + ".__i_.__ptr_->__value_", nullptr, nullptr, ValueObject::GetValueForExpressionPathOptions() .DontCheckDotVsArrowSyntax() .SetSyntheticChildrenTraversal( @@ -288,16 +288,18 @@ bool lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::Update() { SyntheticChildrenTraversal::None), nullptr) .get(); - + if (!m_pair_ptr) { - m_pair_ptr = valobj_sp->GetValueForExpressionPath(".__i_.__ptr_", nullptr, nullptr, nullptr, - ValueObject::GetValueForExpressionPathOptions() - .DontCheckDotVsArrowSyntax() - .SetSyntheticChildrenTraversal( - ValueObject::GetValueForExpressionPathOptions:: - SyntheticChildrenTraversal::None), - nullptr) - .get(); + m_pair_ptr = valobj_sp + ->GetValueForExpressionPath( + ".__i_.__ptr_", nullptr, nullptr, + ValueObject::GetValueForExpressionPathOptions() + .DontCheckDotVsArrowSyntax() + .SetSyntheticChildrenTraversal( + ValueObject::GetValueForExpressionPathOptions:: + SyntheticChildrenTraversal::None), + nullptr) + .get(); if (m_pair_ptr) { auto __i_(valobj_sp->GetChildMemberWithName(g___i_, true)); lldb::TemplateArgumentKind kind; diff --git a/lldb/source/Symbol/Variable.cpp b/lldb/source/Symbol/Variable.cpp index 9a99b8f..90d77e9 100644 --- a/lldb/source/Symbol/Variable.cpp +++ b/lldb/source/Symbol/Variable.cpp @@ -404,16 +404,14 @@ Error Variable::GetValuesForVariableExpressionPath( const char *variable_sub_expr_path = variable_expr_path + variable_name.size(); if (*variable_sub_expr_path) { - const char *first_unparsed = nullptr; ValueObject::ExpressionPathScanEndReason reason_to_stop; ValueObject::ExpressionPathEndResultType final_value_type; ValueObject::GetValueForExpressionPathOptions options; ValueObject::ExpressionPathAftermath final_task_on_target; valobj_sp = variable_valobj_sp->GetValueForExpressionPath( - variable_sub_expr_path, &first_unparsed, - &reason_to_stop, &final_value_type, options, - &final_task_on_target); + variable_sub_expr_path, &reason_to_stop, + &final_value_type, options, &final_task_on_target); if (!valobj_sp) { error.SetErrorStringWithFormat( "invalid expression path '%s' for variable '%s'", -- 2.7.4