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; }