Author: zturner Date: Fri Nov 18 00:34:45 2016 New Revision: 287320 URL: http://llvm.org/viewvc/llvm-project?rev=287320&view=rev Log: Revert "Remove an out param from ValueObject::GetValueForExpressionPath."
This reverts commit r287315, as it introduces a bug that breaks many things. Modified: lldb/trunk/include/lldb/Core/ValueObject.h lldb/trunk/source/Core/FormatEntity.cpp lldb/trunk/source/Core/ValueObject.cpp lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp lldb/trunk/source/Symbol/Variable.cpp Modified: lldb/trunk/include/lldb/Core/ValueObject.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=287320&r1=287319&r2=287320&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObject.h (original) +++ lldb/trunk/include/lldb/Core/ValueObject.h Fri Nov 18 00:34:45 2016 @@ -394,7 +394,7 @@ public: GetExpressionPathFormat = eGetExpressionPathFormatDereferencePointers); lldb::ValueObjectSP GetValueForExpressionPath( - const char *expression, + const char *expression, const char **first_unparsed = nullptr, ExpressionPathScanEndReason *reason_to_stop = nullptr, ExpressionPathEndResultType *final_value_type = nullptr, const GetValueForExpressionPathOptions &options = @@ -1002,7 +1002,8 @@ private: virtual CompilerType MaybeCalculateCompleteType(); lldb::ValueObjectSP GetValueForExpressionPath_Impl( - const char *expression_cstr, ExpressionPathScanEndReason *reason_to_stop, + const char *expression_cstr, const char **first_unparsed, + ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target); Modified: lldb/trunk/source/Core/FormatEntity.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatEntity.cpp?rev=287320&r1=287319&r2=287320&view=diff ============================================================================== --- lldb/trunk/source/Core/FormatEntity.cpp (original) +++ lldb/trunk/source/Core/FormatEntity.cpp Fri Nov 18 00:34:45 2016 @@ -614,6 +614,7 @@ static ValueObjectSP ExpandIndexedExpres 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; @@ -621,18 +622,20 @@ static ValueObjectSP ExpandIndexedExpres (deref_pointer ? ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); ValueObjectSP item = valobj->GetValueForExpressionPath( - ptr_deref_buffer.c_str(), &reason_to_stop, &final_value_type, options, - &what_next); + ptr_deref_buffer.c_str(), &first_unparsed, &reason_to_stop, + &final_value_type, options, &what_next); if (!item) { if (log) - log->Printf("[ExpandIndexedExpression] ERROR: why stopping = %d," + log->Printf("[ExpandIndexedExpression] ERROR: unparsed portion = %s, why " + "stopping = %d," " final_value_type %d", - reason_to_stop, final_value_type); + first_unparsed, reason_to_stop, final_value_type); } else { if (log) - log->Printf("[ExpandIndexedExpression] ALL RIGHT: why stopping = %d, " - "final_value_type %d", - reason_to_stop, final_value_type); + log->Printf("[ExpandIndexedExpression] ALL RIGHT: unparsed portion = %s, " + "why stopping = %d," + " final_value_type %d", + first_unparsed, reason_to_stop, final_value_type); } return item; } @@ -721,6 +724,7 @@ static bool DumpValue(Stream &s, const S 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; @@ -758,23 +762,25 @@ static bool DumpValue(Stream &s, const S log->Printf("[Debugger::FormatPrompt] symbol to expand: %s", expr_path.c_str()); - target = - valobj - ->GetValueForExpressionPath(expr_path.c_str(), &reason_to_stop, - &final_value_type, options, &what_next) - .get(); + target = valobj + ->GetValueForExpressionPath(expr_path.c_str(), &first_unparsed, + &reason_to_stop, &final_value_type, + options, &what_next) + .get(); if (!target) { if (log) - log->Printf("[Debugger::FormatPrompt] ERROR: expr = %s, " - "why stopping = %d, final_value_type %d", - expr_path.c_str(), reason_to_stop, final_value_type); + log->Printf("[Debugger::FormatPrompt] ERROR: unparsed portion = %s, " + "why stopping = %d," + " final_value_type %d", + first_unparsed, reason_to_stop, final_value_type); return false; } else { if (log) - log->Printf("[Debugger::FormatPrompt] ALL RIGHT: expr = %s, " - "why stopping = %d, final_value_type %d", - expr_path.c_str(), reason_to_stop, final_value_type); + log->Printf("[Debugger::FormatPrompt] ALL RIGHT: unparsed portion = " + "%s, why stopping = %d," + " final_value_type %d", + first_unparsed, reason_to_stop, final_value_type); target = target ->GetQualifiedRepresentationIfAvailable( target->GetDynamicValueType(), true) Modified: lldb/trunk/source/Core/ValueObject.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=287320&r1=287319&r2=287320&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObject.cpp (original) +++ lldb/trunk/source/Core/ValueObject.cpp Fri Nov 18 00:34:45 2016 @@ -1922,7 +1922,7 @@ ValueObject::GetSyntheticExpressionPathC // 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, nullptr, nullptr, + expression, NULL, NULL, NULL, GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal( GetValueForExpressionPathOptions::SyntheticChildrenTraversal:: None)); @@ -2166,11 +2166,13 @@ void ValueObject::GetExpressionPath(Stre } ValueObjectSP ValueObject::GetValueForExpressionPath( - const char *expression, ExpressionPathScanEndReason *reason_to_stop, + const char *expression, const char **first_unparsed, + 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 = @@ -2179,7 +2181,8 @@ ValueObjectSP ValueObject::GetValueForEx ValueObject::eExpressionPathAftermathNothing; ValueObjectSP ret_val = GetValueForExpressionPath_Impl( - expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, + expression, first_unparsed ? first_unparsed : &dummy_first_unparsed, + 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); @@ -2234,7 +2237,8 @@ ValueObjectSP ValueObject::GetValueForEx } ValueObjectSP ValueObject::GetValueForExpressionPath_Impl( - const char *expression_cstr, ExpressionPathScanEndReason *reason_to_stop, + const char *expression_cstr, const char **first_unparsed, + ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_result, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *what_next) { @@ -2243,8 +2247,13 @@ ValueObjectSP ValueObject::GetValueForEx if (!root.get()) return ValueObjectSP(); + *first_unparsed = expression_cstr; + while (true) { + const char *expression_cstr = + *first_unparsed; // hide the top level expression_cstr + CompilerType root_compiler_type = root->GetCompilerType(); CompilerType pointee_compiler_type; Flags pointee_compiler_type_info; @@ -2267,6 +2276,7 @@ ValueObjectSP ValueObject::GetValueForEx // non-pointer and I // must catch the error { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2277,12 +2287,14 @@ ValueObjectSP ValueObject::GetValueForEx // 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; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2299,6 +2311,7 @@ ValueObjectSP ValueObject::GetValueForEx // and I must catch the // error { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2315,6 +2328,7 @@ ValueObjectSP ValueObject::GetValueForEx if (child_valobj_sp.get()) // we know we are done, so just return { + *first_unparsed = ""; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; *final_result = ValueObject::eExpressionPathEndResultTypePlain; @@ -2364,11 +2378,13 @@ ValueObjectSP ValueObject::GetValueForEx // 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; @@ -2383,6 +2399,7 @@ ValueObjectSP ValueObject::GetValueForEx if (child_valobj_sp.get()) // store the new root and move on { root = child_valobj_sp; + *first_unparsed = next_separator; *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } else { @@ -2431,9 +2448,11 @@ ValueObjectSP ValueObject::GetValueForEx if (child_valobj_sp.get()) // if it worked, move on { root = child_valobj_sp; + *first_unparsed = next_separator; *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } else { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2455,6 +2474,7 @@ ValueObjectSP ValueObject::GetValueForEx GetValueForExpressionPathOptions::SyntheticChildrenTraversal:: None) // ...only chance left is synthetic { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2464,6 +2484,7 @@ ValueObjectSP ValueObject::GetValueForEx // check that we can // expand bitfields { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2474,6 +2495,7 @@ ValueObjectSP ValueObject::GetValueForEx ']') // 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; @@ -2481,6 +2503,7 @@ ValueObjectSP ValueObject::GetValueForEx } 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 = @@ -2492,6 +2515,7 @@ ValueObjectSP ValueObject::GetValueForEx const char *close_bracket_position = ::strchr(expression_cstr + 1, ']'); if (!close_bracket_position) // if there is no ], this is a syntax error { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2507,6 +2531,7 @@ ValueObjectSP ValueObject::GetValueForEx if (end != close_bracket_position) // if something weird is in // our way return an error { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2524,9 +2549,11 @@ ValueObjectSP ValueObject::GetValueForEx root->GetSyntheticValue()->GetChildAtIndex(index, true); if (child_valobj_sp) { root = child_valobj_sp; + *first_unparsed = end + 1; // skip ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } else { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2548,6 +2575,7 @@ ValueObjectSP ValueObject::GetValueForEx Error error; root = root->Dereference(error); if (error.Fail() || !root.get()) { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2571,11 +2599,13 @@ ValueObjectSP ValueObject::GetValueForEx } else root = root->GetSyntheticArrayMember(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 ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } @@ -2583,6 +2613,7 @@ ValueObjectSP ValueObject::GetValueForEx } 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; @@ -2590,6 +2621,7 @@ ValueObjectSP ValueObject::GetValueForEx } 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; @@ -2598,11 +2630,13 @@ ValueObjectSP ValueObject::GetValueForEx } 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 ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } @@ -2615,6 +2649,7 @@ ValueObjectSP ValueObject::GetValueForEx if (root->HasSyntheticValue()) root = root->GetSyntheticValue(); else if (!root->IsSynthetic()) { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2624,6 +2659,7 @@ ValueObjectSP ValueObject::GetValueForEx // to go if (!root.get()) { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2631,15 +2667,18 @@ ValueObjectSP ValueObject::GetValueForEx } 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 ] *final_result = ValueObject::eExpressionPathEndResultTypePlain; continue; } } else { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2652,6 +2691,7 @@ ValueObjectSP ValueObject::GetValueForEx 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; @@ -2661,6 +2701,7 @@ ValueObjectSP ValueObject::GetValueForEx if (end != close_bracket_position) // if something weird is in // our way return an error { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2675,11 +2716,13 @@ ValueObjectSP ValueObject::GetValueForEx root = root->GetSyntheticBitFieldChild(index_lower, index_higher, 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 ] *reason_to_stop = ValueObject:: eExpressionPathScanEndReasonBitfieldRangeOperatorMet; *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; @@ -2696,6 +2739,7 @@ ValueObjectSP ValueObject::GetValueForEx Error error; root = root->Dereference(error); if (error.Fail() || !root.get()) { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; @@ -2705,6 +2749,7 @@ ValueObjectSP ValueObject::GetValueForEx continue; } } else { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange; @@ -2715,6 +2760,7 @@ ValueObjectSP ValueObject::GetValueForEx } default: // some non-separator is in the way { + *first_unparsed = expression_cstr; *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp?rev=287320&r1=287319&r2=287320&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp (original) +++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp Fri Nov 18 00:34:45 2016 @@ -280,7 +280,7 @@ bool lldb_private::formatters::LibCxxMap // die and free their memory m_pair_ptr = valobj_sp ->GetValueForExpressionPath( - ".__i_.__ptr_->__value_", nullptr, nullptr, + ".__i_.__ptr_->__value_", nullptr, nullptr, nullptr, ValueObject::GetValueForExpressionPathOptions() .DontCheckDotVsArrowSyntax() .SetSyntheticChildrenTraversal( @@ -288,18 +288,16 @@ bool lldb_private::formatters::LibCxxMap SyntheticChildrenTraversal::None), nullptr) .get(); - + if (!m_pair_ptr) { - m_pair_ptr = valobj_sp - ->GetValueForExpressionPath( - ".__i_.__ptr_", nullptr, nullptr, - ValueObject::GetValueForExpressionPathOptions() - .DontCheckDotVsArrowSyntax() - .SetSyntheticChildrenTraversal( - ValueObject::GetValueForExpressionPathOptions:: - SyntheticChildrenTraversal::None), - nullptr) - .get(); + m_pair_ptr = valobj_sp->GetValueForExpressionPath(".__i_.__ptr_", nullptr, 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; Modified: lldb/trunk/source/Symbol/Variable.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Variable.cpp?rev=287320&r1=287319&r2=287320&view=diff ============================================================================== --- lldb/trunk/source/Symbol/Variable.cpp (original) +++ lldb/trunk/source/Symbol/Variable.cpp Fri Nov 18 00:34:45 2016 @@ -404,8 +404,16 @@ Error Variable::GetValuesForVariableExpr 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); + variable_sub_expr_path, &first_unparsed, + &reason_to_stop, &final_value_type, options, + &final_task_on_target); if (!valobj_sp) { error.SetErrorStringWithFormat( "invalid expression path '%s' for variable '%s'", _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits