186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// The LLVM Compiler Infrastructure 386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// This file is distributed under the University of Illinois Open Source 586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// License. See LICENSE.TXT for details. 686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <Block.h> 886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <stdio.h> 986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <stdlib.h> 1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG C++ 1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint recovered = 0; 1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint constructors = 0; 1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint destructors = 0; 1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#define CONST const 2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstclass TestObject 2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{ 2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstpublic: 2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst TestObject(CONST TestObject& inObj); 2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst TestObject(); 2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst ~TestObject(); 2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst TestObject& operator=(CONST TestObject& inObj); 3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst void test(void); 3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int version() CONST { return _version; } 3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstprivate: 3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst mutable int _version; 3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}; 3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::TestObject(CONST TestObject& inObj) 3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{ 4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst ++constructors; 4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst _version = inObj._version; 4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("%p (%d) -- TestObject(const TestObject&) called", this, _version); 4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::TestObject() 4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{ 4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst _version = ++constructors; 5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("%p (%d) -- TestObject() called\n", this, _version); 5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::~TestObject() 5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{ 5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("%p -- ~TestObject() called\n", this); 5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst ++destructors; 5886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 5986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 6086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#if 1 6186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject& TestObject::operator=(CONST TestObject& inObj) 6286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{ 6386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("%p -- operator= called", this); 6486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst _version = inObj._version; 6586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return *this; 6686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 6786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#endif 6886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 6986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid TestObject::test(void) { 7086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst void (^b)(void) = ^{ recovered = _version; }; 7186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst void (^b2)(void) = Block_copy(b); 7286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst b2(); 7386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst Block_release(b2); 7486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 7586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 7686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 7786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 7886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid testRoutine() { 7986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst TestObject one; 8086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 8186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 8286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst one.test(); 8386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 8486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 8586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 8686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 8786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main(int argc, char *argv[]) { 8886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst testRoutine(); 8986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if (recovered == 1) { 9086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: success\n", argv[0]); 9186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst exit(0); 9286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 9386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: *** didn't recover byref block variable\n", argv[0]); 9486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst exit(1); 9586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 96