18c1441f8SAlexey Samsonov // 2*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 3*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 4*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 58c1441f8SAlexey Samsonov 68c1441f8SAlexey Samsonov #include <stdio.h> 78c1441f8SAlexey Samsonov #include <Block.h> 88c1441f8SAlexey Samsonov #include <Block_private.h> 98c1441f8SAlexey Samsonov #include <stdlib.h> 108c1441f8SAlexey Samsonov 118c1441f8SAlexey Samsonov // CONFIG 128c1441f8SAlexey Samsonov 138c1441f8SAlexey Samsonov 148c1441f8SAlexey Samsonov int cumulation = 0; 158c1441f8SAlexey Samsonov doSomething(int i)168c1441f8SAlexey Samsonovint doSomething(int i) { 178c1441f8SAlexey Samsonov cumulation += i; 188c1441f8SAlexey Samsonov return cumulation; 198c1441f8SAlexey Samsonov } 208c1441f8SAlexey Samsonov dirtyStack()218c1441f8SAlexey Samsonovvoid dirtyStack() { 228c1441f8SAlexey Samsonov int i = random(); 238c1441f8SAlexey Samsonov int j = doSomething(i); 248c1441f8SAlexey Samsonov int k = doSomething(j); 258c1441f8SAlexey Samsonov doSomething(i + j + k); 268c1441f8SAlexey Samsonov } 278c1441f8SAlexey Samsonov 288c1441f8SAlexey Samsonov typedef void (^voidVoid)(void); 298c1441f8SAlexey Samsonov testFunction()308c1441f8SAlexey SamsonovvoidVoid testFunction() { 318c1441f8SAlexey Samsonov int i = random(); 328c1441f8SAlexey Samsonov __block voidVoid inner = ^{ doSomething(i); }; 338c1441f8SAlexey Samsonov //printf("inner, on stack, is %p\n", (void*)inner); 348c1441f8SAlexey Samsonov /*__block*/ voidVoid outer = ^{ 358c1441f8SAlexey Samsonov //printf("will call inner block %p\n", (void *)inner); 368c1441f8SAlexey Samsonov inner(); 378c1441f8SAlexey Samsonov }; 388c1441f8SAlexey Samsonov //printf("outer looks like: %s\n", _Block_dump(outer)); 398c1441f8SAlexey Samsonov voidVoid result = Block_copy(outer); 408c1441f8SAlexey Samsonov //Block_release(inner); 418c1441f8SAlexey Samsonov return result; 428c1441f8SAlexey Samsonov } 438c1441f8SAlexey Samsonov 448c1441f8SAlexey Samsonov main(int argc,char ** argv)458c1441f8SAlexey Samsonovint main(int argc, char **argv) { 468c1441f8SAlexey Samsonov voidVoid block = testFunction(); 478c1441f8SAlexey Samsonov dirtyStack(); 488c1441f8SAlexey Samsonov block(); 498c1441f8SAlexey Samsonov Block_release(block); 508c1441f8SAlexey Samsonov 518c1441f8SAlexey Samsonov printf("%s: success\n", argv[0]); 528c1441f8SAlexey Samsonov 538c1441f8SAlexey Samsonov return 0; 548c1441f8SAlexey Samsonov } 55