2

たとえば、次のようなものを含むObjective-Cコンパイル済みモジュールがあるとします。

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

returnABlock()...次に、LLVM C ++ APIを使用して、そのモジュールをロードし、関数を呼び出すためのCallInstを作成します。

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 に答える