Overview
Comment: | runtime: Add support for non-fragile ivars. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
3780f1462e0c05396d655d3e9a47a3e7 |
User & Date: | js on 2013-11-22 23:24:03 |
Other Links: | manifest | tags |
Context
2013-11-22
| ||
23:27 | make tarball: Make doxygen less verbose. check-in: 430a2dac04 user: js tags: trunk | |
23:24 | runtime: Add support for non-fragile ivars. check-in: 3780f1462e user: js tags: trunk | |
23:23 | exception.m: Handle class name @id. check-in: 9b9b00c5d9 user: js tags: trunk | |
Changes
Modified src/OFObject.m from [5387ac3c3a] to [8e2d9bc735].
︙ | ︙ | |||
215 216 217 218 219 220 221 | void **extra) { OFObject *instance; size_t instanceSize; instanceSize = class_getInstanceSize(class); | | | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | void **extra) { OFObject *instance; size_t instanceSize; instanceSize = class_getInstanceSize(class); if OF_UNLIKELY (extraAlignment > 1) extraAlignment = ((instanceSize + extraAlignment - 1) & ~(extraAlignment - 1)) - extraAlignment; instance = malloc(PRE_IVARS_ALIGN + instanceSize + extraAlignment + extraSize); if OF_UNLIKELY (instance == nil) { |
︙ | ︙ |
Modified src/runtime/class.m from [179d6825a3] to [0500525bf9].
︙ | ︙ | |||
196 197 198 199 200 201 202 203 204 205 206 207 208 209 | OBJC_ERROR("Not enough memory for subclass list of class %s\n", cls->superclass->name); cls->superclass->subclass_list[i] = cls; cls->superclass->subclass_list[i + 1] = Nil; } static void setup_class(Class cls) { const char *superclass; if (cls->info & OBJC_CLASS_INFO_SETUP) return; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | OBJC_ERROR("Not enough memory for subclass list of class %s\n", cls->superclass->name); 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; if (cls->info & OBJC_CLASS_INFO_SETUP) return; |
︙ | ︙ | |||
222 223 224 225 226 227 228 229 230 231 232 233 234 235 | cls->superclass = super; cls->isa->superclass = super->isa; add_subclass(cls); add_subclass(cls->isa); } else cls->isa->superclass = cls; cls->info |= OBJC_CLASS_INFO_SETUP; cls->isa->info |= OBJC_CLASS_INFO_SETUP; } static void initialize_class(Class cls) | > > | 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | cls->superclass = super; cls->isa->superclass = super->isa; 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; } static void initialize_class(Class cls) |
︙ | ︙ |
Modified src/runtime/runtime-private.h from [a0b575feaf] to [ceb0d6303e].
︙ | ︙ | |||
18 19 20 21 22 23 24 | struct objc_abi_class { struct objc_abi_class *metaclass; const char *superclass; const char *name; unsigned long version; unsigned long info; | | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | struct objc_abi_class { struct objc_abi_class *metaclass; const char *superclass; const char *name; unsigned long version; unsigned long info; 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; int32_t **ivar_offsets; void *properties; }; struct objc_abi_method { const char *name; const char *types; IMP imp; |
︙ | ︙ |
Modified src/runtime/runtime.h from [8b0a6c7397] to [ced3444651].
︙ | ︙ | |||
37 38 39 40 41 42 43 | struct objc_class { Class isa; Class superclass; const char *name; unsigned long version; unsigned long info; | | | | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | struct objc_class { Class isa; Class superclass; const char *name; unsigned long version; unsigned long info; 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; int32_t **ivar_offsets; struct objc_property_list *properties; }; enum objc_class_info { OBJC_CLASS_INFO_CLASS = 0x001, OBJC_CLASS_INFO_METACLASS = 0x002, OBJC_CLASS_INFO_NEW_ABI = 0x010, |
︙ | ︙ |