1/*
2 * Copyright (c) 2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LLVM_LICENSE_HEADER@
5 */
6
7//
8//  byrefgc.m
9//  testObjects
10//
11//  Created by Blaine Garst on 5/16/08.
12//  Copyright 2008 __MyCompanyName__. All rights reserved.
13//
14
15// TEST_CONFIG SDK=macosx
16// TEST_CFLAGS -framework Foundation
17
18
19#import <objc/objc-auto.h>
20#import <Foundation/Foundation.h>
21#import <stdio.h>
22#import <Block.h>
23#import "test.h"
24
25int DidFinalize = 0;
26int GotHi = 0;
27
28int VersionCounter = 0;
29
30@interface TestObject : NSObject {
31    int version;
32}
33- (void) hi;
34@end
35
36@implementation TestObject
37
38
39- (id)init {
40    version = VersionCounter++;
41    return self;
42}
43
44- (void)finalize {
45    DidFinalize++;
46    [super finalize];
47}
48- (void) hi {
49    GotHi++;
50}
51
52@end
53
54
55void (^get_block(void))(void) {
56    __block TestObject * to = [[TestObject alloc] init];
57    return [^{ [to hi]; to = [[TestObject alloc] init]; } copy];
58}
59
60int main() {
61
62    void (^voidvoid)(void) = get_block();
63    voidvoid();
64    voidvoid();
65    voidvoid();
66    voidvoid();
67    voidvoid();
68    voidvoid();
69    voidvoid = nil;
70    for (int i = 0; i < 8000; ++i) {
71        [NSObject new];
72    }
73    if (objc_collectingEnabled()) {
74        objc_collect(OBJC_EXHAUSTIVE_COLLECTION|OBJC_WAIT_UNTIL_DONE);
75        if ((DidFinalize + 2) < VersionCounter) {
76            fail("didn't recover all objects %d/%d", DidFinalize, VersionCounter);
77        }
78    }
79
80    succeed(__FILE__);
81}
82