From 16414bf70e5143726907cbeecd868a5439e291c9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sat, 31 Oct 2015 10:08:54 -0700 Subject: interpret all calls --- src/wasm-interpreter.cpp | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'src/wasm-interpreter.cpp') diff --git a/src/wasm-interpreter.cpp b/src/wasm-interpreter.cpp index 0899dd499..b8593dbc2 100644 --- a/src/wasm-interpreter.cpp +++ b/src/wasm-interpreter.cpp @@ -123,20 +123,41 @@ public: Flow visitSwitch(Switch *curr) override { abort(); } - Flow visitCall(Call *curr) override { - LiteralList arguments; - arguments.reserve(curr->operands.size()); - for (auto expression : curr->operands) { + + Flow generateArguments(const ExpressionList& operands, LiteralList& arguments) { + arguments.reserve(operands.size()); + for (auto expression : operands) { Flow flow = visit(expression); if (flow.breaking()) return flow; arguments.push_back(flow.value); } + return Flow(); + } + + Flow visitCall(Call *curr) override { + LiteralList arguments; + Flow flow = generateArguments(curr->operands, arguments); + if (flow.breaking()) return flow; return instance.callFunction(curr->target, arguments); } Flow visitCallImport(CallImport *curr) override { + LiteralList arguments; + Flow flow = generateArguments(curr->operands, arguments); + if (flow.breaking()) return flow; + return instance.externalInterface->callImport(curr->target, arguments); } Flow visitCallIndirect(CallIndirect *curr) override { + Flow target = visit(curr->target); + if (target.breaking()) return target; + size_t index = target.value.geti32(); + assert(index < instance.wasm.table.names.size()); + IString name = instance.wasm.table.names[index]; + LiteralList arguments; + Flow flow = generateArguments(curr->operands, arguments); + if (flow.breaking()) return flow; + return instance.callFunction(name, arguments); } + Flow visitGetLocal(GetLocal *curr) override { return scope.locals[curr->name]; } -- cgit v1.2.3