static bool RenderTableSection(WasmRenderContext& c, const AstModule& module) { if (module.elemSegments().empty()) return true; const AstElemSegment& segment = *module.elemSegments()[0]; if (!RenderIndent(c)) return false; if (!c.buffer.append("(table")) return false; for (const AstRef& elem : segment.elems()) { if (!c.buffer.append(" ")) return false; AstFunc* func = module.funcs()[elem.index()]; if (func->name().empty()) { if (!RenderInt32(c, elem.index())) return false; } else { if (!RenderName(c, func->name())) return false; } } if (!c.buffer.append(")\n")) return false; return true; }
static bool RenderTableSection(WasmRenderContext& c, AstTable* maybeTable, const AstModule::FuncVector& funcs) { if (!maybeTable) return true; uint32_t numTableElems = maybeTable->elems().length(); if (!RenderIndent(c)) return false; if (!c.buffer.append("(table")) return false; for (uint32_t i = 0; i < numTableElems; i++) { if (!c.buffer.append(" ")) return false; AstRef& elem = maybeTable->elems()[i]; AstFunc* func = funcs[elem.index()]; if (func->name().empty()) { if (!RenderInt32(c, elem.index())) return false; } else { if (!RenderName(c, func->name())) return false; } } if (!c.buffer.append(")\n")) return false; return true; }
virtual void visit(AstReturn* nodep, AstNUser*) { nodep->iterateChildren(*this); AstFunc* funcp = m_ftaskp->castFunc(); if (!m_ftaskp) { nodep->v3error("Return isn't underneath a task or function"); } else if (funcp && !nodep->lhsp()) { nodep->v3error("Return underneath a function should have return value"); } else if (!funcp && nodep->lhsp()) { nodep->v3error("Return underneath a task shouldn't have return value"); } else { if (funcp && nodep->lhsp()) { // Set output variable to return value nodep->addPrev(new AstAssign(nodep->fileline(), new AstVarRef(nodep->fileline(), funcp->fvarp()->castVar(), true), nodep->lhsp()->unlinkFrBackWithNext())); } // Jump to the end of the function call AstJumpLabel* labelp = findAddLabel(m_ftaskp, false); nodep->addPrev(new AstJumpGo(nodep->fileline(), labelp)); } nodep->unlinkFrBack(); pushDeletep(nodep); VL_DANGLING(nodep); }
static bool RenderCodeSection(WasmRenderContext& c, const AstModule::FuncVector& funcs, const AstModule::SigVector& sigs) { uint32_t numFuncBodies = funcs.length(); for (uint32_t funcIndex = 0; funcIndex < numFuncBodies; funcIndex++) { AstFunc* func = funcs[funcIndex]; uint32_t sigIndex = func->sig().index(); AstSig* sig = sigs[sigIndex]; if (!RenderIndent(c)) return false; if (!c.buffer.append("(func ")) return false; if (!func->name().empty()) { if (!RenderName(c, func->name())) return false; } if (!RenderSignature(c, *sig, &(func->locals()))) return false; if (!c.buffer.append("\n")) return false; c.currentFuncIndex = funcIndex; c.indent++; if (!RenderFunctionBody(c, *func, sigs)) return false; c.indent--; if (!RenderIndent(c)) return false; if (!c.buffer.append(")\n")) return false; } return true; }
static bool RenderFunctionBody(WasmRenderContext& c, AstFunc& func, const AstModule::SigVector& sigs) { const AstSig* sig = sigs[func.sig().index()]; size_t startExprIndex = c.maybeSourceMap ? c.maybeSourceMap->exprlocs().length() : 0; uint32_t startLineno = c.buffer.lineno(); uint32_t argsNum = sig->args().length(); uint32_t localsNum = func.vars().length(); if (localsNum > 0) { if (!RenderIndent(c)) return false; for (uint32_t i = 0; i < localsNum; i++) { if (!c.buffer.append("(local ")) return false; const AstName& name = func.locals()[argsNum + i]; if (!name.empty()) { if (!RenderName(c, name)) return false; if (!c.buffer.append(" ")) return false; } ValType local = func.vars()[i]; if (!RenderValType(c, local)) return false; if (!c.buffer.append(") ")) return false; } if (!c.buffer.append("\n")) return false; } uint32_t exprsNum = func.body().length(); for (uint32_t i = 0; i < exprsNum; i++) { if (!RenderExpr(c, *func.body()[i])) return false; } size_t endExprIndex = c.maybeSourceMap ? c.maybeSourceMap->exprlocs().length() : 0; uint32_t endLineno = c.buffer.lineno(); if (c.maybeSourceMap) { if (!c.maybeSourceMap->functionlocs().emplaceBack(startExprIndex, endExprIndex, startLineno, endLineno)) return false; } return true; }
static bool RenderFunctionBody(WasmRenderContext& c, AstFunc& func, const AstModule::SigVector& sigs) { const AstSig* sig = sigs[func.sig().index()]; c.indent++; uint32_t argsNum = sig->args().length(); uint32_t localsNum = func.vars().length(); if (localsNum > 0) { if (!RenderIndent(c)) return false; for (uint32_t i = 0; i < localsNum; i++) { if (!c.buffer.append("(local ")) return false; const AstName& name = func.locals()[argsNum + i]; if (!name.empty()) { if (!RenderName(c, name)) return false; if (!c.buffer.append(" ")) return false; } ValType local = func.vars()[i]; if (!RenderValType(c, local)) return false; if (!c.buffer.append(") ")) return false; } if (!c.buffer.append("\n")) return false; } uint32_t exprsNum = func.body().length(); for (uint32_t i = 0; i < exprsNum; i++) { if (!RenderFullLine(c, *func.body()[i])) return false; } c.indent--; return true; }