|
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
}
|