blob: f3e1056118e2da5be725bd613baf0a215e4450ee [file] [log] [blame]
/* APPLE LOCAL file radar 4591756 - radar 5276085 */
/* A run-time test for insertion of read barriers for __weak objects. */
/* Test enhanced for radar 5276085 to test weak array of ivars. */
/* { dg-do run { target powerpc*-*-darwin* i?86*-*-darwin* } } */
/* { dg-options "-framework Foundation -fobjc-gc" } */
/* { dg-require-effective-target objc_gc } */
// Weak Write Barriers
#define objc_assign_weak _X_objc_assign_weak
#define objc_read_weak _X_objc_read_weak
#import <Foundation/Foundation.h>
#undef objc_assign_weak
#undef objc_read_weak
struct {
int expected;
int encountered;
}
Reads, Writes;
static
id objc_assign_weak(id value, id *location) {
Writes.encountered++;
return value;
}
static
id objc_read_weak(id *location) {
Reads.encountered++;
return *location;
}
@interface TestObject : NSObject {
__weak id ivar;
__weak id arr_ivar[3];
__weak id another_arr_ivar[3][2];
}
- (int)doTest; // error count
@end
__weak id global;
__weak id *pweak;
@implementation TestObject
- (int)writeIvar {
int i,j;
++Writes.expected;
ivar = self;
if (Writes.expected != Writes.encountered) {
printf("writeIvar failed\n");
return 1;
}
Writes.expected += 3;
for (i=0; i < 3; i++)
arr_ivar[i] = self;
if (Writes.expected != Writes.encountered) {
printf("writeIvar failed\n");
return 1;
}
Writes.expected += 6;
for (i=0; i < 3; i++)
for (j=0; j < 2; j++)
another_arr_ivar[i][j] = self;
if (Writes.expected != Writes.encountered) {
printf("writeIvar failed\n");
return 1;
}
return 0;
}
- (int)writeGlobal {
++Writes.expected;
global = self;
if (Writes.expected != Writes.encountered) {
printf("writeGlobal failed\n");
return 1;
}
return 0;
}
- (int)writeStatic {
++Writes.expected;
__weak static id local;
local = self;
if (Writes.expected != Writes.encountered) {
printf("writeStatic failed\n");
return 1;
}
return 0;
}
- (int)readIvar {
++Reads.expected;
[ivar self];
if (Reads.expected != Reads.encountered) {
printf("readIvar failed\n");
return 1;
}
return 0;
}
- (int)readGlobal {
++Reads.expected;
[global self];
if (Reads.expected != Reads.encountered) {
printf("readGlobal failed\n");
return 1;
}
return 0;
}
- (int)readStatic {
++Reads.expected;
__weak static id local;
[global self];
if (Reads.expected != Reads.encountered) {
printf("readGlobal failed\n");
return 1;
}
return 0;
}
- (int) writePtrWeak:(__weak id *)ptr2weakId {
*ptr2weakId = self;
++Writes.expected;
if (Writes.expected != Writes.encountered) {
printf("writePtrWeak failed\n");
return 1;
}
pweak = ptr2weakId;
if (Writes.expected != Writes.encountered) {
printf("writePtrWeak 2 failed\n");
return 1;
}
if (Reads.expected != Reads.encountered) {
printf("writePtrWeak 3 failed\n");
return 1;
}
return 0;
}
#define rdar4591756fixed 1
- (int)doTest {
int errors = 0;
// errors += [self writePtrWeak:&global];
errors += [self writeIvar];
errors += [self writeGlobal];
errors += [self writeStatic];
#if rdar4591756fixed
errors += [self readIvar];
errors += [self readGlobal];
errors += [self readStatic];
#else
#warning skipping read weak tests until rdar4591756fixed
#endif
return errors;
}
@end
int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
// basic test is for the write barriers
// we assume zeroing works
TestObject *to = [TestObject new];
int errors = [to doTest];
if (errors == 0) {
printf("wwb: SUCCESS\n");
}
return errors;
}