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