static bool RenderSignature(WasmRenderContext& c, const AstSig& sig, const AstNameVector* maybeLocals = nullptr) { uint32_t paramsNum = sig.args().length(); if (maybeLocals) { for (uint32_t i = 0; i < paramsNum; i++) { if (!c.buffer.append(" (param ")) return false; const AstName& name = (*maybeLocals)[i]; if (!name.empty()) { if (!RenderName(c, name)) return false; if (!c.buffer.append(" ")) return false; } ValType arg = sig.args()[i]; if (!RenderValType(c, arg)) return false; if (!c.buffer.append(")")) return false; } } else if (paramsNum > 0) { if (!c.buffer.append(" (param")) return false; for (uint32_t i = 0; i < paramsNum; i++) { if (!c.buffer.append(" ")) return false; ValType arg = sig.args()[i]; if (!RenderValType(c, arg)) return false; } if (!c.buffer.append(")")) return false; } if (sig.ret() != ExprType::Void) { if (!c.buffer.append(" (result ")) return false; if (!RenderExprType(c, sig.ret())) return false; if (!c.buffer.append(")")) return false; } return true; }
static bool AstDecodeCallArgs(AstDecodeContext& c, uint32_t arity, const AstSig& sig, AstExprVector* funcArgs) { if (arity != sig.args().length()) return c.iter().fail("call arity out of range"); const AstValTypeVector& args = sig.args(); uint32_t numArgs = args.length(); if (!funcArgs->resize(numArgs)) return false; for (size_t i = 0; i < numArgs; ++i) { ValType argType = args[i]; AstDecodeStackItem item; if (!c.iter().readCallArg(argType, numArgs, i, &item)) return false; (*funcArgs)[i] = item.expr; } return c.iter().readCallArgsEnd(numArgs); }
static bool AstDecodeCallReturn(AstDecodeContext& c, const AstSig& sig) { return c.iter().readCallReturn(sig.ret()); }