summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/ValueObject.cpp
diff options
context:
space:
mode:
authorEnrico Granata <granata.enrico@gmail.com>2011-08-11 17:08:01 +0000
committerEnrico Granata <granata.enrico@gmail.com>2011-08-11 17:08:01 +0000
commit8c9d35603eb45eb50d7deaa2bf2fa629f3dfb74b (patch)
treeef94da4b55ccb6672bbc084954b80817883c5af5 /lldb/source/Core/ValueObject.cpp
parentefdd183f5292b108015e2279f28e259869e7185e (diff)
downloadbcm5719-llvm-8c9d35603eb45eb50d7deaa2bf2fa629f3dfb74b.tar.gz
bcm5719-llvm-8c9d35603eb45eb50d7deaa2bf2fa629f3dfb74b.zip
Fixed an issue where a pointer's address was being logged instead of its value
Access to synthetic children by name: if your object has a synthetic child named foo you can now type frame variable object.foo (or ->foo if you have a pointer) and that will print the value of the synthetic child (if your object has an actual child named foo, the actual child prevails!) this behavior should also work in summaries, and you should be able to use ${var.foo} and ${svar.foo} interchangeably (but using svar.foo will mask an actual child named foo) llvm-svn: 137314
Diffstat (limited to 'lldb/source/Core/ValueObject.cpp')
-rw-r--r--lldb/source/Core/ValueObject.cpp48
1 files changed, 42 insertions, 6 deletions
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index 80c8d5acd0f..fe27d712842 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -2032,13 +2032,28 @@ ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
if (!next_separator) // if no other separator just expand this last layer
{
child_name.SetCString (expression_cstr);
- root = root->GetChildMemberWithName(child_name, true);
- if (root.get()) // we know we are done, so just return
+ ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true);
+
+ if (child_valobj_sp.get()) // we know we are done, so just return
{
*first_unparsed = '\0';
*reason_to_stop = ValueObject::eEndOfString;
*final_result = ValueObject::ePlain;
- return root;
+ return child_valobj_sp;
+ }
+ else if (options.m_no_synthetic_children == false) // let's try with synthetic children
+ {
+ child_valobj_sp = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildMemberWithName(child_name, true);
+ }
+
+ // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
+ // so we hit the "else" branch, and return an error
+ if(child_valobj_sp.get()) // if it worked, just return
+ {
+ *first_unparsed = '\0';
+ *reason_to_stop = ValueObject::eEndOfString;
+ *final_result = ValueObject::ePlain;
+ return child_valobj_sp;
}
else
{
@@ -2051,9 +2066,24 @@ ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
else // other layers do expand
{
child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
- root = root->GetChildMemberWithName(child_name, true);
- if (root.get()) // store the new root and move on
+ 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;
+ *final_result = ValueObject::ePlain;
+ continue;
+ }
+ else if (options.m_no_synthetic_children == false) // let's try with synthetic children
+ {
+ child_valobj_sp = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildMemberWithName(child_name, true);
+ }
+
+ // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
+ // so we hit the "else" branch, and return an error
+ if(child_valobj_sp.get()) // if it worked, move on
{
+ root = child_valobj_sp;
*first_unparsed = next_separator;
*final_result = ValueObject::ePlain;
continue;
@@ -2236,7 +2266,7 @@ ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
return root;
}
}
- else if (root->HasSyntheticValue() && options.m_no_synthetic_children)
+ else if (root->HasSyntheticValue() && options.m_no_synthetic_children == false)
{
root = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildAtIndex(index, true);
if (!root.get())
@@ -2246,6 +2276,12 @@ ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
*final_result = ValueObject::eInvalid;
return ValueObjectSP();
}
+ else
+ {
+ *first_unparsed = end+1; // skip ]
+ *final_result = ValueObject::ePlain;
+ continue;
+ }
}
else
{
OpenPOWER on IntegriCloud