X-Git-Url: https://git.saurik.com/apple/objc4.git/blobdiff_plain/7af964d1562d70f51a8e9aca24215ac3d83d0624..8070259c3936ee823b758fc1ad1645ae016ba500:/test/runtime.m diff --git a/test/runtime.m b/test/runtime.m index ea44936..5700333 100644 --- a/test/runtime.m +++ b/test/runtime.m @@ -1,83 +1,174 @@ -#include "test.h" +/* +TEST_RUN_OUTPUT +objc\[\d+\]: class `SwiftV1Class\' not linked into application +objc\[\d+\]: class `DoesNotExist\' not linked into application +OK: runtime.m +OR +confused by Foundation +OK: runtime.m +END +*/ + +#include "test.h" +#include "testroot.i" #include #include #include #include -@interface Super { id isa; } @end -@implementation Super -+(void)initialize { } -+class { return self; } -@end +#if __has_feature(objc_arc) -@interface Sub : Super { } @end +int main() +{ + testwarn("rdar://11368528 confused by Foundation"); + fprintf(stderr, "confused by Foundation\n"); + succeed(__FILE__); +} + +#else + +@interface Sub : TestRoot @end @implementation Sub @end +#if __OBJC2__ +# define TEST_SWIFT 1 +#else +# define TEST_SWIFT 0 +#endif + +#define SwiftV1MangledName "_TtC6Module12SwiftV1Class" + +#if TEST_SWIFT +__attribute__((objc_runtime_name(SwiftV1MangledName))) +@interface SwiftV1Class : TestRoot @end +@implementation SwiftV1Class @end +#endif + int main() { Class list[100]; - unsigned int count, count0; + Class *list2; + unsigned int count, count0, count2; unsigned int i; - int foundSuper; + int foundTestRoot; int foundSub; + int foundSwiftV1; const char **names; Dl_info info; - [Super class]; + [TestRoot class]; // This shouldn't touch any classes. dladdr(&_mh_execute_header, &info); names = objc_copyClassNamesForImage(info.dli_fname, &count); testassert(names); +#if TEST_SWIFT + testassert(count == 3); +#else testassert(count == 2); +#endif testassert(names[count] == NULL); - foundSuper = 0; + foundTestRoot = 0; foundSub = 0; + foundSwiftV1 = 0; for (i = 0; i < count; i++) { - if (0 == strcmp(names[i], "Super")) foundSuper++; + if (0 == strcmp(names[i], "TestRoot")) foundTestRoot++; if (0 == strcmp(names[i], "Sub")) foundSub++; + if (0 == strcmp(names[i], "Module.SwiftV1Class")) foundSwiftV1++; } - testassert(foundSuper == 1); - testassert(foundSub == 1); - - + testassert(foundTestRoot == 1); + testassert(foundSub == 1); +#if TEST_SWIFT + testassert(foundSwiftV1 == 1); +#endif + + // class Sub hasn't been touched - make sure it's in the class list too count0 = objc_getClassList(NULL, 0); testassert(count0 >= 2 && count0 < 100); - + list[count0-1] = NULL; count = objc_getClassList(list, count0-1); testassert(list[count0-1] == NULL); testassert(count == count0); - + count = objc_getClassList(list, count0); testassert(count == count0); - foundSuper = 0; + + for (i = 0; i < count; i++) { + testprintf("%s\n", class_getName(list[i])); + } + + foundTestRoot = 0; foundSub = 0; + foundSwiftV1 = 0; for (i = 0; i < count; i++) { - if (0 == strcmp(class_getName(list[i]), "Super")) foundSuper++; + if (0 == strcmp(class_getName(list[i]), "TestRoot")) foundTestRoot++; if (0 == strcmp(class_getName(list[i]), "Sub")) foundSub++; + if (0 == strcmp(class_getName(list[i]), "Module.SwiftV1Class")) foundSwiftV1++; // list should be non-meta classes only testassert(!class_isMetaClass(list[i])); } - testassert(foundSuper == 1); + testassert(foundTestRoot == 1); testassert(foundSub == 1); +#if TEST_SWIFT + testassert(foundSwiftV1 == 1); +#endif // fixme check class handler - testassert(objc_getClass("Super") == [Super class]); + testassert(objc_getClass("TestRoot") == [TestRoot class]); +#if TEST_SWIFT + testassert(objc_getClass("Module.SwiftV1Class") == [SwiftV1Class class]); + testassert(objc_getClass(SwiftV1MangledName) == [SwiftV1Class class]); +#endif + testassert(objc_getClass("SwiftV1Class") == nil); testassert(objc_getClass("DoesNotExist") == nil); testassert(objc_getClass(NULL) == nil); - testassert(objc_getMetaClass("Super") == [Super class]->isa); + testassert(objc_getMetaClass("TestRoot") == object_getClass([TestRoot class])); +#if TEST_SWIFT + testassert(objc_getMetaClass("Module.SwiftV1Class") == object_getClass([SwiftV1Class class])); + testassert(objc_getMetaClass(SwiftV1MangledName) == object_getClass([SwiftV1Class class])); +#endif + testassert(objc_getMetaClass("SwiftV1Class") == nil); testassert(objc_getMetaClass("DoesNotExist") == nil); testassert(objc_getMetaClass(NULL) == nil); // fixme check class no handler - testassert(objc_lookUpClass("Super") == [Super class]); + testassert(objc_lookUpClass("TestRoot") == [TestRoot class]); +#if TEST_SWIFT + testassert(objc_lookUpClass("Module.SwiftV1Class") == [SwiftV1Class class]); + testassert(objc_lookUpClass(SwiftV1MangledName) == [SwiftV1Class class]); +#endif + testassert(objc_lookUpClass("SwiftV1Class") == nil); testassert(objc_lookUpClass("DoesNotExist") == nil); testassert(objc_lookUpClass(NULL) == nil); + testassert(! object_isClass(nil)); + testassert(! object_isClass([TestRoot new])); + testassert(object_isClass([TestRoot class])); + testassert(object_isClass(object_getClass([TestRoot class]))); + testassert(object_isClass([Sub class])); + testassert(object_isClass(object_getClass([Sub class]))); +#if TEST_SWIFT + testassert(object_isClass([SwiftV1Class class])); + testassert(object_isClass(object_getClass([SwiftV1Class class]))); +#endif + + list2 = objc_copyClassList(&count2); + testassert(count2 == count); + testassert(list2); + testassert(malloc_size(list2) >= (1+count2) * sizeof(Class)); + for (i = 0; i < count; i++) { + testassert(list[i] == list2[i]); + } + testassert(list2[count] == NULL); + free(list2); + free(objc_copyClassList(NULL)); + succeed(__FILE__); } + +#endif