[Lldb-commits] [PATCH] D105470: [lldb] Clear children of ValueObject on value update

Andy Yankovsky via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Jul 6 03:25:35 PDT 2021


werat created this revision.
werat added a reviewer: teemperor.
werat requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

Children of ValueObject automatically update themselves when they detect
the state of the process has changed, which typically happens when the
parent value is updated. However, if in case of updating
ValueObjectConstResult the process state is unchanged and the children
remain stale.

Explicitly clear the children upon the parent update, so that they're
re-calculated afterwards.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D105470

Files:
  lldb/source/Core/ValueObject.cpp
  lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py
  lldb/test/API/python_api/value/change_values/main.c


Index: lldb/test/API/python_api/value/change_values/main.c
===================================================================
--- lldb/test/API/python_api/value/change_values/main.c
+++ lldb/test/API/python_api/value/change_values/main.c
@@ -8,7 +8,12 @@
   uint32_t  second_val;
   uint64_t  third_val;
 };
-  
+
+struct bar
+{
+  int value;
+};
+
 int main ()
 {
   int val = 100;
@@ -18,6 +23,11 @@
   ptr->second_val = 6666;
   ptr->third_val = 66666666;
 
+  struct bar *b1 = (struct bar *) malloc (sizeof (struct bar));
+  b1->value = 1;
+  struct bar *b2 = (struct bar *) malloc (sizeof (struct bar));
+  b2->value = 2;
+
   // Stop here and set values
   printf ("Val - %d Mine - %d, %d, %llu. Ptr - %d, %d, %llu\n", val, 
           mine.first_val, mine.second_val, mine.third_val,
Index: lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py
===================================================================
--- lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py
+++ lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py
@@ -130,6 +130,23 @@
         self.assertEquals(actual_value, 98765,
                         "Got the right changed value from ptr->second_val")
 
+        # Test updating the children after updating the parent value.
+        b = frame0.EvaluateExpression("auto $b_0 = b1; $b_0")
+        self.assertEquals(
+            b.GetValue(),
+            frame0.FindVariable("b1").GetValue())
+        self.assertEquals(
+            b.GetChildAtIndex(0, lldb.eNoDynamicValues, True).GetValue(),
+            "1")
+
+        b.SetValueFromCString(frame0.FindVariable("b2").GetValue())
+        self.assertEquals(
+            b.GetValue(),
+            frame0.FindVariable("b2").GetValue())
+        self.assertEquals(
+            b.GetChildAtIndex(0, lldb.eNoDynamicValues, True).GetValue(),
+            "2")
+
         # gcc may set multiple locations for breakpoint
         breakpoint.SetEnabled(False)
 
Index: lldb/source/Core/ValueObject.cpp
===================================================================
--- lldb/source/Core/ValueObject.cpp
+++ lldb/source/Core/ValueObject.cpp
@@ -231,6 +231,10 @@
   // We have to clear the value string here so ConstResult children will notice
   // if their values are changed by hand (i.e. with SetValueAsCString).
   ClearUserVisibleData(eClearUserVisibleDataItemsValue);
+  // Children have to be re-computed after updating the parent value.
+  m_flags.m_children_count_valid = false;
+  m_children.Clear();
+  SetSyntheticChildren(lldb::SyntheticChildrenSP());
 }
 
 void ValueObject::ClearDynamicTypeInformation() {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D105470.356661.patch
Type: text/x-patch
Size: 2644 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20210706/4b900ce4/attachment.bin>


More information about the lldb-commits mailing list