Properly resolve the metaclass's isa pointer.

main
theraven 15 years ago
parent c4cc8f4734
commit 76bb7762ff

@ -222,6 +222,7 @@ BOOL objc_resolve_class(Class cls)
// Mark this class (and its metaclass) as resolved // Mark this class (and its metaclass) as resolved
objc_set_class_flag(cls, objc_class_flag_resolved); objc_set_class_flag(cls, objc_class_flag_resolved);
objc_set_class_flag(cls->isa, objc_class_flag_resolved); objc_set_class_flag(cls->isa, objc_class_flag_resolved);
cls->isa->isa = (Nil == cls->isa->isa) ? root_class : (Class)objc_getClass((char*)cls->isa->isa);
// Fix up the ivar offsets // Fix up the ivar offsets
objc_compute_ivar_offsets(cls); objc_compute_ivar_offsets(cls);
// Send the +load message, if required // Send the +load message, if required

@ -595,10 +595,12 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt
void *object_getIndexedIvars(id obj) void *object_getIndexedIvars(id obj)
{ {
if (nil == obj) { return NULL; } if (nil == obj) { return NULL; }
/*
if (class_isMetaClass(obj->isa)) if (class_isMetaClass(obj->isa))
{ {
return ((char*)obj) + sizeof(struct objc_class); return ((char*)obj) + sizeof(struct objc_class);
} }
*/
return ((char*)obj) + obj->isa->instance_size; return ((char*)obj) + obj->isa->instance_size;
} }
@ -609,7 +611,6 @@ Class object_getClass(id obj)
Class isa = obj->isa; Class isa = obj->isa;
while ((Nil != isa) && objc_test_class_flag(isa, objc_class_flag_hidden_class)) while ((Nil != isa) && objc_test_class_flag(isa, objc_class_flag_hidden_class))
{ {
fprintf(stderr, "Skipping hidden class: %s\n", isa->name);
isa = isa->super_class; isa = isa->super_class;
} }
return isa; return isa;

@ -51,7 +51,7 @@ static Class allocateLockClass(Class superclass)
// Set the superclass pointer to the name. The runtime will fix this when // Set the superclass pointer to the name. The runtime will fix this when
// the class links are resolved. // the class links are resolved.
newClass->name = superclass->name; newClass->name = superclass->name;
newClass->info = objc_class_flag_resolved | newClass->info = objc_class_flag_resolved | objc_class_flag_initialized |
objc_class_flag_class | objc_class_flag_user_created | objc_class_flag_class | objc_class_flag_user_created |
objc_class_flag_new_abi | objc_class_flag_hidden_class | objc_class_flag_new_abi | objc_class_flag_hidden_class |
objc_class_flag_lock_class; objc_class_flag_lock_class;
@ -62,6 +62,8 @@ static Class allocateLockClass(Class superclass)
{ {
newClass->info |= objc_class_flag_meta; newClass->info |= objc_class_flag_meta;
} }
mutex_t *lock = object_getIndexedIvars(newClass);
INIT_LOCK(*lock);
return newClass; return newClass;
} }
@ -72,7 +74,6 @@ static inline Class initLockObject(id obj)
if (class_isMetaClass(obj->isa)) if (class_isMetaClass(obj->isa))
{ {
obj->isa = lockClass; obj->isa = lockClass;
objc_send_initialize(obj);
} }
else else
{ {
@ -83,10 +84,7 @@ static inline Class initLockObject(id obj)
types); types);
obj->isa = lockClass; obj->isa = lockClass;
} }
mutex_t *lock = object_getIndexedIvars(lockClass);
INIT_LOCK(*lock);
fprintf(stderr, "Making %p hidden class for %p\n", lockClass, obj);
return lockClass; return lockClass;
} }

Loading…
Cancel
Save