assigngcivar.m   [plain text]


/*
 * Copyright (c) 2010 Apple Inc. All rights reserved.
 *
 * @APPLE_LLVM_LICENSE_HEADER@
 */

/*
  TEST_CONFIG SDK=macosx MEM=gc
  TEST_CFLAGS -framework Foundation
 */

#import <objc/objc-auto.h>
#import <Foundation/Foundation.h>
#import "test.h"

int GlobalInt = 0;

#ifdef __cplusplus
extern "C" {
#endif
id objc_assign_global(id val __unused, id *dest __unused) {
    GlobalInt = 1;
    return (id)0;
}

id objc_assign_ivar(id val __unused, id dest __unused, ptrdiff_t offset __unused) {
    GlobalInt = 1;
    return (id)0;
}

id objc_assign_strongCast(id val __unused, id *dest __unused) {
    GlobalInt = 0;
    return (id)0;
}
#ifdef __cplusplus
}
#endif

@interface TestObject : NSObject {
@public
    void (^ivarBlock)(void);
    id x;
}
@end

@implementation TestObject
@end


int main() {
   __block int i = 0;
   TestObject *to = [[TestObject alloc] init];
   // assigning a Block into an ivar should elicit a  write-barrier under GC
   to->ivarBlock =  ^ {  ++i; };		// fails to gen write-barrier
   //to->x = to;				// gens write-barrier
   if (GlobalInt != 1) {
       fail("missing ivar write-barrier for Block");
   }

   succeed(__FILE__);
}