]> git.saurik.com Git - apple/objc4.git/blame - test/weak2.m
objc4-818.2.tar.gz
[apple/objc4.git] / test / weak2.m
CommitLineData
13ba007e
A
1// See instructions in weak.h
2
3#include "test.h"
4#include "weak.h"
5#include <objc/objc-internal.h>
6
7int state = 0;
8
9static void *noop_fn(void *self, SEL _cmd __unused) {
10 return self;
11}
12static void *retain_fn(void *self, SEL _cmd __unused) {
13 void * (*fn)(void *) = (typeof(fn))_objc_rootRetain;
14 return fn(self);
15}
16static void release_fn(void *self, SEL _cmd __unused) {
17 void (*fn)(void *) = (typeof(fn))_objc_rootRelease;
18 fn(self);
19}
20static void *autorelease_fn(void *self, SEL _cmd __unused) {
21 void * (*fn)(void *) = (typeof(fn))_objc_rootAutorelease;
22 return fn(self);
23}
24
25#if !defined(EMPTY)
26
27@implementation MissingRoot
28+(void) initialize { }
29+(Class) class { return self; }
30+(id) alloc { return _objc_rootAlloc(self); }
31+(id) allocWithZone:(void*)zone { return _objc_rootAllocWithZone(self, (malloc_zone_t *)zone); }
32-(id) init { return self; }
33-(void) dealloc { _objc_rootDealloc(self); }
34+(int) method { return 10; }
35+(void) load {
36 class_addMethod(self, sel_registerName("retain"), (IMP)retain_fn, "");
37 class_addMethod(self, sel_registerName("release"), (IMP)release_fn, "");
38 class_addMethod(self, sel_registerName("autorelease"), (IMP)autorelease_fn, "");
39
40 class_addMethod(object_getClass(self), sel_registerName("retain"), (IMP)noop_fn, "");
41 class_addMethod(object_getClass(self), sel_registerName("release"), (IMP)noop_fn, "");
42 class_addMethod(object_getClass(self), sel_registerName("autorelease"), (IMP)noop_fn, "");
43
44 state++;
45}
46@end
47
48@implementation MissingSuper
49+(int) method { return 1+[super method]; }
50-(id) init { self = [super init]; ivar = 100; return self; }
51+(void) load { state++; }
52@end
53
54#endif
55
56@implementation NotMissingRoot
57+(void) initialize { }
58+(Class) class { return self; }
59+(id) alloc { return _objc_rootAlloc(self); }
60+(id) allocWithZone:(void*)zone { return _objc_rootAllocWithZone(self, (malloc_zone_t *)zone); }
61-(id) init { return self; }
62-(void) dealloc { _objc_rootDealloc(self); }
63+(int) method { return 20; }
64+(void) load {
65 class_addMethod(self, sel_registerName("retain"), (IMP)retain_fn, "");
66 class_addMethod(self, sel_registerName("release"), (IMP)release_fn, "");
67 class_addMethod(self, sel_registerName("autorelease"), (IMP)autorelease_fn, "");
68
69 class_addMethod(object_getClass(self), sel_registerName("retain"), (IMP)noop_fn, "");
70 class_addMethod(object_getClass(self), sel_registerName("release"), (IMP)noop_fn, "");
71 class_addMethod(object_getClass(self), sel_registerName("autorelease"), (IMP)noop_fn, "");
72
73 state++;
74}
75@end
76
77@implementation NotMissingSuper
78+(int) method { return 1+[super method]; }
79-(id) init { self = [super init]; ivar = 200; return self; }
80+(void) load { state++; }
81@end
82