1 // TEST_CONFIG CC=clang MEM=mrc
11 // no optimization on i386 (neither Mac nor Simulator)
17 #include <objc/objc-internal.h>
18 #include <objc/objc-abi.h>
19 #include <Foundation/Foundation.h>
21 @interface TestObject : TestRoot @end
22 @implementation TestObject @end
26 # define MAGIC asm volatile("mov r7, r7")
27 # define NOT_MAGIC asm volatile("mov r6, r6")
29 # define MAGIC asm volatile("mov x29, x29")
30 # define NOT_MAGIC asm volatile("mov x28, x28")
32 # define MAGIC asm volatile("")
33 # define NOT_MAGIC asm volatile("nop")
35 # error unknown architecture
42 TestObject *tmp, *obj;
45 // need to get DYLD to resolve the stubs on x86
47 TestObject *warm_up = [[TestObject alloc] init];
49 warm_up = objc_retainAutoreleasedReturnValue(warm_up);
50 warm_up = objc_unsafeClaimAutoreleasedReturnValue(warm_up);
56 testprintf(" Successful +1 -> +1 handshake\n");
59 obj = [[TestObject alloc] init];
64 TestRootAutorelease = 0;
67 tmp = objc_autoreleaseReturnValue(obj);
69 tmp = objc_retainAutoreleasedReturnValue(tmp);
71 testassert(TestRootDealloc == 0);
72 testassert(TestRootRetain == 0);
73 testassert(TestRootRelease == 0);
74 testassert(TestRootAutorelease == 0);
77 testassert(TestRootDealloc == 1);
78 testassert(TestRootRetain == 0);
79 testassert(TestRootRelease == 1);
80 testassert(TestRootAutorelease == 0);
84 testprintf("Unsuccessful +1 -> +1 handshake\n");
87 obj = [[TestObject alloc] init];
92 TestRootAutorelease = 0;
95 tmp = objc_autoreleaseReturnValue(obj);
97 tmp = objc_retainAutoreleasedReturnValue(tmp);
99 testassert(TestRootDealloc == 0);
100 testassert(TestRootRetain == 1);
101 testassert(TestRootRelease == 0);
102 testassert(TestRootAutorelease == 1);
105 testassert(TestRootDealloc == 0);
106 testassert(TestRootRetain == 1);
107 testassert(TestRootRelease == 1);
108 testassert(TestRootAutorelease == 1);
111 testassert(TestRootDealloc == 1);
112 testassert(TestRootRetain == 1);
113 testassert(TestRootRelease == 2);
114 testassert(TestRootAutorelease == 1);
117 testprintf(" Successful +0 -> +1 handshake\n");
120 obj = [[TestObject alloc] init];
125 TestRootAutorelease = 0;
128 tmp = objc_retainAutoreleaseReturnValue(obj);
130 tmp = objc_retainAutoreleasedReturnValue(tmp);
132 testassert(TestRootDealloc == 0);
133 testassert(TestRootRetain == 1);
134 testassert(TestRootRelease == 0);
135 testassert(TestRootAutorelease == 0);
138 testassert(TestRootDealloc == 0);
139 testassert(TestRootRetain == 1);
140 testassert(TestRootRelease == 1);
141 testassert(TestRootAutorelease == 0);
144 testassert(TestRootDealloc == 1);
145 testassert(TestRootRetain == 1);
146 testassert(TestRootRelease == 2);
147 testassert(TestRootAutorelease == 0);
151 testprintf("Unsuccessful +0 -> +1 handshake\n");
154 obj = [[TestObject alloc] init];
159 TestRootAutorelease = 0;
162 tmp = objc_retainAutoreleaseReturnValue(obj);
164 tmp = objc_retainAutoreleasedReturnValue(tmp);
166 testassert(TestRootDealloc == 0);
167 testassert(TestRootRetain == 2);
168 testassert(TestRootRelease == 0);
169 testassert(TestRootAutorelease == 1);
172 testassert(TestRootDealloc == 0);
173 testassert(TestRootRetain == 2);
174 testassert(TestRootRelease == 1);
175 testassert(TestRootAutorelease == 1);
178 testassert(TestRootDealloc == 0);
179 testassert(TestRootRetain == 2);
180 testassert(TestRootRelease == 2);
181 testassert(TestRootAutorelease == 1);
184 testassert(TestRootDealloc == 1);
185 testassert(TestRootRetain == 2);
186 testassert(TestRootRelease == 3);
187 testassert(TestRootAutorelease == 1);
190 testprintf(" Successful +1 -> +0 handshake\n");
193 obj = [[[TestObject alloc] init] retain];
198 TestRootAutorelease = 0;
201 tmp = objc_autoreleaseReturnValue(obj);
203 tmp = objc_unsafeClaimAutoreleasedReturnValue(tmp);
205 testassert(TestRootDealloc == 0);
206 testassert(TestRootRetain == 0);
207 testassert(TestRootRelease == 1);
208 testassert(TestRootAutorelease == 0);
211 testassert(TestRootDealloc == 1);
212 testassert(TestRootRetain == 0);
213 testassert(TestRootRelease == 2);
214 testassert(TestRootAutorelease == 0);
218 testprintf("Unsuccessful +1 -> +0 handshake\n");
221 obj = [[[TestObject alloc] init] retain];
226 TestRootAutorelease = 0;
229 tmp = objc_autoreleaseReturnValue(obj);
231 tmp = objc_unsafeClaimAutoreleasedReturnValue(tmp);
233 testassert(TestRootDealloc == 0);
234 testassert(TestRootRetain == 0);
235 testassert(TestRootRelease == 0);
236 testassert(TestRootAutorelease == 1);
239 testassert(TestRootDealloc == 0);
240 testassert(TestRootRetain == 0);
241 testassert(TestRootRelease == 1);
242 testassert(TestRootAutorelease == 1);
245 testassert(TestRootDealloc == 1);
246 testassert(TestRootRetain == 0);
247 testassert(TestRootRelease == 2);
248 testassert(TestRootAutorelease == 1);
251 testprintf(" Successful +0 -> +0 handshake\n");
254 obj = [[TestObject alloc] init];
259 TestRootAutorelease = 0;
262 tmp = objc_retainAutoreleaseReturnValue(obj);
264 tmp = objc_unsafeClaimAutoreleasedReturnValue(tmp);
266 testassert(TestRootDealloc == 0);
267 testassert(TestRootRetain == 0);
268 testassert(TestRootRelease == 0);
269 testassert(TestRootAutorelease == 0);
272 testassert(TestRootDealloc == 1);
273 testassert(TestRootRetain == 0);
274 testassert(TestRootRelease == 1);
275 testassert(TestRootAutorelease == 0);
279 testprintf("Unsuccessful +0 -> +0 handshake\n");
282 obj = [[TestObject alloc] init];
287 TestRootAutorelease = 0;
290 tmp = objc_retainAutoreleaseReturnValue(obj);
292 tmp = objc_unsafeClaimAutoreleasedReturnValue(tmp);
294 testassert(TestRootDealloc == 0);
295 testassert(TestRootRetain == 1);
296 testassert(TestRootRelease == 0);
297 testassert(TestRootAutorelease == 1);
300 testassert(TestRootDealloc == 0);
301 testassert(TestRootRetain == 1);
302 testassert(TestRootRelease == 1);
303 testassert(TestRootAutorelease == 1);
306 testassert(TestRootDealloc == 1);
307 testassert(TestRootRetain == 1);
308 testassert(TestRootRelease == 2);
309 testassert(TestRootAutorelease == 1);