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