Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -217,11 +217,11 @@ OFObject *instance; size_t instanceSize; instanceSize = class_getInstanceSize(class); - if OF_UNLIKELY (extraAlignment > 0) + if OF_UNLIKELY (extraAlignment > 1) extraAlignment = ((instanceSize + extraAlignment - 1) & ~(extraAlignment - 1)) - extraAlignment; instance = malloc(PRE_IVARS_ALIGN + instanceSize + extraAlignment + extraSize); Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -198,10 +198,40 @@ cls->superclass->subclass_list[i] = cls; cls->superclass->subclass_list[i + 1] = Nil; } + +static void +update_ivar_offsets(Class cls) +{ + unsigned i; + + if (!(cls->info & OBJC_CLASS_INFO_NEW_ABI)) + return; + + if (cls->instance_size > 0) + return; + + cls->instance_size = -cls->instance_size; + + if (cls->superclass != Nil) { + cls->instance_size += cls->superclass->instance_size; + + if (cls->ivars != NULL) { + for (i = 0; i < cls->ivars->count; i++) { + cls->ivars->ivars[i].offset += + cls->superclass->instance_size; + *cls->ivar_offsets[i] = + cls->ivars->ivars[i].offset; + } + } + } else + for (i = 0; i < cls->ivars->count; i++) + *cls->ivar_offsets[i] = cls->ivars->ivars[i].offset; +} + static void setup_class(Class cls) { const char *superclass; @@ -224,10 +254,12 @@ add_subclass(cls); add_subclass(cls->isa); } else cls->isa->superclass = cls; + + update_ivar_offsets(cls); cls->info |= OBJC_CLASS_INFO_SETUP; cls->isa->info |= OBJC_CLASS_INFO_SETUP; } Index: src/runtime/runtime-private.h ================================================================== --- src/runtime/runtime-private.h +++ src/runtime/runtime-private.h @@ -20,20 +20,20 @@ struct objc_abi_class *metaclass; const char *superclass; const char *name; unsigned long version; unsigned long info; - unsigned long instance_size; + long instance_size; void *ivars; struct objc_abi_method_list *methodlist; void *dtable; void *subclass_list; void *sibling_class; void *protocols; void *gc_object_type; long abi_version; - void *ivar_offsets; + int32_t **ivar_offsets; void *properties; }; struct objc_abi_method { const char *name; Index: src/runtime/runtime.h ================================================================== --- src/runtime/runtime.h +++ src/runtime/runtime.h @@ -39,20 +39,20 @@ Class isa; Class superclass; const char *name; unsigned long version; unsigned long info; - unsigned long instance_size; + long instance_size; struct objc_ivar_list *ivars; struct objc_method_list *methodlist; struct objc_sparsearray *dtable; Class *subclass_list; void *sibling_class; struct objc_protocol_list *protocols; void *gc_object_type; unsigned long abi_version; - void *ivar_offsets; + int32_t **ivar_offsets; struct objc_property_list *properties; }; enum objc_class_info { OBJC_CLASS_INFO_CLASS = 0x001,