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
objc_set_class_flag(cls, 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
objc_compute_ivar_offsets(cls);
// 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)
{
if (nil == obj) { return NULL; }
/*
if (class_isMetaClass(obj->isa))
{
return ((char*)obj) + sizeof(struct objc_class);
}
*/
return ((char*)obj) + obj->isa->instance_size;
}
@ -609,7 +611,6 @@ Class object_getClass(id obj)
Class isa = obj->isa;
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;
}
return isa;

@ -51,7 +51,7 @@ static Class allocateLockClass(Class superclass)
// Set the superclass pointer to the name. The runtime will fix this when
// the class links are resolved.
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_new_abi | objc_class_flag_hidden_class |
objc_class_flag_lock_class;
@ -62,6 +62,8 @@ static Class allocateLockClass(Class superclass)
{
newClass->info |= objc_class_flag_meta;
}
mutex_t *lock = object_getIndexedIvars(newClass);
INIT_LOCK(*lock);
return newClass;
}
@ -72,7 +74,6 @@ static inline Class initLockObject(id obj)
if (class_isMetaClass(obj->isa))
{
obj->isa = lockClass;
objc_send_initialize(obj);
}
else
{
@ -83,10 +84,7 @@ static inline Class initLockObject(id obj)
types);
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;
}

Loading…
Cancel
Save