[Lldb-commits] [lldb] r325841 - [ObjC] Fix the NSConcreteData formatter and test it
Vedant Kumar via lldb-commits
lldb-commits at lists.llvm.org
Thu Feb 22 15:48:21 PST 2018
Author: vedantk
Date: Thu Feb 22 15:48:21 2018
New Revision: 325841
URL: http://llvm.org/viewvc/llvm-project?rev=325841&view=rev
Log:
[ObjC] Fix the NSConcreteData formatter and test it
The length field of an NSConcreteData lives one word past the start of
the object, not two.
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/Cocoa.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=325841&r1=325840&r2=325841&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 Thu Feb 22 15:48:21 2018
@@ -243,7 +243,7 @@ class ObjCDataFormatterTestCase(TestBase
def nsdata_data_formatter_commands(self):
self.expect(
- 'frame variable immutableData mutableData data_ref mutable_data_ref mutable_string_ref',
+ 'frame variable immutableData mutableData data_ref mutable_data_ref mutable_string_ref concreteData concreteMutableData',
substrs=[
'(NSData *) immutableData = ',
' 4 bytes',
@@ -254,7 +254,12 @@ class ObjCDataFormatterTestCase(TestBase
'(CFMutableDataRef) mutable_data_ref = ',
'@"5 bytes"',
'(CFMutableStringRef) mutable_string_ref = ',
- ' @"Wish ya knew"'])
+ ' @"Wish ya knew"',
+ '(NSData *) concreteData = ',
+ ' 100000 bytes',
+ '(NSMutableData *) concreteMutableData = ',
+ ' 100000 bytes'])
+
def nsurl_data_formatter_commands(self):
self.expect(
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=325841&r1=325840&r2=325841&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 Thu Feb 22 15:48:21 2018
@@ -396,6 +396,12 @@ int main (int argc, const char * argv[])
NSData *immutableData = [[NSData alloc] initWithBytes:"HELLO" length:4];
NSData *mutableData = [[NSMutableData alloc] initWithBytes:"NODATA" length:6];
+ // No-copy versions of NSData initializers use NSConcreteData if over 2^16 elements are specified.
+ unsigned concreteLength = 100000;
+ void *zeroes = calloc(1, concreteLength);
+ NSData *concreteData = [[NSData alloc] initWithBytesNoCopy:zeroes length:concreteLength];
+ NSMutableData *concreteMutableData = [[NSMutableData alloc] initWithBytesNoCopy:zeroes length:concreteLength];
+
[mutableData appendBytes:"MOREDATA" length:8];
[immutableData length];
@@ -610,6 +616,7 @@ int main (int argc, const char * argv[])
[molecule setAtoms:nil];
[molecule setAtoms:[NSMutableArray new]];
+ free(zeroes);
[pool drain];
return 0;
}
Modified: lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp?rev=325841&r1=325840&r2=325841&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp (original)
+++ lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp Thu Feb 22 15:48:21 2018
@@ -871,28 +871,34 @@ bool lldb_private::formatters::NSDataSum
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;
More information about the lldb-commits
mailing list