diff options
| author | Enrico Granata <granata.enrico@gmail.com> | 2011-08-11 17:08:01 +0000 |
|---|---|---|
| committer | Enrico Granata <granata.enrico@gmail.com> | 2011-08-11 17:08:01 +0000 |
| commit | 8c9d35603eb45eb50d7deaa2bf2fa629f3dfb74b (patch) | |
| tree | ef94da4b55ccb6672bbc084954b80817883c5af5 /lldb/source/Core/ValueObject.cpp | |
| parent | efdd183f5292b108015e2279f28e259869e7185e (diff) | |
| download | bcm5719-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.cpp | 48 |
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 { |

