This revision was automatically updated to reflect the committed changes.
Closed by commit rL334638: [ObjC] Add dataformatter for NSDecimalNumber 
(authored by JDevlieghere, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D48114?vs=151096&id=151217#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D48114

Files:
  
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/Cocoa.cpp
  lldb/trunk/source/Plugins/Language/ObjC/Cocoa.h
  lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp

Index: lldb/trunk/source/Plugins/Language/ObjC/Cocoa.h
===================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/Cocoa.h
+++ lldb/trunk/source/Plugins/Language/ObjC/Cocoa.h
@@ -32,6 +32,9 @@
 bool NSNumberSummaryProvider(ValueObject &valobj, Stream &stream,
                              const TypeSummaryOptions &options);
 
+bool NSDecimalNumberSummaryProvider(ValueObject &valobj, Stream &stream,
+                                    const TypeSummaryOptions &options);
+
 bool NSNotificationSummaryProvider(ValueObject &valobj, Stream &stream,
                                    const TypeSummaryOptions &options);
 
Index: lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp
===================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp
+++ lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp
@@ -458,6 +458,9 @@
   if (class_name == "__NSCFBoolean")
     return ObjCBooleanSummaryProvider(valobj, stream, options);
 
+  if (class_name == "NSDecimalNumber")
+    return NSDecimalNumberSummaryProvider(valobj, stream, options);
+
   if (class_name == "NSNumber" || class_name == "__NSCFNumber") {
     uint64_t value = 0;
     uint64_t i_bits = 0;
@@ -625,6 +628,55 @@
   return false;
 }
 
+bool lldb_private::formatters::NSDecimalNumberSummaryProvider(
+    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
+  ProcessSP process_sp = valobj.GetProcessSP();
+  if (!process_sp)
+    return false;
+
+  lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
+  uint32_t ptr_size = process_sp->GetAddressByteSize();
+
+  Status error;
+  int8_t exponent = process_sp->ReadUnsignedIntegerFromMemory(
+      valobj_addr + ptr_size, 1, 0, error);
+  if (error.Fail())
+    return false;
+
+  uint8_t length_and_negative = process_sp->ReadUnsignedIntegerFromMemory(
+      valobj_addr + ptr_size + 1, 1, 0, error);
+  if (error.Fail())
+    return false;
+
+  // Fifth bit marks negativity.
+  const bool is_negative = (length_and_negative >> 4) & 1;
+
+  // Zero length and negative means NaN.
+  uint8_t length = length_and_negative & 0xf;
+  const bool is_nan = is_negative && (length == 0);
+
+  if (is_nan) {
+    stream.Printf("NaN");
+    return true;
+  }
+
+  if (length == 0) {
+    stream.Printf("0");
+    return true;
+  }
+
+  uint64_t mantissa = process_sp->ReadUnsignedIntegerFromMemory(
+      valobj_addr + ptr_size + 4, 8, 0, error);
+  if (error.Fail())
+    return false;
+
+  if (is_negative)
+    stream.Printf("-");
+
+  stream.Printf("%" PRIu64 " x 10^%" PRIi8, mantissa, exponent);
+  return true;
+}
+
 bool lldb_private::formatters::NSURLSummaryProvider(
     ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
   ProcessSP process_sp = valobj.GetProcessSP();
Index: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp
===================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -763,6 +763,10 @@
   AddCXXSummary(
       objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
       "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
+  AddCXXSummary(objc_category_sp,
+                lldb_private::formatters::NSNumberSummaryProvider,
+                "NSDecimalNumber summary provider",
+                ConstString("NSDecimalNumber"), appkit_flags);
 
   AddCXXSummary(objc_category_sp,
                 lldb_private::formatters::NSURLSummaryProvider,
Index: 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/TestDataFormatterObjC.py
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py
@@ -215,6 +215,14 @@
                              '(NSNumber *) num_at3 = ', ' (double)12.5',
                              '(NSNumber *) num_at4 = ', ' (double)-12.5'])
 
+    def nsdecimalnumber_data_formatter_commands(self):
+        self.expect('frame variable decimal_number decimal_neg_number decimal_one decimal_zero decimal_nan',
+                    substrs=['(NSDecimalNumber *) decimal_number = ', '123456 x 10^-10',
+                             '(NSDecimalNumber *) decimal_neg_number = ', '-123456 x 10^10',
+                             '(NSDecimalNumber *) decimal_one = ', '1 x 10^0',
+                             '(NSDecimalNumber *) decimal_zero = ', '0',
+                             '(NSDecimalNumber *) decimal_nan = ', 'NaN'])
+
     def nscontainers_data_formatter_commands(self):
         self.expect(
             'frame variable newArray newDictionary newMutableDictionary cfarray_ref mutable_array_ref',
Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-objc/main.m
@@ -169,7 +169,11 @@
 	    NSNumber* num_at3 = @12.5;
 	    NSNumber* num_at4 = @-12.5;
 
-		NSDecimalNumber* decimal_one = [NSDecimalNumber one];
+	    NSDecimalNumber* decimal_number = [NSDecimalNumber decimalNumberWithMantissa:123456 exponent:-10 isNegative:NO];
+	    NSDecimalNumber* decimal_number_neg = [NSDecimalNumber decimalNumberWithMantissa:123456 exponent:10 isNegative:YES];
+	    NSDecimalNumber* decimal_one = [NSDecimalNumber one];
+	    NSDecimalNumber* decimal_zero = [NSDecimalNumber zero];
+	    NSDecimalNumber* decimal_nan = [NSDecimalNumber notANumber];
 
 	    NSString *str0 = [num6 stringValue];
 
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to