void FlowCallVisitor::accept(Handler& handler) { if (handler.scope()) { for (auto sym: *handler.scope()) { visit(sym); } } visit(handler.body()); }
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)); }
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(); }