From: <cod...@go...> - 2008-12-08 21:04:50
|
Author: jam...@us... Date: Mon Dec 8 13:03:47 2008 New Revision: 367 Modified: branches/objc2/hoc/HOC_cbits/Class.h branches/objc2/hoc/HOC_cbits/Class.m branches/objc2/hoc/HOC_cbits/NewClass.m Log: Cleaned up recent objective C 2.0-related changes to newClass. Modified: branches/objc2/hoc/HOC_cbits/Class.h ============================================================================== --- branches/objc2/hoc/HOC_cbits/Class.h (original) +++ branches/objc2/hoc/HOC_cbits/Class.h Mon Dec 8 13:03:47 2008 @@ -1,4 +1,9 @@ #include <objc/objc.h> id getClassByName(const char* name); + +Class getSuperclassForClass(Class class); +Class getRootClassForClass(Class super_class); + +Class getClassForObject(id self); Class getSuperClassForObject(id self); Modified: branches/objc2/hoc/HOC_cbits/Class.m ============================================================================== --- branches/objc2/hoc/HOC_cbits/Class.m (original) +++ branches/objc2/hoc/HOC_cbits/Class.m Mon Dec 8 13:03:47 2008 @@ -14,6 +14,42 @@ #endif } +Class getSuperclassForClass(Class class) +{ +#ifdef GNUSTEP + if(CLS_ISRESOLV(class)) + return class->super_class; + else + return getClassByName((const char*) class->super_class); + +#elif defined(__OBJC2__) + return class_getSuperclass(class); +#else + return class->super_class; +#endif +} + +Class getRootClassForClass(Class super_class) +{ + Class root_class; + + for(root_class = super_class; + getSuperclassForClass(root_class) != nil; + root_class = getSuperclassForClass(root_class)) + ; + + return root_class; +} + +Class getClassForObject(id object) +{ +#ifdef __OBJC2__ + return object_getClass(object); +#else + return object->isa; +#endif +} + Class getSuperClassForObject(id self) { #ifdef GNUSTEP Modified: branches/objc2/hoc/HOC_cbits/NewClass.m ============================================================================== --- branches/objc2/hoc/HOC_cbits/NewClass.m (original) +++ branches/objc2/hoc/HOC_cbits/NewClass.m Mon Dec 8 13:03:47 2008 @@ -12,137 +12,132 @@ #define CLS_META _CLS_META #endif -static struct objc_class * getSuper(struct objc_class *class) +static Class allocateClassPair(Class super_class, const char * name) { +#ifdef __OBJC2__ + return objc_allocateClassPair(super_class, name, 0); +#else + Class new_class = calloc( 2, sizeof(struct objc_class) ); + Class meta_class = &new_class[1]; + Class root_class = getRootClassForClass(super_class); + + new_class->isa = meta_class; + new_class->info = CLS_CLASS; + meta_class->info = CLS_META; + + new_class->name = name; + meta_class->name = name; + +# ifdef GNUSTEP + new_class->super_class = (void*)(super_class->name); + meta_class->super_class = (void*)(super_class->isa->name); +# else + new_class->super_class = super_class; + meta_class->super_class = super_class->isa; + meta_class->isa = (void *)root_class->isa; +# endif + + return new_class; +#endif +} + +static void registerClassPair(Class new_class) { +#ifdef GNUSTEP + Module_t module = calloc(1, sizeof(Module)); + Symtab_t symtab = calloc(1, sizeof(Symtab) + sizeof(void*) /* two defs pointers */); + extern void __objc_exec_class (Module_t module); + extern void __objc_resolve_class_links (); + + module->version = 8; + module->size = sizeof(Module); + module->name = strdup(name); + module->symtab = symtab; + symtab->cls_def_cnt = 1; + symtab->defs[0] = new_class; + symtab->defs[1] = NULL; + + __objc_exec_class (module); + __objc_resolve_class_links(); +#elif defined(__OBJC2__) + objc_registerClassPair(new_class); +#else + objc_addClass( new_class ); +#endif +} + +static void addIvarsToClass(Class new_class, struct hoc_ivar_list *ivars) +{ +#ifdef __OBJC2__ + int i; + + for (i = 0; i < ivars->ivar_count; i++) + { + struct hoc_ivar *ivar = &ivars->ivar_list[i]; + class_addIvar(new_class, ivar->ivar_name, + ivar->ivar_size, ivar->ivar_alignment, ivar->ivar_types); + } +#else + Class super_class = getSuperclassForClass(new_class); + + int instance_size; + new_class->ivars = buildIndexedIvarList( + ivars, + super_class->instance_size, + &instance_size); + + new_class->instance_size = super_class->instance_size + instance_size; +#endif +} + +static void addMethodsToClass(Class new_class, struct hoc_method_list *methods) { #ifdef GNUSTEP - if(CLS_ISRESOLV(class)) - return class->super_class; - else - return getClassByName((const char*) class->super_class); - + class_add_method_list(new_class, convertMethodList(methods)); #elif defined(__OBJC2__) - return class_getSuperclass(class); + int i; + for (i = 0; i < methods->method_count; i++) + { + struct hoc_method * m = &methods->method_list[i]; + class_addMethod(new_class, m->method_name, m->method_imp, m->method_types); + } #else - return class->super_class; + new_class->methodLists = calloc( 1, sizeof(struct objc_method_list *) ); + new_class->methodLists[0] = (struct objc_method_list*) -1; + + class_addMethods(new_class, convertMethodList(methods)); #endif } -void newClass(struct objc_class * super_class, +void newClass(Class super_class, const char * name, struct hoc_ivar_list *ivars, struct hoc_method_list *methods, struct hoc_method_list *class_methods) { - struct objc_class * meta_class; - struct objc_class * new_class; + Class meta_class; + Class new_class; assert(objc_lookUpClass(name) == nil); /* Allocate the class and metaclass */ -#ifdef __OBJC2__ - new_class = objc_allocateClassPair(super_class, name, 0); - meta_class = object_getClass(new_class); -#else - new_class = calloc( 2, sizeof(struct objc_class) ); - meta_class = &new_class[1]; - - new_class->isa = meta_class; - new_class->info = CLS_CLASS; - meta_class->info = CLS_META; - - new_class->name = name; - meta_class->name = name; -#endif + new_class = allocateClassPair(super_class, name); + meta_class = getClassForObject(new_class); /* Add instance variables to the class */ -#ifdef __OBJC2__ - { - int i; - - for (i = 0; i < ivars->ivar_count; i++) - { - struct hoc_ivar *ivar = &ivars->ivar_list[i]; - class_addIvar(new_class, ivar->ivar_name, - ivar->ivar_size, ivar->ivar_alignment, ivar->ivar_types); - } - - } -#else - { - int instance_size; - new_class->ivars = buildIndexedIvarList( - ivars, - super_class->instance_size, - &instance_size); - - new_class->instance_size = super_class->instance_size + instance_size; - } -#endif + addIvarsToClass(new_class, ivars); /* Add methods and class methods */ -#ifdef GNUSTEP - new_class->super_class = (void*)(super_class->name); - meta_class->super_class = (void*)(super_class->isa->name); - - { - Module_t module = calloc(1, sizeof(Module)); - Symtab_t symtab = calloc(1, sizeof(Symtab) + sizeof(void*) /* two defs pointers */); - extern void __objc_exec_class (Module_t module); - extern void __objc_resolve_class_links (); - - module->version = 8; - module->size = sizeof(Module); - module->name = strdup(name); - module->symtab = symtab; - symtab->cls_def_cnt = 1; - symtab->defs[0] = new_class; - symtab->defs[1] = NULL; - - __objc_exec_class (module); - __objc_resolve_class_links(); - } + /* I don't know whether order actually matters here in the non-objc2 cases, + so I'm leaving it as it was. */ +#ifdef __OBJC2__ + addMethodsToClass(new_class, methods); + addMethodsToClass(meta_class, class_methods); - class_add_method_list(new_class, convertMethodList(methods)); - class_add_method_list(meta_class, convertMethodList(class_methods)); -#elif defined(__OBJC2__) - { - int i; - for (i = 0; i < methods->method_count; i++) - { - struct hoc_method * m = &methods->method_list[i]; - class_addMethod(new_class, m->method_name, m->method_imp, m->method_types); - } - - for (i = 0; i < class_methods->method_count; i++) - { - struct hoc_method * m = &class_methods->method_list[i]; - class_addMethod(meta_class, m->method_name, m->method_imp, m->method_types); - } - - objc_registerClassPair(new_class); - } + registerClassPair(new_class); #else - { - struct objc_class * root_class; - for(root_class = super_class; - root_class->super_class != nil; - root_class = getSuper(root_class)) - ; - - new_class->methodLists = calloc( 1, sizeof(struct objc_method_list *) ); - meta_class->methodLists = calloc( 1, sizeof(struct objc_method_list *) ); - new_class->methodLists[0] = (struct objc_method_list*) -1; - meta_class->methodLists[0] = (struct objc_method_list*) -1; - - new_class->super_class = super_class; - meta_class->super_class = super_class->isa; - meta_class->isa = (void *)root_class->isa; - - objc_addClass( new_class ); - - class_addMethods(new_class, convertMethodList(methods)); - class_addMethods(meta_class, convertMethodList(class_methods)); - } + registerClassPair(new_class); + + addMethodsToClass(new_class, methods); + addMethodsToClass(meta_class, class_methods); #endif } |