X-Git-Url: https://git.saurik.com/apple/objc4.git/blobdiff_plain/7c0e6487d7b67b6bf6c632300ee4b74e8950b051..7af964d1562d70f51a8e9aca24215ac3d83d0624:/test/future1.m diff --git a/test/future1.m b/test/future1.m new file mode 100644 index 0000000..1423a5f --- /dev/null +++ b/test/future1.m @@ -0,0 +1,86 @@ +#include "test.h" +#include +#include +#include +#include +#include "future.h" + +@implementation Sub2 ++(int)method { + return 2; +} ++(Class)classref { + return [Sub2 class]; +} +@end + +@implementation SubSub2 ++(int)method { + return 1 + [super method]; +} +@end + +int main() +{ + Class oldSuper; + Class oldSub1; + Class newSub1; +#if !__OBJC2__ + Class oldSub2; + Class newSub2; + uintptr_t buf[20]; +#endif + + // objc_getFutureClass with existing class + oldSuper = objc_getFutureClass("Super"); + testassert(oldSuper == [Super class]); + + // objc_getFutureClass with missing class + oldSub1 = objc_getFutureClass("Sub1"); + testassert(oldSub1); + testassert(malloc_size(oldSub1) > 0); + testassert(objc_getClass("Sub1") == Nil); + + // objc_getFutureClass a second time + testassert(oldSub1 == objc_getFutureClass("Sub1")); + +#if !__OBJC2__ + // objc_setFutureClass with existing class + oldSub2 = objc_getClass("Sub2"); + testassert(oldSub2 == [Sub2 class]); + testassert(oldSub2 == class_getSuperclass(objc_getClass("SubSub2"))); + objc_setFutureClass((Class)buf, "Sub2"); + testassert(0 == strcmp(class_getName((Class)buf), "Sub2")); + newSub2 = objc_getClass("Sub2"); + testassert(newSub2 == (Class)buf); + testassert(newSub2 != oldSub2); + // check classrefs + testassert(newSub2 == [Sub2 class]); + testassert(newSub2 == [newSub2 class]); + testassert(newSub2 == [newSub2 classref]); + testassert(newSub2 != [oldSub2 class]); + // check superclass chains + testassert(newSub2 == class_getSuperclass(objc_getClass("SubSub2"))); +#else + // 64-bit ABI ignores objc_setFutureClass. +#endif + + // Load class Sub1 + dlopen("future2.out", 0); + + // Verify use of future class + newSub1 = objc_getClass("Sub1"); + testassert(oldSub1 == newSub1); + testassert(newSub1 == [newSub1 classref]); + testassert(newSub1 == class_getSuperclass(objc_getClass("SubSub1"))); + + testassert(1 == [oldSub1 method]); + testassert(1 == [newSub1 method]); +#if !__OBJC2__ + testassert(2 == [newSub2 method]); + testassert(2 == [oldSub2 method]); + testassert(3 == [SubSub2 method]); +#endif + + succeed(__FILE__); +}