1*7c3d14c8STreehugger Robot //
2*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure
3*7c3d14c8STreehugger Robot //
4*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source
5*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details.
6*7c3d14c8STreehugger Robot
7*7c3d14c8STreehugger Robot #import <Block.h>
8*7c3d14c8STreehugger Robot #import <stdio.h>
9*7c3d14c8STreehugger Robot #import <stdlib.h>
10*7c3d14c8STreehugger Robot
11*7c3d14c8STreehugger Robot // CONFIG C++
12*7c3d14c8STreehugger Robot
13*7c3d14c8STreehugger Robot int recovered = 0;
14*7c3d14c8STreehugger Robot
15*7c3d14c8STreehugger Robot
16*7c3d14c8STreehugger Robot
17*7c3d14c8STreehugger Robot int constructors = 0;
18*7c3d14c8STreehugger Robot int destructors = 0;
19*7c3d14c8STreehugger Robot
20*7c3d14c8STreehugger Robot #define CONST const
21*7c3d14c8STreehugger Robot
22*7c3d14c8STreehugger Robot class TestObject
23*7c3d14c8STreehugger Robot {
24*7c3d14c8STreehugger Robot public:
25*7c3d14c8STreehugger Robot TestObject(CONST TestObject& inObj);
26*7c3d14c8STreehugger Robot TestObject();
27*7c3d14c8STreehugger Robot ~TestObject();
28*7c3d14c8STreehugger Robot
29*7c3d14c8STreehugger Robot TestObject& operator=(CONST TestObject& inObj);
30*7c3d14c8STreehugger Robot
31*7c3d14c8STreehugger Robot void test(void);
32*7c3d14c8STreehugger Robot
version()33*7c3d14c8STreehugger Robot int version() CONST { return _version; }
34*7c3d14c8STreehugger Robot private:
35*7c3d14c8STreehugger Robot mutable int _version;
36*7c3d14c8STreehugger Robot };
37*7c3d14c8STreehugger Robot
TestObject(CONST TestObject & inObj)38*7c3d14c8STreehugger Robot TestObject::TestObject(CONST TestObject& inObj)
39*7c3d14c8STreehugger Robot
40*7c3d14c8STreehugger Robot {
41*7c3d14c8STreehugger Robot ++constructors;
42*7c3d14c8STreehugger Robot _version = inObj._version;
43*7c3d14c8STreehugger Robot //printf("%p (%d) -- TestObject(const TestObject&) called", this, _version);
44*7c3d14c8STreehugger Robot }
45*7c3d14c8STreehugger Robot
46*7c3d14c8STreehugger Robot
TestObject()47*7c3d14c8STreehugger Robot TestObject::TestObject()
48*7c3d14c8STreehugger Robot {
49*7c3d14c8STreehugger Robot _version = ++constructors;
50*7c3d14c8STreehugger Robot //printf("%p (%d) -- TestObject() called\n", this, _version);
51*7c3d14c8STreehugger Robot }
52*7c3d14c8STreehugger Robot
53*7c3d14c8STreehugger Robot
~TestObject()54*7c3d14c8STreehugger Robot TestObject::~TestObject()
55*7c3d14c8STreehugger Robot {
56*7c3d14c8STreehugger Robot //printf("%p -- ~TestObject() called\n", this);
57*7c3d14c8STreehugger Robot ++destructors;
58*7c3d14c8STreehugger Robot }
59*7c3d14c8STreehugger Robot
60*7c3d14c8STreehugger Robot #if 1
61*7c3d14c8STreehugger Robot TestObject& TestObject::operator=(CONST TestObject& inObj)
62*7c3d14c8STreehugger Robot {
63*7c3d14c8STreehugger Robot //printf("%p -- operator= called", this);
64*7c3d14c8STreehugger Robot _version = inObj._version;
65*7c3d14c8STreehugger Robot return *this;
66*7c3d14c8STreehugger Robot }
67*7c3d14c8STreehugger Robot #endif
68*7c3d14c8STreehugger Robot
test(void)69*7c3d14c8STreehugger Robot void TestObject::test(void) {
70*7c3d14c8STreehugger Robot void (^b)(void) = ^{ recovered = _version; };
71*7c3d14c8STreehugger Robot void (^b2)(void) = Block_copy(b);
72*7c3d14c8STreehugger Robot b2();
73*7c3d14c8STreehugger Robot Block_release(b2);
74*7c3d14c8STreehugger Robot }
75*7c3d14c8STreehugger Robot
76*7c3d14c8STreehugger Robot
77*7c3d14c8STreehugger Robot
testRoutine()78*7c3d14c8STreehugger Robot void testRoutine() {
79*7c3d14c8STreehugger Robot TestObject one;
80*7c3d14c8STreehugger Robot
81*7c3d14c8STreehugger Robot
82*7c3d14c8STreehugger Robot one.test();
83*7c3d14c8STreehugger Robot }
84*7c3d14c8STreehugger Robot
85*7c3d14c8STreehugger Robot
86*7c3d14c8STreehugger Robot
main(int argc,char * argv[])87*7c3d14c8STreehugger Robot int main(int argc, char *argv[]) {
88*7c3d14c8STreehugger Robot testRoutine();
89*7c3d14c8STreehugger Robot if (recovered == 1) {
90*7c3d14c8STreehugger Robot printf("%s: success\n", argv[0]);
91*7c3d14c8STreehugger Robot exit(0);
92*7c3d14c8STreehugger Robot }
93*7c3d14c8STreehugger Robot printf("%s: *** didn't recover byref block variable\n", argv[0]);
94*7c3d14c8STreehugger Robot exit(1);
95*7c3d14c8STreehugger Robot }
96