[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