2

比如说,我有一个 Objective-C 编译的模块,它包含以下内容:

typedef bool (^BoolBlock)(void);
BoolBlock returnABlock(void)
{
    return Block_copy(^bool(void){
        printf("Block executing.\n");
        return YES;
    });
}

...然后,使用 LLVM C++ API,我加载该模块并创建一个 CallInst 来调用该returnABlock()函数:

Function *returnABlockFunction = returnABlockModule->getFunction(std::string("returnABlock"));
CallInst *returnABlockCall = CallInst::Create(returnABlockFunction, "returnABlockCall", entryBlock);

然后如何调用通过returnABlockCall对象返回的块?

4

2 回答 2

2

恐怕这不是一个简单的答案。前端将块降低为对块运行时的调用。在 clang 的情况下,相关代码在clang/lib/CodeGen/CGBlocks.[h|cpp].

值得在cfe-dev列表中询问是否有办法将这段代码分解出来以便在其他前端重用。

于 2010-12-31T07:41:56.373 回答
0

在 C 语言中,我只是把分配块的 var 当作一个函数指针。以您的代码为例,将函数的结果分配给“returnABlockCall”后,您可以编写:

returnABlockCall();

它应该可以工作。

警告,这在 C++ 中未经测试,但我看不出它为什么不起作用。

于 2011-01-03T21:16:54.373 回答