]> git.saurik.com Git - apple/objc4.git/blobdiff - test/setAssociatedObjectHook.m
objc4-818.2.tar.gz
[apple/objc4.git] / test / setAssociatedObjectHook.m
index e244d5c1386d475e07cb6ac89494fdc6e2829b9a..97f78c12cf16319799a6b34e800f795c16875e0d 100644 (file)
@@ -1,47 +1,46 @@
-// TEST_CONFIG
+/*
+    TEST_CONFIG MEM=mrc
+    TEST_ENV OBJC_DISABLE_NONPOINTER_ISA=YES
+*/
 
 #include "test.h"
 #include "testroot.i"
 
-id sawObject;
-const void *sawKey;
-id sawValue;
-objc_AssociationPolicy sawPolicy;
+bool hasAssociations = false;
 
-objc_hook_setAssociatedObject originalSetAssociatedObject;
+@interface TestRoot (AssocHooks)
+@end
 
-void hook(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy) {
-    sawObject = object;
-    sawKey = key;
-    sawValue = value;
-    sawPolicy = policy;
-    originalSetAssociatedObject(object, key, value, policy);
+@implementation TestRoot (AssocHooks)
+
+- (void)_noteAssociatedObjects {
+  hasAssociations = true;
+}
+
+// -_noteAssociatedObjects is currently limited to raw-isa custom-rr to avoid overhead
+- (void) release {
 }
 
+@end
+
 int main() {
     id obj = [TestRoot new];
     id value = [TestRoot new];
     const void *key = "key";
     objc_setAssociatedObject(obj, key, value, OBJC_ASSOCIATION_RETAIN);
-    testassert(sawObject == nil);
-    testassert(sawKey == nil);
-    testassert(sawValue == nil);
-    testassert(sawPolicy == 0);
+    testassert(hasAssociations == true);
 
     id out = objc_getAssociatedObject(obj, key);
     testassert(out == value);
 
-    objc_setHook_setAssociatedObject(hook, &originalSetAssociatedObject);
-
+    hasAssociations = false;
     key = "key2";
     objc_setAssociatedObject(obj, key, value, OBJC_ASSOCIATION_RETAIN);
-    testassert(sawObject == obj);
-    testassert(sawKey == key);
-    testassert(sawValue == value);
-    testassert(sawPolicy == OBJC_ASSOCIATION_RETAIN);
+    testassert(hasAssociations == false); //only called once
+
 
     out = objc_getAssociatedObject(obj, key);
     testassert(out == value);
 
     succeed(__FILE__);
-}
\ No newline at end of file
+}