From 48e0c2c82de0c133a912815cbd9be6b326fa9979 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Thu, 20 Sep 2012 21:38:45 +0000 Subject: [PATCH] Test suite to catch fragile base class ivar issues. llvm-svn: 164321 --- .../lang/objc/hidden-ivars/InternalDefiner.h | 5 ++-- .../lang/objc/hidden-ivars/InternalDefiner.m | 23 +++++++++++---- lldb/test/lang/objc/hidden-ivars/Makefile | 2 +- .../lang/objc/hidden-ivars/TestHiddenIvars.py | 28 ++++++++++++++++-- lldb/test/lang/objc/hidden-ivars/main.m | 29 +++++++++++++++++-- 5 files changed, 74 insertions(+), 13 deletions(-) diff --git a/lldb/test/lang/objc/hidden-ivars/InternalDefiner.h b/lldb/test/lang/objc/hidden-ivars/InternalDefiner.h index b9b54707ae5e..59652d4b09c0 100644 --- a/lldb/test/lang/objc/hidden-ivars/InternalDefiner.h +++ b/lldb/test/lang/objc/hidden-ivars/InternalDefiner.h @@ -1,10 +1,11 @@ #import +#import @interface InternalDefiner : NSObject { @public - int foo; + uintptr_t foo; } --(int)setBarTo:(int)newBar; +-(id)initWithFoo:(uintptr_t)f andBar:(uintptr_t)b; @end diff --git a/lldb/test/lang/objc/hidden-ivars/InternalDefiner.m b/lldb/test/lang/objc/hidden-ivars/InternalDefiner.m index 97536b163e76..1a10ce021ce3 100644 --- a/lldb/test/lang/objc/hidden-ivars/InternalDefiner.m +++ b/lldb/test/lang/objc/hidden-ivars/InternalDefiner.m @@ -1,18 +1,31 @@ #import "InternalDefiner.h" @interface InternalDefiner () { - int bar; + uintptr_t bar; } @end @implementation InternalDefiner --(int)setBarTo:(int)newBar +-(id)init { - int oldBar = bar; - bar = newBar; - return oldBar; + if (self = [super init]) + { + foo = 2; + bar = 3; + } + return self; +} + +-(id)initWithFoo:(uintptr_t)f andBar:(uintptr_t)b +{ + if (self = [super init]) + { + foo = f; + bar = b; + } + return self; } @end diff --git a/lldb/test/lang/objc/hidden-ivars/Makefile b/lldb/test/lang/objc/hidden-ivars/Makefile index e99c30c117d7..361820be1aa1 100644 --- a/lldb/test/lang/objc/hidden-ivars/Makefile +++ b/lldb/test/lang/objc/hidden-ivars/Makefile @@ -1,6 +1,6 @@ LEVEL = ../../../make -DYLIB_NAME := libInternalDefiner +DYLIB_NAME := InternalDefiner DYLIB_OBJC_SOURCES := InternalDefiner.m OBJC_SOURCES := main.m diff --git a/lldb/test/lang/objc/hidden-ivars/TestHiddenIvars.py b/lldb/test/lang/objc/hidden-ivars/TestHiddenIvars.py index 5968dcb716ad..943d63b06ba7 100644 --- a/lldb/test/lang/objc/hidden-ivars/TestHiddenIvars.py +++ b/lldb/test/lang/objc/hidden-ivars/TestHiddenIvars.py @@ -70,21 +70,45 @@ class HiddenIvarsTestCase(TestBase): self.common_setup() # This should display correctly. + self.expect("expression (j->_definer->foo)", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["= 4"]) + self.expect("expression (j->_definer->bar)", VARIABLES_DISPLAYED_CORRECTLY, substrs = ["= 5"]) self.expect("expression *(j->_definer)", VARIABLES_DISPLAYED_CORRECTLY, - substrs = ["foo = 0", "bar = 5"]) + substrs = ["foo = 4", "bar = 5"]) + + self.expect("expression (k->foo)", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["= 2"]) + + self.expect("expression (k->bar)", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["= 3"]) + + self.expect("expression *(k)", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["foo = 2", "bar = 3"]) def frame_var(self): self.common_setup() # This should display correctly. + self.expect("frame variable j->_definer->foo", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["= 4"]) + self.expect("frame variable j->_definer->bar", VARIABLES_DISPLAYED_CORRECTLY, substrs = ["= 5"]) self.expect("frame variable *j->_definer", VARIABLES_DISPLAYED_CORRECTLY, - substrs = ["foo = 0", "bar = 5"]) + substrs = ["foo = 4", "bar = 5"]) + + self.expect("frame variable k->foo", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["= 2"]) + + self.expect("frame variable k->bar", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["= 3"]) + + self.expect("frame variable *k", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["foo = 2", "bar = 3"]) if __name__ == '__main__': import atexit diff --git a/lldb/test/lang/objc/hidden-ivars/main.m b/lldb/test/lang/objc/hidden-ivars/main.m index 7d0e77bc73ce..d7ca124aedda 100644 --- a/lldb/test/lang/objc/hidden-ivars/main.m +++ b/lldb/test/lang/objc/hidden-ivars/main.m @@ -13,8 +13,29 @@ -(id)init { - _definer = [InternalDefiner alloc]; - [_definer setBarTo:5]; + if (self = [super init]) + { + _definer = [[InternalDefiner alloc] initWithFoo:4 andBar:5]; + } + return self; +} + +@end + +@interface InheritContainer : InternalDefiner +{ +} + +-(id)init; +@end + +@implementation InheritContainer + +-(id)init +{ + if (self = [super initWithFoo:2 andBar:3]) + { + } return self; } @@ -25,8 +46,10 @@ int main(int argc, const char * argv[]) @autoreleasepool { Container *j = [[Container alloc] init]; + InheritContainer *k = [[InheritContainer alloc] init]; - printf("ivar value = %d", j->_definer->foo); // Set breakpoint 0 here. + printf("ivar value = %u\n", (unsigned)j->_definer->foo); // Set breakpoint 0 here. + printf("ivar value = %u\n", (unsigned)k->foo); // Set breakpoint 1 here. } return 0; }