Как вызвать блок Objective C через API LLVM C ++? - PullRequest
2 голосов
/ 31 декабря 2010

Скажем, например, у меня есть скомпилированный модуль 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?

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Боюсь, здесь нелегкий ответ. Блоки передаются интерфейсом в вызовы во время выполнения блоков. В случае clang соответствующий код: clang/lib/CodeGen/CGBlocks.[h|cpp].

Стоит спросить в списке cfe-dev , есть ли способ выделить этот код для повторного использования в других интерфейсах.

0 голосов
/ 04 января 2011

В Си я просто действую так, как если бы переменная, которой я назначил блок, была указателем на функцию.Используя ваш код в качестве примера, после присвоения результата функции «returnABlockCall», вы можете просто написать:

returnABlockCall();

, и оно должно работать.

Предупреждение, это не проверенов C ++, но я не вижу причин, почему это не сработает.

...