#include "test.h"
#include <objc/runtime.h>
@interface Super { id isa; } @end
@implementation Super
+(void)initialize { }
+class { return self; }
+new { return class_createInstance(self, 0); }
-(void)dealloc { object_dispose(self); }
@end
@interface Sub1 : Super {
// id isa; // 0..4
BOOL b; // 4..5
}
@end
@implementation Sub1 @end
@interface Sub2 : Sub1 {
// id isa // 0..4 0..8
// BOOL b // 4..5 8..9
BOOL b2; // 5..6 9..10
id o; // 8..12 16..24
}
@end
@implementation Sub2 @end
@interface Sub3 : Sub1 {
// id isa; // 0..4 0..8
// BOOL b; // 4..5 8..9
id o; // 8..12 16..24
BOOL b2; // 12..13 24..25
}
@end
@implementation Sub3 @end
int main()
{
testassert(sizeof(id) == class_getInstanceSize([Super class]));
testassert(2*sizeof(id) == class_getInstanceSize([Sub1 class]));
testassert(3*sizeof(id) == class_getInstanceSize([Sub2 class]));
testassert(4*sizeof(id) == class_getInstanceSize([Sub3 class]));
id o;
o = [Super new];
testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa));
[o dealloc];
o = [Sub1 new];
testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa));
[o dealloc];
o = [Sub2 new];
testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa));
[o dealloc];
o = [Sub3 new];
testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa));
[o dealloc];
succeed(__FILE__);
}