diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/js/post.js | 17 | ||||
-rw-r--r-- | src/wasm-js.cpp | 17 |
2 files changed, 22 insertions, 12 deletions
diff --git a/src/js/post.js b/src/js/post.js index fe9e1b516..c9e29f6e8 100644 --- a/src/js/post.js +++ b/src/js/post.js @@ -31,12 +31,29 @@ parent: Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program. }; + wasmJS['lookupImport'] = function(mod, base) { + var lookup = 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; + } + // The asm.js function, called to "link" the asm.js module. Module['asm'] = function(global, env, buffer) { assert(buffer === theBuffer); // we should not even need to pass it as a 3rd arg for wasm, but that's the asm.js way. // write the provided data to a location the wasm instance can get at it. info.global = global; info.env = env; + wasmJS['_load_mapped_globals'](); // now that we have global and env, we can ready the provided imported globals, copying them to their mapped locations. return wasmJS['asmExports']; }; })(); diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp index 4c8e27423..bedc65d48 100644 --- a/src/wasm-js.cpp +++ b/src/wasm-js.cpp @@ -95,18 +95,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm(char *input) { var base = Pointer_stringify($1); var tempArguments = Module['tempArguments']; Module['tempArguments'] = null; - 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); - } + var lookup = Module['lookupImport'](mod, base); return lookup.apply(null, tempArguments); }, import->module.str, import->base.str)); } @@ -173,6 +162,10 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm(char *input) { instance = new ModuleInstance(*wasm, new JSExternalInterface()); } +// Ready the provided imported globals, copying them to their mapped locations. +extern "C" void EMSCRIPTEN_KEEPALIVE load_mapped_globals() { +} + // Does a call from js into an export of the module. extern "C" double EMSCRIPTEN_KEEPALIVE call_from_js(const char *target) { IString name(target); |