From 6f3209e6c64155ff6696f6bd04c40edff9ad2c66 Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Sun, 11 Nov 2018 10:44:09 +0100 Subject: [PATCH] Fix imported memory fallback and add common stdlib imports to loader --- lib/loader/index.js | 29 ++++++++++++++++++-------- lib/loader/tests/assembly/index.ts | 4 ++++ lib/loader/tests/build/untouched.wasm | Bin 8542 -> 6968 bytes lib/loader/tests/index.js | 3 +++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/loader/index.js b/lib/loader/index.js index 31edb71f..224c674d 100644 --- a/lib/loader/index.js +++ b/lib/loader/index.js @@ -23,17 +23,24 @@ function getStringImpl(U32, U16, ptr) { function preInstantiate(imports) { var baseModule = {}; - // add the internal abort function that is called when an assertion fails or an error is thrown - if (!imports.env) imports.env = {}; - if (!imports.env.abort) imports.env.abort = function abort(mesg, file, line, colm) { - var memory = baseModule.memory || imports.env.memory; // prefer exported, otherwise try imported - function getString(memory, ptr) { - if (!memory) return ""; - var buffer = memory.buffer; - return getStringImpl(new Uint32Array(buffer), new Uint16Array(buffer), ptr); - } + function getString(memory, ptr) { + if (!memory) return ""; + var buffer = memory.buffer; + return getStringImpl(new Uint32Array(buffer), new Uint16Array(buffer), ptr); + } + + // add common imports used by stdlib for convenience + var env = (imports.env = imports.env || {}); + env.abort = env.abort || function abort(mesg, file, line, colm) { + var memory = baseModule.memory || env.memory; // prefer exported, otherwise try imported throw Error("abort: " + getString(memory, mesg) + " at " + getString(memory, file) + ":" + line + ":" + colm); } + env.trace = env.trace || function trace(mesg, n) { + var memory = baseModule.memory || env.memory; + console.log("trace: " + getString(memory, mesg) + (n ? " " : "") + Array.prototype.slice.call(arguments, 2, 2 + n).join(", ")); + } + imports.Math = imports.Math || Math; + imports.Date = imports.Date || Date; return baseModule; } @@ -176,6 +183,10 @@ function postInstantiate(baseModule, instance) { baseModule.getFunction = getFunction; + // Pull basic exports to baseModule so code in preInstantiate can use them + baseModule.memory = baseModule.memory || memory; + baseModule.table = baseModule.table || table; + // Demangle exports and provide the usual utility on the prototype return demangle(rawExports, Object.defineProperties(baseModule, { I8: { get: function() { checkMem(); return I8; } }, diff --git a/lib/loader/tests/assembly/index.ts b/lib/loader/tests/assembly/index.ts index 98a26f59..1c60c327 100644 --- a/lib/loader/tests/assembly/index.ts +++ b/lib/loader/tests/assembly/index.ts @@ -60,3 +60,7 @@ export const varadd_ptr = varadd; export function calladd(fn: (a: i32, b: i32) => i32, a: i32, b: i32): i32 { return fn(a, b); } + +export function dotrace(num: f64): void { + trace("The answer is", 1, num); +} diff --git a/lib/loader/tests/build/untouched.wasm b/lib/loader/tests/build/untouched.wasm index 18ec0b8e80a9d7b7ff62668f9f0e89a3e14d55dd..656568dff51357314729c7c34a320bc9a50f37ba 100644 GIT binary patch delta 1926 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 W%#)qnS^eT&NA>4}TQDyjr2h-cHUCTi diff --git a/lib/loader/tests/index.js b/lib/loader/tests/index.js index b85fafe1..917668ef 100644 --- a/lib/loader/tests/index.js +++ b/lib/loader/tests/index.js @@ -59,3 +59,6 @@ assert.strictEqual(fn(2), 4); // should be able to create a new function and call it from WASM ptr = module.newFunction(module.varadd); assert.strictEqual(module.calladd(ptr, 2, 3), 5); + +// should be able to use trace +module.dotrace(42);