summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/ValueObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Core/ValueObject.cpp')
-rw-r--r--lldb/source/Core/ValueObject.cpp54
1 files changed, 50 insertions, 4 deletions
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index 124e35b5e3e..46cccc5727d 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, nullptr, nullptr,
+ expression, NULL, NULL, NULL,
GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal(
GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
None));
@@ -2166,11 +2166,13 @@ void ValueObject::GetExpressionPath(Stream &s, bool qualify_cxx_base_classes,
}
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::GetValueForExpressionPath(
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::GetValueForExpressionPath(
}
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::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
// 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::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;
*reason_to_stop =
ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
*final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
@@ -2299,6 +2311,7 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
// 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::GetValueForExpressionPath_Impl(
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::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;
@@ -2383,6 +2399,7 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
// 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::GetValueForExpressionPath_Impl(
']') // 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::GetValueForExpressionPath_Impl(
} 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::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
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::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;
@@ -2571,11 +2599,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();
} else {
+ *first_unparsed = end + 1; // skip ]
*final_result = ValueObject::eExpressionPathEndResultTypePlain;
continue;
}
@@ -2583,6 +2613,7 @@ 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;
@@ -2590,6 +2621,7 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
} 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::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 ]
*final_result = ValueObject::eExpressionPathEndResultTypePlain;
continue;
}
@@ -2615,6 +2649,7 @@ 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;
@@ -2624,6 +2659,7 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
// to go
if (!root.get()) {
+ *first_unparsed = expression_cstr;
*reason_to_stop =
ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
*final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
@@ -2631,15 +2667,18 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
}
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::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
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::GetValueForExpressionPath_Impl(
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::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;
@@ -2705,6 +2749,7 @@ ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
continue;
}
} else {
+ *first_unparsed = expression_cstr;
*reason_to_stop =
ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
*final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange;
@@ -2715,6 +2760,7 @@ 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;
OpenPOWER on IntegriCloud