summaryrefslogtreecommitdiff
path: root/src/shell-interface.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/shell-interface.h')
-rw-r--r--src/shell-interface.h29
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: {