[Lldb-commits] [lldb] r183030 - <rdar://problem/14035604>

Enrico Granata egranata at apple.com
Fri May 31 12:18:19 PDT 2013


Author: enrico
Date: Fri May 31 14:18:19 2013
New Revision: 183030

URL: http://llvm.org/viewvc/llvm-project?rev=183030&view=rev
Log:
<rdar://problem/14035604>

Fixing an issue where formats would not propagate from parents to children in all cases
Details follow:
an SBValue has children and those are fetched along with their values
Now, one calls SBValue::SetFormat() on the parent
Technically, the format choices should propagate onto the children (see ValueObject::GetFormat())
But if the children values are already fetched, they won't notice the format change and won't update themselves
This commit fixes that by making ValueObject::GetValueAsCString() check if any format change intervened from the previous call to the current one
A test case is also added


Added:
    lldb/trunk/test/functionalities/data-formatter/format-propagation/
    lldb/trunk/test/functionalities/data-formatter/format-propagation/Makefile
    lldb/trunk/test/functionalities/data-formatter/format-propagation/TestFormatPropagation.py
    lldb/trunk/test/functionalities/data-formatter/format-propagation/main.cpp
Modified:
    lldb/trunk/include/lldb/Core/ValueObject.h
    lldb/trunk/source/Core/ValueObject.cpp

Modified: lldb/trunk/include/lldb/Core/ValueObject.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=183030&r1=183029&r2=183030&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/ValueObject.h (original)
+++ lldb/trunk/include/lldb/Core/ValueObject.h Fri May 31 14:18:19 2013
@@ -1230,6 +1230,7 @@ protected:
                                              // as an independent ValueObjectConstResult, which isn't managed by us.
 
     lldb::Format                m_format;
+    lldb::Format                m_last_format;
     uint32_t                    m_last_format_mgr_revision;
     lldb::TypeSummaryImplSP     m_type_summary_sp;
     lldb::TypeFormatImplSP      m_type_format_sp;

