Display the pointer value in the libstdc++ unique_ptr summary
authorPavel Labath <labath@google.com>
Wed, 9 Nov 2016 10:42:29 +0000 (10:42 +0000)
committerPavel Labath <labath@google.com>
Wed, 9 Nov 2016 10:42:29 +0000 (10:42 +0000)
Summary:
r284830 added a summary provider for unique_ptr in libstdc++, whose value printed
the value of the pointee. This is a bit unintuitive as it becomes unobvious that
the value actually is a pointer, and we lose the way to actually obtain the
pointer value.

Change that to print the pointer value instead. The pointee value can still be
obtained through the synthetic children.

Reviewers: tberghammer, granata.enrico

Subscribers: lldb-commits

Differential Revision: https://reviews.llvm.org/D26403

llvm-svn: 286355

lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/unique_ptr/TestDataFormatterStdUniquePtr.py
lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp

index 5fbf854ca6bbaeb3558188cfb3bb4b6b7893f5b5..770d87178f50d78c4e8ed23955e316d584a8ac0c 100644 (file)
@@ -34,12 +34,12 @@ class StdUniquePtrDataFormatterTestCase(TestBase):
         self.assertTrue(frame.IsValid())
 
         self.expect("frame variable nup", substrs=['nup = nullptr'])
-        self.expect("frame variable iup", substrs=['iup = 123', 'object = 123'])
-        self.expect("frame variable sup", substrs=['sup = "foobar"', 'object = "foobar"'])
+        self.expect("frame variable iup", substrs=['iup = 0x', 'object = 123'])
+        self.expect("frame variable sup", substrs=['sup = 0x', 'object = "foobar"'])
 
         self.expect("frame variable ndp", substrs=['ndp = nullptr'])
-        self.expect("frame variable idp", substrs=['idp = 456', 'object = 456', 'deleter = ', 'a = 1', 'b = 2'])
-        self.expect("frame variable sdp", substrs=['sdp = "baz"', 'object = "baz"', 'deleter = ', 'a = 3', 'b = 4'])
+        self.expect("frame variable idp", substrs=['idp = 0x', 'object = 456', 'deleter = ', 'a = 1', 'b = 2'])
+        self.expect("frame variable sdp", substrs=['sdp = 0x', 'object = "baz"', 'deleter = ', 'a = 3', 'b = 4'])
         
         self.assertEqual(123, frame.GetValueForVariablePath("iup.object").GetValueAsUnsigned())
         self.assertFalse(frame.GetValueForVariablePath("iup.deleter").IsValid())
index 636819936b51433836a5f4d2a3c2b3032a5ab774..4eb3b95afb4ee0f5dcf0f79822ed7b8a2a633177 100644 (file)
@@ -126,23 +126,14 @@ bool LibStdcppUniquePtrSyntheticFrontEnd::GetSummary(
   if (!m_ptr_obj)
     return false;
 
-  if (m_ptr_obj->GetValueAsUnsigned(0) == 0) {
+  bool success;
+  uint64_t ptr_value = m_ptr_obj->GetValueAsUnsigned(0, &success);
+  if (!success)
+    return false;
+  if (ptr_value == 0)
     stream.Printf("nullptr");
-  } else {
-    Error error;
-    bool print_pointee = false;
-    if (m_obj_obj) {
-      if (m_obj_obj->DumpPrintableRepresentation(
-              stream, ValueObject::eValueObjectRepresentationStyleSummary,
-              lldb::eFormatInvalid,
-              ValueObject::PrintableRepresentationSpecialCases::eDisable,
-              false)) {
-        print_pointee = true;
-      }
-    }
-    if (!print_pointee)
-      stream.Printf("ptr = 0x%" PRIx64, m_ptr_obj->GetValueAsUnsigned(0));
-  }
+  else
+    stream.Printf("0x%" PRIx64, ptr_value);
   return true;
 }