summaryrefslogtreecommitdiff
path: root/src/wasm-js.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm-js.cpp')
-rw-r--r--src/wasm-js.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp
index d978e4a2a..1db313727 100644
--- a/src/wasm-js.cpp
+++ b/src/wasm-js.cpp
@@ -177,6 +177,18 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
}, curr->name.str);
}
+ // verify imports are provided
+ for (auto& pair : module->importsMap) {
+ auto& name = pair.first;
+ auto* import = pair.second;
+ EM_ASM_({
+ var mod = Pointer_stringify($0);
+ var base = Pointer_stringify($1);
+ var name = Pointer_stringify($2);
+ assert(Module['lookupImport'](mod, base), 'checking import ' + name + ' = ' + mod + '.' + base);
+ }, import->module.str, import->base.str, name.str);
+ }
+
if (wasmJSDebug) std::cerr << "creating instance...\n";
struct JSExternalInterface : ModuleInstance::ExternalInterface {
@@ -267,26 +279,31 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
}
// nicely aligned
if (!isWasmTypeFloat(load->type)) {
+ int32_t ret;
if (load->bytes == 1) {
if (load->signed_) {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAP8'][$0] }, addr));
+ ret = EM_ASM_INT({ return Module['info'].parent['HEAP8'][$0] }, addr);
} else {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAPU8'][$0] }, addr));
+ ret = EM_ASM_INT({ return Module['info'].parent['HEAPU8'][$0] }, addr);
}
} else if (load->bytes == 2) {
if (load->signed_) {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAP16'][$0 >> 1] }, addr));
+ ret = EM_ASM_INT({ return Module['info'].parent['HEAP16'][$0 >> 1] }, addr);
} else {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAPU16'][$0 >> 1] }, addr));
+ ret = EM_ASM_INT({ return Module['info'].parent['HEAPU16'][$0 >> 1] }, addr);
}
} else if (load->bytes == 4) {
if (load->signed_) {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAP32'][$0 >> 2] }, addr));
+ ret = EM_ASM_INT({ return Module['info'].parent['HEAP32'][$0 >> 2] }, addr);
} else {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAPU32'][$0 >> 2] }, addr));
+ ret = EM_ASM_INT({ return Module['info'].parent['HEAPU32'][$0 >> 2] }, addr);
}
- }
- abort();
+ } else if (load->bytes == 8) {
+ uint32_t low = EM_ASM_INT({ return Module['info'].parent['HEAP32'][$0 >> 2] }, addr);
+ uint32_t high = EM_ASM_INT({ return Module['info'].parent['HEAP32'][$0 >> 2] }, addr + 4);
+ return Literal(int64_t(low) | (int64_t(high) << 32));
+ } else abort();
+ return load->type == i32 ? Literal(ret) : Literal(int64_t(ret));
} else {
if (load->bytes == 4) {
return Literal((float)EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF32'][$0 >> 2] }, addr));