summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/js/post.js17
-rw-r--r--src/wasm-js.cpp17
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);