Example #1
0
void FlowCallVisitor::accept(Handler& handler)
{
    if (handler.scope()) {
        for (auto sym: *handler.scope()) {
            visit(sym);
        }
    }

    visit(handler.body());
}
Example #2
0
void IRGenerator::accept(Handler& handler)
{
    FNTRACE();

    setHandler(getHandler(handler.name()));
    setInsertPoint(createBlock("EntryPoint"));
    this->handler()->setEntryPoint(getInsertPoint());

    for (Symbol* symbol: *handler.scope()) {
        codegen(symbol);
    }

    codegen(handler.body());

    createRet(get(false));
}
Example #3
0
void IRGenerator::codegenInline(Handler& handlerSym)
{
    auto i = std::find(handlerStack_.begin(), handlerStack_.end(), &handlerSym);
    if (i != handlerStack_.end()) {
        reportError("Cannot recursively call handler %s.", handlerSym.name().c_str());

        return;
    }

    handlerStack_.push_back(&handlerSym);

    // emit local variable declarations
    if (handlerSym.scope()) {
        for (Symbol* symbol: *handlerSym.scope()) {
            codegen(symbol);
        }
    }

    // emit body
    codegen(handlerSym.body());

    handlerStack_.pop_back();
}