semi-working
diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp index ab10929..0237d63 100644 --- a/src/tools/wasm-ctor-eval.cpp +++ b/src/tools/wasm-ctor-eval.cpp
@@ -84,17 +84,43 @@ global->base.toString()); } - return ModuleRunnerBase<EvallingModuleRunner>::visitGlobalGet(curr); + return ModuleRunnerBase::visitGlobalGet(curr); + } + + Flow visitLoad(Load* curr) { + auto* memory = wasm.getMemory(curr->memory); + if (memory->imported()) { + throw FailToEvalException("Can't load from imported memory"); + } + + return ModuleRunnerBase::visitLoad(curr); + } + + Flow visitStore(Store* curr) { + auto* memory = wasm.getMemory(curr->memory); + if (memory->imported()) { + throw FailToEvalException("Can't store to imported memory"); + } + + return ModuleRunnerBase::visitStore(curr); } Flow visitTableGet(TableGet* curr) { - // We support tableLoad, below, so that call_indirect works (it calls it - // internally), but we want to disable table.get for now. - throw FailToEvalException("TODO: table.get"); + auto table = wasm.getTable(curr->table); + if (table->imported()) { + throw FailToEvalException("Can't get on imported table"); + } + + return ModuleRunnerBase::visitTableGet(curr); } - Flow visitTableSet(TableGet* curr) { - throw FailToEvalException("TODO: table.set"); + Flow visitTableSet(TableSet* curr) { + auto table = wasm.getTable(curr->table); + if (table->imported()) { + throw FailToEvalException("Can't set on imported table"); + } + + return ModuleRunnerBase::visitTableSet(curr); } bool allowContNew = true; @@ -103,7 +129,7 @@ if (!allowContNew) { throw FailToEvalException("cont.new disallowed"); } - return ModuleRunnerBase<EvallingModuleRunner>::visitContNew(curr); + return ModuleRunnerBase::visitContNew(curr); } // This needs to be duplicated from ModuleRunner, unfortunately.
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 2a39335..2221a65 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h
@@ -29,6 +29,7 @@ #define wasm_wasm_interpreter_h #include <cmath> +#include <iomanip> #include <limits.h> #include <sstream> #include <variant> @@ -3310,7 +3311,8 @@ it != linkedInstances.end()) { importedInstance = it->second.get(); } else { - WASM_UNREACHABLE("no imported module for getTableInstanceInfo"); + Fatal() << "getTableInstanceInfo: no imported module providing " + << std::quoted(name.toString()); } // auto& importedInstance = linkedInstances.at(table->module); auto* tableExport = importedInstance->wasm.getExport(table->base); @@ -3368,7 +3370,14 @@ MemoryInstanceInfo getMemoryInstanceInfo(Name name) { auto* memory = wasm.getMemory(name); if (memory->imported()) { - auto& importedInstance = linkedInstances.at(memory->module); + SubType* importedInstance; + if (auto it = linkedInstances.find(memory->module); + it != linkedInstances.end()) { + importedInstance = it->second.get(); + } else { + Fatal() << "getMemoryInstanceInfo: no imported module providing " + << std::quoted(name.toString()); + } auto* memoryExport = importedInstance->wasm.getExport(memory->base); return importedInstance->getMemoryInstanceInfo( *memoryExport->getInternalName());
diff --git a/test/ctor-eval/imports.wast b/test/ctor-eval/imports.wast index fa5f7ba..0fcf5c2 100644 --- a/test/ctor-eval/imports.wast +++ b/test/ctor-eval/imports.wast
@@ -1,14 +1,15 @@ (module ;; (import "import" "tag" (tag $tag)) ;; (import "import" "func" (func $logi64 (param i64))) - ;; (import "import" "global" (global $global i32)) + (import "import" "global" (global $global i32)) ;; (import "import" "table" (table $table 1 1 anyref)) (import "import" "memory" (memory $memory 1 1)) (global $non-imported-global (mut i32) (i32.const 5)) (func $foo (result i32) (nop) - (i32.store (i32.const 1) (i32.const 1)) + ;; (i32.store (i32.const 1) (i32.const 1)) +;; (drop (i32.load $memory (i32.const 1))) (drop (global.get $non-imported-global)) (global.set $non-imported-global (i32.const 2)) (i32.const 1)