diff options
-rw-r--r-- | src/asm2wasm.h | 12 | ||||
-rw-r--r-- | src/wasm-js.cpp | 14 |
2 files changed, 22 insertions, 4 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h index c8dd3f9dd..356077460 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -329,6 +329,7 @@ void Asm2WasmBuilder::processAsm(Ref ast) { auto addImport = [&](IString name, Ref imported, WasmType type) { assert(imported[0] == DOT); Ref module = imported[1]; + IString moduleName; if (module[0] == DOT) { // we can have (global.Math).floor; skip the 'Math' assert(module[1][0] == NAME); @@ -343,12 +344,17 @@ void Asm2WasmBuilder::processAsm(Ref ast) { return; } } - module = module[1]; + std::string fullName = module[1][1]->getCString(); + fullName += '.'; + fullName += + module[2]->getCString(); + moduleName = IString(fullName.c_str(), false); + } else { + assert(module[0] == NAME); + moduleName = module[1]->getIString(); } - assert(module[0] == NAME); Import import; import.name = name; - import.module = module[1]->getIString(); + import.module = moduleName; import.base = imported[2]->getIString(); // special-case some asm builtins if (import.module == GLOBAL && (import.base == NAN_ || import.base == INFINITY_)) { diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp index 93a1036ac..c966e07cf 100644 --- a/src/wasm-js.cpp +++ b/src/wasm-js.cpp @@ -95,7 +95,19 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm(char *input) { var base = Pointer_stringify($1); var tempArguments = Module['tempArguments']; Module['tempArguments'] = null; - return Module['info'][mod][base].apply(null, tempArguments); + var lookup = Module['info']; + if (mod.indexOf('.') < 0) { + lookup = (lookup || {})[mod]; + } else { + var parts = mod.split('.'); + lookup = (lookup || {})[parts[0]]; + lookup = (lookup || {})[parts[1]]; + } + lookup = (lookup || {})[base]; + if (!lookup) { + abort('bad CallImport to (' + mod + ').' + base); + } + return lookup.apply(null, tempArguments); }, import->module.str, import->base.str)); } |