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#include <stdio.h> 886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block.h> 986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block_private.h> 1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdlib.h> 1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG 1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint cumulation = 0; 1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint doSomething(int i) { 1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst cumulation += i; 1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return cumulation; 2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid dirtyStack() { 2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int i = random(); 2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int j = doSomething(i); 2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int k = doSomething(j); 2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst doSomething(i + j + k); 2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garsttypedef void (^voidVoid)(void); 3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstvoidVoid testFunction() { 3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int i = random(); 3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst __block voidVoid inner = ^{ doSomething(i); }; 3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("inner, on stack, is %p\n", (void*)inner); 3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst /*__block*/ voidVoid outer = ^{ 3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("will call inner block %p\n", (void *)inner); 3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst inner(); 3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst }; 3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("outer looks like: %s\n", _Block_dump(outer)); 4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst voidVoid result = Block_copy(outer); 4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //Block_release(inner); 4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return result; 4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main(int argc, char **argv) { 4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst voidVoid block = testFunction(); 4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst dirtyStack(); 4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst block(); 5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst Block_release(block); 5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: success\n", argv[0]); 5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 0; 5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 56