From 8dbee52d247f9966bc58582301e19f22783c4796 Mon Sep 17 00:00:00 2001 From: rfm Date: Thu, 20 Feb 2020 17:13:09 +0000 Subject: [PATCH 1/3] Fix fast-ARC checks. Check for release and autorelease as well as for retain. --- dtable.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dtable.c b/dtable.c index 8190089..b7b84d0 100644 --- a/dtable.c +++ b/dtable.c @@ -104,14 +104,14 @@ static void checkARCAccessors(Class cls) objc_clear_class_flag(cls, objc_class_flag_fast_arc); return; } - owner = ownerForMethod(cls, retain); + owner = ownerForMethod(cls, release); if ((NULL != owner) && !ownsMethod(owner, isARC)) { ARC_DEBUG_LOG("%s does not support ARC correctly (implements release)\n", cls->name); objc_clear_class_flag(cls, objc_class_flag_fast_arc); return; } - owner = ownerForMethod(cls, retain); + owner = ownerForMethod(cls, autorelease); if ((NULL != owner) && !ownsMethod(owner, isARC)) { ARC_DEBUG_LOG("%s does not support ARC correctly (implements autorelease)\n", cls->name); From 2d87ac45a1a6fac9491357ef54c073b2c84b5ffb Mon Sep 17 00:00:00 2001 From: David Chisnall Date: Sun, 26 Apr 2020 12:41:04 +0100 Subject: [PATCH 2/3] Fix logging macro --- dtable.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dtable.c b/dtable.c index b7b84d0..aa6eb96 100644 --- a/dtable.c +++ b/dtable.c @@ -77,8 +77,9 @@ static BOOL ownsMethod(Class cls, SEL sel) } +#define DEBUG_ARC_COMPAT #ifdef DEBUG_ARC_COMPAT -#define ARC_DEBUG_LOG(...) fprintf(stderr, __VA_LIST__) +#define ARC_DEBUG_LOG(...) fprintf(stderr, __VA_ARGS__) #else #define ARC_DEBUG_LOG(...) do {} while(0) #endif From 5a35fff19d5f782c62019b1870317936e367aa66 Mon Sep 17 00:00:00 2001 From: David Chisnall Date: Sun, 26 Apr 2020 12:41:19 +0100 Subject: [PATCH 3/3] 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; +} +