diff options
Diffstat (limited to 'source/Plugins/Language/ObjC/Cocoa.cpp')
| -rw-r--r-- | source/Plugins/Language/ObjC/Cocoa.cpp | 119 |
1 files changed, 88 insertions, 31 deletions
diff --git a/source/Plugins/Language/ObjC/Cocoa.cpp b/source/Plugins/Language/ObjC/Cocoa.cpp index 8f49975332128..8f278fc2d5130 100644 --- a/source/Plugins/Language/ObjC/Cocoa.cpp +++ b/source/Plugins/Language/ObjC/Cocoa.cpp @@ -67,12 +67,12 @@ bool lldb_private::formatters::NSBundleSummaryProvider( if (!valobj_addr) return false; - const char *class_name = descriptor->GetClassName().GetCString(); + llvm::StringRef class_name(descriptor->GetClassName().GetCString()); - if (!class_name || !*class_name) + if (class_name.empty()) return false; - if (!strcmp(class_name, "NSBundle")) { + if (class_name == "NSBundle") { uint64_t offset = 5 * ptr_size; ValueObjectSP text(valobj.GetSyntheticChildAtOffset( offset, @@ -117,12 +117,12 @@ bool lldb_private::formatters::NSTimeZoneSummaryProvider( if (!valobj_addr) return false; - const char *class_name = descriptor->GetClassName().GetCString(); + llvm::StringRef class_name(descriptor->GetClassName().GetCString()); - if (!class_name || !*class_name) + if (class_name.empty()) return false; - if (!strcmp(class_name, "__NSTimeZone")) { + if (class_name == "__NSTimeZone") { uint64_t offset = ptr_size; ValueObjectSP text(valobj.GetSyntheticChildAtOffset( offset, valobj.GetCompilerType(), true)); @@ -164,12 +164,12 @@ bool lldb_private::formatters::NSNotificationSummaryProvider( if (!valobj_addr) return false; - const char *class_name = descriptor->GetClassName().GetCString(); + llvm::StringRef class_name(descriptor->GetClassName().GetCString()); - if (!class_name || !*class_name) + if (class_name.empty()) return false; - if (!strcmp(class_name, "NSConcreteNotification")) { + if (class_name == "NSConcreteNotification") { uint64_t offset = ptr_size; ValueObjectSP text(valobj.GetSyntheticChildAtOffset( offset, valobj.GetCompilerType(), true)); @@ -211,14 +211,14 @@ bool lldb_private::formatters::NSMachPortSummaryProvider( if (!valobj_addr) return false; - const char *class_name = descriptor->GetClassName().GetCString(); + llvm::StringRef class_name(descriptor->GetClassName().GetCString()); - if (!class_name || !*class_name) + if (class_name.empty()) return false; uint64_t port_number = 0; - if (!strcmp(class_name, "NSMachPort")) { + if (class_name == "NSMachPort") { uint64_t offset = (ptr_size == 4 ? 12 : 20); Status error; port_number = process_sp->ReadUnsignedIntegerFromMemory( @@ -259,16 +259,15 @@ bool lldb_private::formatters::NSIndexSetSummaryProvider( if (!valobj_addr) return false; - const char *class_name = descriptor->GetClassName().GetCString(); + llvm::StringRef class_name(descriptor->GetClassName().GetCString()); - if (!class_name || !*class_name) + if (class_name.empty()) return false; uint64_t count = 0; do { - if (!strcmp(class_name, "NSIndexSet") || - !strcmp(class_name, "NSMutableIndexSet")) { + if (class_name == "NSIndexSet" || class_name == "NSMutableIndexSet") { Status error; uint32_t mode = process_sp->ReadUnsignedIntegerFromMemory( valobj_addr + ptr_size, 4, 0, error); @@ -451,15 +450,18 @@ bool lldb_private::formatters::NSNumberSummaryProvider( if (!valobj_addr) return false; - const char *class_name = descriptor->GetClassName().GetCString(); + llvm::StringRef class_name(descriptor->GetClassName().GetCString()); - if (!class_name || !*class_name) + if (class_name.empty()) return false; - if (!strcmp(class_name, "__NSCFBoolean")) + if (class_name == "__NSCFBoolean") return ObjCBooleanSummaryProvider(valobj, stream, options); - if (!strcmp(class_name, "NSNumber") || !strcmp(class_name, "__NSCFNumber")) { + 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; if (descriptor->GetTaggedPointerInfo(&i_bits, &value)) { @@ -626,6 +628,55 @@ bool lldb_private::formatters::NSNumberSummaryProvider( 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(); @@ -766,9 +817,9 @@ bool lldb_private::formatters::NSDateSummaryProvider( stream.Printf("0001-12-30 00:00:00 +0000"); return true; } - // this snippet of code assumes that time_t == seconds since Jan-1-1970 - // this is generally true and POSIXly happy, but might break if a library - // vendor decides to get creative + // this snippet of code assumes that time_t == seconds since Jan-1-1970 this + // is generally true and POSIXly happy, but might break if a library vendor + // decides to get creative time_t epoch = GetOSXEpoch(); epoch = epoch + (time_t)date_value; tm *tm_date = gmtime(&epoch); @@ -871,28 +922,34 @@ bool lldb_private::formatters::NSDataSummaryProvider( uint64_t value = 0; - const char *class_name = descriptor->GetClassName().GetCString(); + llvm::StringRef class_name = descriptor->GetClassName().GetCString(); - if (!class_name || !*class_name) + if (class_name.empty()) return false; - if (!strcmp(class_name, "NSConcreteData") || - !strcmp(class_name, "NSConcreteMutableData") || - !strcmp(class_name, "__NSCFData")) { - uint32_t offset = (is_64bit ? 16 : 8); + bool isNSConcreteData = class_name == "NSConcreteData"; + bool isNSConcreteMutableData = class_name == "NSConcreteMutableData"; + bool isNSCFData = class_name == "__NSCFData"; + if (isNSConcreteData || isNSConcreteMutableData || isNSCFData) { + uint32_t offset; + if (isNSConcreteData) + offset = is_64bit ? 8 : 4; + else + offset = is_64bit ? 16 : 8; + Status error; value = process_sp->ReadUnsignedIntegerFromMemory( valobj_addr + offset, is_64bit ? 8 : 4, 0, error); if (error.Fail()) return false; - } else if (!strcmp(class_name, "_NSInlineData")) { + } else if (class_name == "_NSInlineData") { uint32_t offset = (is_64bit ? 8 : 4); Status error; value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, 2, 0, error); if (error.Fail()) return false; - } else if (!strcmp(class_name, "_NSZeroData")) { + } else if (class_name == "_NSZeroData") { value = 0; } else return false; |
