diff options
Diffstat (limited to 'src/shell-interface.h')
-rw-r--r-- | src/shell-interface.h | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/shell-interface.h b/src/shell-interface.h index f6c12e8ca..f332307ad 100644 --- a/src/shell-interface.h +++ b/src/shell-interface.h @@ -86,15 +86,27 @@ struct ShellExternalInterface : ModuleInstance::ExternalInterface { } } memory; + std::vector<Name> table; + ShellExternalInterface() : memory() {} void init(Module& wasm) override { memory.resize(wasm.memory.initial * wasm::Memory::kPageSize); // apply memory segments for (auto& segment : wasm.memory.segments) { - assert(segment.offset + segment.data.size() <= wasm.memory.initial * wasm::Memory::kPageSize); + Address offset = ConstantExpressionRunner().visit(segment.offset).value.geti32(); + assert(offset + segment.data.size() <= wasm.memory.initial * wasm::Memory::kPageSize); + for (size_t i = 0; i != segment.data.size(); ++i) { + memory.set(offset + i, segment.data[i]); + } + } + + table.resize(wasm.table.initial); + for (auto& segment : wasm.table.segments) { + Address offset = ConstantExpressionRunner().visit(segment.offset).value.geti32(); + assert(offset + segment.data.size() <= wasm.table.initial); for (size_t i = 0; i != segment.data.size(); ++i) { - memory.set(segment.offset + i, segment.data[i]); + table[offset + i] = segment.data[i]; } } } @@ -114,6 +126,19 @@ struct ShellExternalInterface : ModuleInstance::ExternalInterface { abort(); } + Literal callTable(Index index, Name type, LiteralList& arguments, ModuleInstance& instance) override { + if (index >= table.size()) trap("callTable overflow"); + auto* func = instance.wasm.getFunction(table[index]); + if (func->type.is() && func->type != type) trap("callIndirect: bad type"); + if (func->params.size() != arguments.size()) trap("callIndirect: bad # of arguments"); + for (size_t i = 0; i < func->params.size(); i++) { + if (func->params[i] != arguments[i].type) { + trap("callIndirect: bad argument type"); + } + } + return instance.callFunctionInternal(func->name, arguments); + } + Literal load(Load* load, Address addr) override { switch (load->type) { case i32: { |