4 #include "swift-class-def.m"
7 // _objc_swiftMetadataInitializer hooks for the classes in swift-class-def.m
9 Class initSuper(Class cls __unused, void *arg __unused)
11 // This test provokes objc's callback out of superclass order.
12 // SwiftSub's init is first. SwiftSuper's init is never called.
14 fail("SwiftSuper's init should not have been called");
17 bool isRealized(Class cls)
19 // check the is-realized bits directly
22 # define mask (~(uintptr_t)7)
24 # define mask (~(uintptr_t)3)
26 #define RW_REALIZED (1<<31)
28 uintptr_t rw = ((uintptr_t *)cls)[4] & mask; // class_t->data
29 return ((uint32_t *)rw)[0] & RW_REALIZED; // class_rw_t->flags
32 static int SubInits = 0;
33 Class initSub(Class cls, void *arg)
35 testprintf("initSub callback\n");
37 extern uintptr_t OBJC_CLASS_$_SwiftSuper;
38 extern uintptr_t OBJC_CLASS_$_SwiftSub;
39 Class RawSwiftSuper = (Class)&OBJC_CLASS_$_SwiftSuper;
40 Class RawSwiftSub = (Class)&OBJC_CLASS_$_SwiftSub;
42 testassert(SubInits == 0);
44 testassert(arg == nil);
45 testassert(0 == strcmp(class_getName(cls), "SwiftSub"));
46 testassert(cls == RawSwiftSub);
47 testassert(!isRealized(RawSwiftSuper));
48 testassert(!isRealized(RawSwiftSub));
50 testprintf("initSub beginning _objc_realizeClassFromSwift\n");
51 _objc_realizeClassFromSwift(cls, cls);
52 testprintf("initSub finished _objc_realizeClassFromSwift\n");
54 testassert(isRealized(RawSwiftSuper));
55 testassert(isRealized(RawSwiftSub));
63 testassert(SubInits == 0);
64 testprintf("calling [SwiftSub class]\n");
66 testprintf("finished [SwiftSub class]\n");
67 testassert(SubInits == 1);