Modified: lldb/trunk/source/Core/ValueObject.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=183030&r1=183029&r2=183030&view=diff
==============================================================================
--- lldb/trunk/source/Core/ValueObject.cpp (original)
+++ lldb/trunk/source/Core/ValueObject.cpp Fri May 31 14:18:19 2013
@@ -82,6 +82,7 @@ ValueObject::ValueObject (ValueObject &p
     m_synthetic_value(NULL),
     m_deref_valobj(NULL),
     m_format (eFormatDefault),
+    m_last_format (eFormatDefault),
     m_last_format_mgr_revision(0),
     m_type_summary_sp(),
     m_type_format_sp(),
@@ -127,6 +128,7 @@ ValueObject::ValueObject (ExecutionConte
     m_synthetic_value(NULL),
     m_deref_valobj(NULL),
     m_format (eFormatDefault),
+    m_last_format (eFormatDefault),
     m_last_format_mgr_revision(0),
     m_type_summary_sp(),
     m_type_format_sp(),
@@ -1441,7 +1443,7 @@ ValueObject::GetValueAsCString (lldb::Fo
 const char *
 ValueObject::GetValueAsCString ()
 {
-    if (UpdateValueIfNeeded(true) && m_value_str.empty())
+    if (UpdateValueIfNeeded(true))
     {
         lldb::Format my_format = GetFormat();
         if (my_format == lldb::eFormatDefault)
@@ -1468,13 +1470,17 @@ ValueObject::GetValueAsCString ()
                 }
             }
         }
-        if (GetValueAsCString(my_format, m_value_str))
+        if (my_format != m_last_format || m_value_str.empty())
         {
-            if (!m_value_did_change && m_old_value_valid)
+            m_last_format = my_format;
+            if (GetValueAsCString(my_format, m_value_str))
             {
-                // The value was gotten successfully, so we consider the
-                // value as changed if the value string differs
-                SetValueDidChange (m_old_value_str != m_value_str);
+                if (!m_value_did_change && m_old_value_valid)
+                {
+                    // The value was gotten successfully, so we consider the
+                    // value as changed if the value string differs
+                    SetValueDidChange (m_old_value_str != m_value_str);
+                }
             }
         }
     }

Added: lldb/trunk/test/functionalities/data-formatter/format-propagation/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/format-propagation/Makefile?rev=183030&view=auto
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/format-propagation/Makefile (added)
+++ lldb/trunk/test/functionalities/data-formatter/format-propagation/Makefile Fri May 31 14:18:19 2013
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules

Added: lldb/trunk/test/functionalities/data-formatter/format-propagation/TestFormatPropagation.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/format-propagation/TestFormatPropagation.py?rev=183030&view=auto
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/format-propagation/TestFormatPropagation.py (added)
+++ lldb/trunk/test/functionalities/data-formatter/format-propagation/TestFormatPropagation.py Fri May 31 14:18:19 2013
@@ -0,0 +1,91 @@
+"""
+Check if changing Format on an SBValue correctly propagates that new format to children as it should
+"""
+
+import os, time
+import unittest2
+import lldb
+from lldbtest import *
+import lldbutil
+
+class FormatPropagationTestCase(TestBase):
+
+    mydir = os.path.join("functionalities", "data-formatter", "format-propagation")
+
+    # rdar://problem/14035604
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+    @dsym_test
+    def test_with_dsym_and_run_command(self):
+        """Check if changing Format on an SBValue correctly propagates that new format to children as it should"""
+        self.buildDsym()
+        self.propagate_test_commands()
+
+    # rdar://problem/14035604
+    @dwarf_test
+    def test_with_dwarf_and_run_command(self):
+        """Check if changing Format on an SBValue correctly propagates that new format to children as it should"""
+        self.buildDwarf()
+        self.propagate_test_commands()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+        # Find the line number to break at.
+        self.line = line_number('main.cpp', '// Set break point at this line.')
+
+    def propagate_test_commands(self):
+        """Check for an issue where capping does not work because the Target pointer appears to be changing behind our backs."""
+        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+        self.runCmd("run", RUN_SUCCEEDED)
+
+        # The stop reason of the thread should be breakpoint.
+        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+            substrs = ['stopped',
+                       'stop reason = breakpoint'])
+
+        # This is the function to remove the custom formats in order to have a
+        # clean slate for the next test case.
+        def cleanup():
+            pass
+
+        # Execute the cleanup function during test case tear down.
+        self.addTearDownHook(cleanup)
+
+        # extract the parent and the children
+        frame = self.frame()
+        parent = self.frame().FindVariable("f")
+        self.assertTrue(parent != None and parent.IsValid(),"could not find f")
+        X = parent.GetChildMemberWithName("X")
+        self.assertTrue(X != None and X.IsValid(),"could not find X")
+        Y = parent.GetChildMemberWithName("Y")
+        self.assertTrue(Y != None and Y.IsValid(),"could not find Y")
+        # check their values now
+        self.assertTrue(X.GetValue() == "1", "X has an invalid value")
+        self.assertTrue(Y.GetValue() == "2", "Y has an invalid value")
+        # set the format on the parent
+        parent.SetFormat(lldb.eFormatHex)
+        self.assertTrue(X.GetValue() == "0x00000001", "X has not changed format")
+        self.assertTrue(Y.GetValue() == "0x00000002", "Y has not changed format")
+        # Step and check if the values make sense still
+        self.runCmd("next")
+        self.assertTrue(X.GetValue() == "0x00000004", "X has not become 4")
+        self.assertTrue(Y.GetValue() == "0x00000002", "Y has not stuck as hex")
+        # Check that children can still make their own choices
+        Y.SetFormat(lldb.eFormatDecimal)
+        self.assertTrue(X.GetValue() == "0x00000004", "X is still hex")
+        self.assertTrue(Y.GetValue() == "2", "Y has not been reset")
+        # Make a few more changes
+        parent.SetFormat(lldb.eFormatDefault)
+        X.SetFormat(lldb.eFormatHex)
+        Y.SetFormat(lldb.eFormatDefault)
+        self.assertTrue(X.GetValue() == "0x00000004", "X is not hex as it asked")
+        self.assertTrue(Y.GetValue() == "2", "Y is not defaulted")
+
+if __name__ == '__main__':
+    import atexit
+    lldb.SBDebugger.Initialize()
+    atexit.register(lambda: lldb.SBDebugger.Terminate())
+    unittest2.main()

Added: lldb/trunk/test/functionalities/data-formatter/format-propagation/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/format-propagation/main.cpp?rev=183030&view=auto
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/format-propagation/main.cpp (added)
+++ lldb/trunk/test/functionalities/data-formatter/format-propagation/main.cpp Fri May 31 14:18:19 2013
@@ -0,0 +1,13 @@
+struct foo
+{
+	int X;
+	int Y;
+	foo(int a, int b) : X(a), Y(b) {}
+};
+
+int main()
+{
+	foo f(1,2);
+	f.X = 4; // Set break point at this line.
+	return 0;
+}





More information about the lldb-commits mailing list