void *object_getIndexedIvars(id obj) { CHECK_ARG(obj); size_t size = classForObject(obj)->instance_size; if ((0 == size) && class_isMetaClass(classForObject(obj))) { Class cls = (Class)obj; if (objc_test_class_flag(cls, objc_class_flag_new_abi)) { size = sizeof(struct objc_class); } else { size = sizeof(struct legacy_abi_objc_class); } } return ((char*)obj) + size; }
Class object_setClass(id obj, Class cls) { CHECK_ARG(obj); // If this is a small object, then don't set its class. uintptr_t addr = (uintptr_t)obj; if (addr & 1) { return classForObject(obj); } Class oldClass = obj->isa; obj->isa = cls; return oldClass; }
Class object_getClass(id obj) { CHECK_ARG(obj); Class isa = classForObject(obj); while ((Nil != isa) && objc_test_class_flag(isa, objc_class_flag_hidden_class)) { isa = isa->super_class; } return isa; }
/** * Calls C++ destructors in the correct order. */ PRIVATE void call_cxx_destruct(id obj) { static SEL cxx_destruct; if (NULL == cxx_destruct) { cxx_destruct = sel_registerName(".cxx_destruct"); } // Don't call object_getClass(), because we want to get hidden classes too Class cls = classForObject(obj); while (cls) { struct objc_slot *slot = objc_get_slot(cls, cxx_destruct); cls = Nil; if (NULL != slot) { cls = slot->owner->super_class; slot->method(obj, cxx_destruct); } } }
PRIVATE void call_cxx_construct(id obj) { call_cxx_construct_for_class(classForObject(obj), obj); }