From 5a35fff19d5f782c62019b1870317936e367aa66 Mon Sep 17 00:00:00 2001 From: David Chisnall Date: Sun, 26 Apr 2020 12:41:19 +0100 Subject: [PATCH] Add test for checking whether a class supports fast ARC. --- Test/CMakeLists.txt | 1 + Test/FastARC.m | 104 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 Test/FastARC.m diff --git a/Test/CMakeLists.txt b/Test/CMakeLists.txt index bec7f2b..10993b8 100644 --- a/Test/CMakeLists.txt +++ b/Test/CMakeLists.txt @@ -26,6 +26,7 @@ set(TESTS ConstantString.m Category.m ExceptionTest.m + FastARC.m Forward.m ManyManySelectors.m NestedExceptions.m diff --git a/Test/FastARC.m b/Test/FastARC.m new file mode 100644 index 0000000..d7c6d6a --- /dev/null +++ b/Test/FastARC.m @@ -0,0 +1,104 @@ +#include "Test.h" +#include + +static BOOL called; + +@interface AllUnsafe : Test @end +@implementation AllUnsafe +- (id)retain +{ + return self; +} +- (void)release {} +- (id)autorelease +{ + return self; +} +@end + +@interface Retain : AllUnsafe @end +@implementation Retain +- (id)retain +{ + called = YES; + return self; +} +@end + +@interface RetainSafe : AllUnsafe @end +@implementation RetainSafe +- (id)retain +{ + return self; +} +- (void)_ARCCompliantRetainRelease {} +@end + +@interface Release : AllUnsafe @end +@implementation Release +- (void)release +{ + called = YES; +} +@end + +@interface ReleaseSafe : AllUnsafe @end +@implementation ReleaseSafe +- (void)release +{ +} +- (void)_ARCCompliantRetainRelease {} +@end + +@interface Autorelease : AllUnsafe @end +@implementation Autorelease +- (id)autorelease +{ + called = YES; + return self; +} +@end + +@interface AutoreleaseSafe : AllUnsafe @end +@implementation AutoreleaseSafe +- (id)autorelease +{ + return self; +} +- (void)_ARCCompliantRetainRelease {} +@end + +void check(id obj, BOOL expected) +{ + fprintf(stderr, "Checking %s\n", class_getName(object_getClass(obj))); +} + +int main() +{ + called = NO; + objc_retain([Retain new]); + assert(called == YES); + + called = NO; + objc_retain([RetainSafe new]); + assert(called == NO); + + called = NO; + objc_release([Release new]); + assert(called == YES); + + called = NO; + objc_release([ReleaseSafe new]); + assert(called == NO); + + called = NO; + objc_autorelease([Autorelease new]); + assert(called == YES); + + called = NO; + objc_autorelease([AutoreleaseSafe new]); + assert(called == NO); + + return 0; +} +