diff --git a/lib/loader/index.js b/lib/loader/index.js index f6da5730..470521f6 100644 --- a/lib/loader/index.js +++ b/lib/loader/index.js @@ -40,10 +40,13 @@ function preInstantiate(imports) { /** Prepares the final module once instantiation is complete. */ function postInstantiate(baseModule, instance) { - var memory = instance.exports.memory; - var memory_allocate = instance.exports["memory.allocate"]; - var memory_fill = instance.exports["memory.fill"]; - var memory_free = instance.exports["memory.free"]; + var rawExports = instance.exports; + var memory = rawExports.memory; + var memory_allocate = rawExports["memory.allocate"]; + var memory_fill = rawExports["memory.fill"]; + var memory_free = rawExports["memory.free"]; + var table = rawExports.table; + var setargc = rawExports._setargc || function() {}; // Provide views for all sorts of basic values var buffer, I8, U8, I16, U16, I32, U32, F32, F64, I64, U64; @@ -152,9 +155,6 @@ function postInstantiate(baseModule, instance) { baseModule.freeArray = freeArray; - // Reference the table and remember where to insert the next function - var table = exports.table; - /** Creates a new function in the module's table and returns its pointer. */ function newFunction(fn) { var index = table.length; @@ -169,7 +169,7 @@ function postInstantiate(baseModule, instance) { function getFunction(ptr) { var fn = table.get(ptr); return (...args) => { - exports._setargc(args.length); + setargc(args.length); return fn(...args); }; } @@ -177,7 +177,7 @@ function postInstantiate(baseModule, instance) { baseModule.getFunction = getFunction; // Demangle exports and provide the usual utility on the prototype - return demangle(instance.exports, Object.defineProperties(baseModule, { + return demangle(rawExports, Object.defineProperties(baseModule, { I8: { get: function() { checkMem(); return I8; } }, U8: { get: function() { checkMem(); return U8; } }, I16: { get: function() { checkMem(); return I16; } }, @@ -221,6 +221,7 @@ exports.instantiateStreaming = instantiateStreaming; /** Demangles an AssemblyScript module's exports to a friendly object structure. */ function demangle(exports, baseModule) { var module = baseModule ? Object.create(baseModule) : {}; + var setargc = exports._setargc || function() {}; function hasOwnProperty(elem, prop) { return Object.prototype.hasOwnProperty.call(elem, prop); } @@ -286,7 +287,7 @@ function demangle(exports, baseModule) { function wrapFunction(fn) { var ret = function(...args) { - exports._setargc(args.length); + setargc(args.length); return fn(...args); }; // adding a function to the table with `newFunction` is limited to actual exported WebAssembly diff --git a/lib/loader/tests/build/untouched.wasm b/lib/loader/tests/build/untouched.wasm index 18ec0b8e..4c19d941 100644 Binary files a/lib/loader/tests/build/untouched.wasm and b/lib/loader/tests/build/untouched.wasm differ