Overview
Comment: | runtime: Add objc_{allocate,register}ClassPair |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
5088c339bf4aac699780b8d295fbfbe5 |
User & Date: | js on 2016-07-02 22:26:07 |
Other Links: | manifest | tags |
Context
2016-07-02
| ||
23:35 | OFString+URLEncoding.m: Do not parse + as space check-in: 32bc855af9 user: js tags: trunk | |
22:26 | runtime: Add objc_{allocate,register}ClassPair check-in: 5088c339bf user: js tags: trunk | |
2016-06-27
| ||
16:09 | Move m4 directory to build-aux check-in: 434395664e user: js tags: trunk | |
Changes
Modified src/runtime/class.m from [5e1eae7608] to [8bf9db28f4].
︙ | ︙ | |||
347 348 349 350 351 352 353 354 355 356 357 358 359 360 | return; } initialize_class(cls); objc_global_mutex_unlock(); } void objc_register_all_classes(struct objc_abi_symtab *symtab) { for (uint16_t i = 0; i < symtab->cls_def_cnt; i++) { struct objc_abi_class *cls = (struct objc_abi_class*)symtab->defs[i]; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 | return; } initialize_class(cls); objc_global_mutex_unlock(); } static void process_load_queue() { for (size_t i = 0; i < load_queue_cnt; i++) { setup_class(load_queue[i]); if (load_queue[i]->info & OBJC_CLASS_INFO_SETUP) { call_load(load_queue[i]); load_queue_cnt--; if (load_queue_cnt == 0) { free(load_queue); load_queue = NULL; continue; } load_queue[i] = load_queue[load_queue_cnt]; load_queue = realloc(load_queue, sizeof(Class) * load_queue_cnt); if (load_queue == NULL) OBJC_ERROR("Not enough memory for load queue!"); } } } void objc_register_all_classes(struct objc_abi_symtab *symtab) { for (uint16_t i = 0; i < symtab->cls_def_cnt; i++) { struct objc_abi_class *cls = (struct objc_abi_class*)symtab->defs[i]; |
︙ | ︙ | |||
382 383 384 385 386 387 388 | load_queue[load_queue_cnt++] = cls; } } else cls->info |= OBJC_CLASS_INFO_LOADED; } | < < | | | < > > | > | | > > > | > > | > > > | > > | > > > > > > > > | > > | > | > | > > > | | > > | > > > > | > | > | 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 | load_queue[load_queue_cnt++] = cls; } } else cls->info |= OBJC_CLASS_INFO_LOADED; } process_load_queue(); } Class objc_allocateClassPair(Class superclass, const char *name, size_t extra_bytes) { struct objc_class *cls, *metaclass; Class iter, rootclass = Nil; if ((cls = calloc(1, sizeof(*cls))) == NULL || (metaclass = calloc(1, sizeof(*cls))) == NULL) OBJC_ERROR("Not enough memory to allocate class pair for class " "%s!", name) cls->isa = metaclass; cls->superclass = superclass; cls->name = name; cls->info = OBJC_CLASS_INFO_CLASS; cls->instance_size = (superclass != Nil ? superclass->instance_size : 0) + extra_bytes; for (iter = superclass; iter != Nil; iter = iter->superclass) rootclass = iter; metaclass->isa = (rootclass != Nil ? rootclass->isa : cls); metaclass->superclass = (superclass != Nil ? superclass->isa : Nil); metaclass->name = name; metaclass->info = OBJC_CLASS_INFO_CLASS; metaclass->instance_size = (superclass != Nil ? superclass->isa->instance_size : 0) + extra_bytes; return cls; } void objc_registerClassPair(Class cls) { objc_global_mutex_lock(); register_class((struct objc_abi_class*)cls); if (cls->superclass != Nil) { add_subclass(cls); add_subclass(cls->isa); } cls->info |= OBJC_CLASS_INFO_SETUP; cls->isa->info |= OBJC_CLASS_INFO_SETUP; if (has_load(cls)) call_load(cls); else cls->info |= OBJC_CLASS_INFO_LOADED; process_load_queue(); objc_global_mutex_unlock(); } id objc_lookUpClass(const char *name) { Class cls; |
︙ | ︙ |
Modified src/runtime/runtime.h from [a4ce0a161a] to [ddc272f296].
︙ | ︙ | |||
13 14 15 16 17 18 19 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #ifndef __OBJFW_RUNTIME_H__ #define __OBJFW_RUNTIME_H__ | > > > > > > > | | > | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #ifndef __OBJFW_RUNTIME_H__ #define __OBJFW_RUNTIME_H__ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS #endif #include <stdbool.h> #include <stddef.h> #include <stdint.h> #ifndef __has_feature # define __has_feature(x) 0 #endif #ifndef __has_attribute # define __has_attribute(x) 0 |
︙ | ︙ | |||
189 190 191 192 193 194 195 196 197 198 199 200 201 202 | #ifdef __cplusplus extern "C" { #endif extern SEL sel_registerName(const char*); extern const char* sel_getName(SEL); extern bool sel_isEqual(SEL, SEL); extern id objc_lookUpClass(const char*); extern id objc_getClass(const char*); extern id objc_getRequiredClass(const char*); extern unsigned int objc_getClassList(Class*, unsigned int); extern Class* objc_copyClassList(unsigned int*); extern bool class_isMetaClass(Class); extern const char* class_getName(Class); | > > | 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | #ifdef __cplusplus extern "C" { #endif extern SEL sel_registerName(const char*); extern const char* sel_getName(SEL); extern bool sel_isEqual(SEL, SEL); extern Class objc_allocateClassPair(Class, const char*, size_t); extern void objc_registerClassPair(Class); extern id objc_lookUpClass(const char*); extern id objc_getClass(const char*); extern id objc_getRequiredClass(const char*); extern unsigned int objc_getClassList(Class*, unsigned int); extern Class* objc_copyClassList(unsigned int*); extern bool class_isMetaClass(Class); extern const char* class_getName(Class); |
︙ | ︙ |