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/*
886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *  byrefcopyint.c
986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *  testObjects
1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *
1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *  Created by Blaine Garst on 12/1/08.
1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *
1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst */
1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//  byrefcopyid.m
1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//  testObjects
1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//  Created by Blaine Garst on 5/13/08.
2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// Tests copying of blocks with byref ints
2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG rdar://6414583 -C99
2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdio.h>
2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <string.h>
2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block.h>
2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block_private.h>
2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garsttypedef void (^voidVoid)(void);
3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstvoidVoid dummy;
3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid callVoidVoid(voidVoid closure) {
3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    closure();
3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstvoidVoid testRoutine(const char *whoami) {
4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    __block int  dumbo = strlen(whoami);
4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    dummy = ^{
4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        //printf("incring dumbo from %d\n", dumbo);
4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        ++dumbo;
4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    };
4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    voidVoid copy = Block_copy(dummy);
5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    return copy;
5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main(int argc, char *argv[]) {
5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    voidVoid array[100];
5886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    for (int i = 0; i <  100; ++i) {
5986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        array[i] = testRoutine(argv[0]);
6086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        array[i]();
6186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    }
6286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    for (int i = 0; i <  100; ++i) {
6386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        Block_release(array[i]);
6486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    }
6586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    printf("%s: success\n", argv[0]);
6886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    return 0;
6986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
70