[Lldb-commits] [lldb] r263603 - Make it so that the data formatter for NSError can see through a variable of type NSError**. Fixes rdar://25060684

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 15 16:20:11 PDT 2016


Author: enrico
Date: Tue Mar 15 18:20:10 2016
New Revision: 263603

URL: http://llvm.org/viewvc/llvm-project?rev=263603&view=rev
Log:
Make it so that the data formatter for NSError can see through a variable of type NSError**. Fixes rdar://25060684

Modified:
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m
    lldb/trunk/source/Plugins/Language/ObjC/NSError.cpp
    lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp

Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py?rev=263603&r1=263602&r2=263603&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py Tue Mar 15 18:20:10 2016
@@ -254,6 +254,9 @@ class ObjCDataFormatterTestCase(TestBase
         self.expect('frame variable nserror',
                     substrs = ['domain: @"Foobar" - code: 12'])
 
+        self.expect('frame variable nserrorptr',
+                    substrs = ['domain: @"Foobar" - code: 12'])
+
         self.expect('frame variable nserror->_userInfo',
                     substrs = ['2 key/value pairs'])
 
@@ -268,10 +271,10 @@ class ObjCDataFormatterTestCase(TestBase
 
     def nsexception_data_formatter_commands(self):
         self.expect('frame variable except0 except1 except2 except3',
-                    substrs = ['(NSException *) except0 = ','name:@"TheGuyWhoHasNoName" reason:@"cuz it\'s funny"',
-                    '(NSException *) except1 = ','name:@"TheGuyWhoHasNoName~1" reason:@"cuz it\'s funny"',
-                    '(NSException *) except2 = ','name:@"TheGuyWhoHasNoName`2" reason:@"cuz it\'s funny"',
-                    '(NSException *) except3 = ','name:@"TheGuyWhoHasNoName/3" reason:@"cuz it\'s funny"'])
+                    substrs = ['(NSException *) except0 = ','name: @"TheGuyWhoHasNoName" - reason: @"cuz it\'s funny"',
+                    '(NSException *) except1 = ','name: @"TheGuyWhoHasNoName~1" - reason: @"cuz it\'s funny"',
+                    '(NSException *) except2 = ','name: @"TheGuyWhoHasNoName`2" - reason: @"cuz it\'s funny"',
+                    '(NSException *) except3 = ','name: @"TheGuyWhoHasNoName/3" - reason: @"cuz it\'s funny"'])
 
     def nsmisc_data_formatter_commands(self):
         self.expect('frame variable localhost',
@@ -402,7 +405,6 @@ class ObjCDataFormatterTestCase(TestBase
          '(Rect *) rect_ptr = (t=4, l=8, b=4, r=7)',
          '(Point) point = (v=7, h=12)',
          '(Point *) point_ptr = (v=7, h=12)',
-         'name:@"TheGuyWhoHasNoName" reason:@"cuz it\'s funny"',
          '1985',
          'foo_selector_impl'];
          

Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m?rev=263603&r1=263602&r2=263603&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m Tue Mar 15 18:20:10 2016
@@ -485,6 +485,7 @@ int main (int argc, const char * argv[])
 
 	    NSDictionary *error_userInfo = @{@"a": @1, @"b" : @2};
 	    NSError *nserror = [[NSError alloc] initWithDomain:@"Foobar" code:12 userInfo:error_userInfo];
+	    NSError **nserrorptr = &nserror;
 
 	    NSBundle* bundle_string = [[NSBundle alloc] initWithPath:@"/System/Library/Frameworks/Accelerate.framework"];
 	    NSBundle* bundle_url = [[NSBundle alloc] initWithURL:[[NSURL alloc] initWithString:@"file://localhost/System/Library/Frameworks/Cocoa.framework"]];

Modified: lldb/trunk/source/Plugins/Language/ObjC/NSError.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/NSError.cpp?rev=263603&r1=263602&r2=263603&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/NSError.cpp (original)
+++ lldb/trunk/source/Plugins/Language/ObjC/NSError.cpp Tue Mar 15 18:20:10 2016
@@ -34,27 +34,49 @@ using namespace lldb;
 using namespace lldb_private;
 using namespace lldb_private::formatters;
 
-bool
-lldb_private::formatters::NSError_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options)
+static lldb::addr_t
+DerefToNSErrorPointer (ValueObject& valobj)
 {
-    ProcessSP process_sp(valobj.GetProcessSP());
-    if (!process_sp)
-        return false;
-    
-    lldb::addr_t ptr_value = LLDB_INVALID_ADDRESS;
-    
     CompilerType valobj_type(valobj.GetCompilerType());
     Flags type_flags(valobj_type.GetTypeInfo());
     if (type_flags.AllClear(eTypeHasValue))
     {
         if (valobj.IsBaseClass() && valobj.GetParent())
-            ptr_value = valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
+            return valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
     }
     else
-        ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
+    {
+        lldb::addr_t ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
+        if (type_flags.AllSet(eTypeIsPointer))
+        {
+            CompilerType pointee_type(valobj_type.GetPointeeType());
+            Flags pointee_flags(pointee_type.GetTypeInfo());
+            if (pointee_flags.AllSet(eTypeIsPointer))
+            {
+                if (ProcessSP process_sp = valobj.GetProcessSP())
+                {
+                    Error error;
+                    ptr_value = process_sp->ReadPointerFromMemory(ptr_value, error);
+                }
+            }
+        }
+        return ptr_value;
+    }
+    
+    return LLDB_INVALID_ADDRESS;
+}
 
+bool
+lldb_private::formatters::NSError_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options)
+{
+    ProcessSP process_sp(valobj.GetProcessSP());
+    if (!process_sp)
+        return false;
+    
+    lldb::addr_t ptr_value = DerefToNSErrorPointer(valobj);
     if (ptr_value == LLDB_INVALID_ADDRESS)
         return false;
+
     size_t ptr_size = process_sp->GetAddressByteSize();
     lldb::addr_t code_location = ptr_value + 2 * ptr_size;
     lldb::addr_t domain_location = ptr_value + 3 * ptr_size;
@@ -135,18 +157,7 @@ public:
         if (!process_sp)
             return false;
         
-        lldb::addr_t userinfo_location = LLDB_INVALID_ADDRESS;
-        
-        CompilerType valobj_type(m_backend.GetCompilerType());
-        Flags type_flags(valobj_type.GetTypeInfo());
-        if (type_flags.AllClear(eTypeHasValue))
-        {
-            if (m_backend.IsBaseClass() && m_backend.GetParent())
-                userinfo_location = m_backend.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
-        }
-        else
-            userinfo_location = m_backend.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
-
+        lldb::addr_t userinfo_location = DerefToNSErrorPointer(m_backend);
         if (userinfo_location == LLDB_INVALID_ADDRESS)
             return false;
         

Modified: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp?rev=263603&r1=263602&r2=263603&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp (original)
+++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp Tue Mar 15 18:20:10 2016
@@ -557,10 +557,7 @@ LoadObjCFormatters(TypeCategoryImplSP ob
     
     AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags);
     AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags);
-    
-    AddStringSummary(objc_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
-    AddStringSummary(objc_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags);
-    
+        
     AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
     AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
     AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);




More information about the lldb-commits mailing list