Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions scripts/test/wasm2js.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@


def check_for_stale_files():
if shared.options.test_name_filter:
return

# TODO(sbc): Generalize and apply other test suites
all_tests = []
for t in tests + spec_tests + wasm2js_tests:
Expand Down
6 changes: 0 additions & 6 deletions scripts/wasm2js.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@ var WebAssembly = {
Memory: function(opts) {
return {
buffer: new ArrayBuffer(opts['initial'] * 64 * 1024),
grow: function(amount) {
var oldBuffer = this.buffer;
var ret = __growWasmMemory(amount);
assert(this.buffer !== oldBuffer); // the call should have updated us
return ret;
}
};
},

Expand Down
46 changes: 40 additions & 6 deletions src/wasm2js.h
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ class Wasm2JSBuilder {
void addExports(Ref ast, Module* wasm);
void addGlobal(Ref ast, Global* global);
void addMemoryFuncs(Ref ast, Module* wasm);
void addMemoryGrowthFuncs(Ref ast, Module* wasm);
void addMemoryGrowFunc(Ref ast, Module* wasm);

Wasm2JSBuilder() = delete;
Wasm2JSBuilder(const Wasm2JSBuilder&) = delete;
Expand Down Expand Up @@ -383,19 +383,43 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) {
ret[1]->push_back(asmFunc);
ValueBuilder::appendArgumentToFunction(asmFunc, GLOBAL);
ValueBuilder::appendArgumentToFunction(asmFunc, ENV);

if (wasm->memory.exists) {
ValueBuilder::appendArgumentToFunction(asmFunc, BUFFER);
// add memory import
if (wasm->memory.imported()) {
// find memory and buffer in imports
Ref theVar = ValueBuilder::makeVar();
asmFunc[3]->push_back(theVar);
ValueBuilder::appendToVar(
theVar,
"memory",
ValueBuilder::makeDot(ValueBuilder::makeName(ENV),
ValueBuilder::makeName(wasm->memory.base)));

// Assign `buffer = memory.buffer`
Ref buf = ValueBuilder::makeVar();
asmFunc[3]->push_back(buf);
ValueBuilder::appendToVar(
buf,
BUFFER,
ValueBuilder::makeDot(ValueBuilder::makeName("memory"),
ValueBuilder::makeName("buffer")));

// If memory is growable, override the imported memory's grow method to
// ensure so that when grow is called from the output it works as expected
if (wasm->memory.max > wasm->memory.initial) {
asmFunc[3]->push_back(
ValueBuilder::makeStatement(ValueBuilder::makeBinary(
ValueBuilder::makeDot(ValueBuilder::makeName("memory"),
ValueBuilder::makeName("grow")),
SET,
ValueBuilder::makeName(WASM_MEMORY_GROW))));
}
} else {
// find memory as third argument
ValueBuilder::appendArgumentToFunction(asmFunc, BUFFER);
}
}

// add table import
if (wasm->table.exists && wasm->table.imported()) {
Ref theVar = ValueBuilder::makeVar();
Expand Down Expand Up @@ -2205,11 +2229,11 @@ void Wasm2JSBuilder::addMemoryFuncs(Ref ast, Module* wasm) {
ast->push_back(memorySizeFunc);

if (wasm->memory.max > wasm->memory.initial) {
addMemoryGrowthFuncs(ast, wasm);
addMemoryGrowFunc(ast, wasm);
}
}

void Wasm2JSBuilder::addMemoryGrowthFuncs(Ref ast, Module* wasm) {
void Wasm2JSBuilder::addMemoryGrowFunc(Ref ast, Module* wasm) {
Ref memoryGrowFunc = ValueBuilder::makeFunction(WASM_MEMORY_GROW);
ValueBuilder::appendArgumentToFunction(memoryGrowFunc, IString("pagesToAdd"));

Expand Down Expand Up @@ -2506,6 +2530,16 @@ void Wasm2JSGlue::emitPostES6() {
out << ",\n " << asmangle(import->base.str);
});

ModuleUtils::iterImportedMemories(wasm, [&](Memory* import) {
// The special helpers are emitted in the glue, see code and comments
// below.
if (ABI::wasm2js::isHelper(import->base)) {
return;
}
out << ",\n " << asmangle(import->base.str) << ": { buffer : mem"
<< moduleName.str << " }";
});

ModuleUtils::iterImportedTables(wasm, [&](Table* import) {
// The special helpers are emitted in the glue, see code and comments
// below.
Expand All @@ -2515,7 +2549,7 @@ void Wasm2JSGlue::emitPostES6() {
out << ",\n " << asmangle(import->base.str);
});

if (wasm.memory.exists) {
if (wasm.memory.exists && !wasm.memory.imported()) {
out << "\n },\n mem" << moduleName.str << "\n);\n";
} else {
out << "\n });\n";
Expand Down
10 changes: 5 additions & 5 deletions test/wasm2js/deterministic.2asm.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down Expand Up @@ -53,8 +54,7 @@ var retasmFunc = asmFunc({
NaN,
Infinity
}, {
abort: function() { throw new Error('abort'); }
},
memasmFunc
);
abort: function() { throw new Error('abort'); },
memory: { buffer : memasmFunc }
});
export var foo = retasmFunc.foo;
10 changes: 5 additions & 5 deletions test/wasm2js/deterministic.2asm.js.opt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down Expand Up @@ -52,8 +53,7 @@ var retasmFunc = asmFunc({
NaN,
Infinity
}, {
abort: function() { throw new Error('abort'); }
},
memasmFunc
);
abort: function() { throw new Error('abort'); },
memory: { buffer : memasmFunc }
});
export var foo = retasmFunc.foo;
10 changes: 5 additions & 5 deletions test/wasm2js/dynamicLibrary.2asm.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ function Table(ret) {
return ret;
}

function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down Expand Up @@ -96,8 +97,7 @@ var retasmFunc = asmFunc({
NaN,
Infinity
}, {
abort: function() { throw new Error('abort'); }
},
memasmFunc
);
abort: function() { throw new Error('abort'); },
memory: { buffer : memasmFunc }
});
export var baz = retasmFunc.baz;
10 changes: 5 additions & 5 deletions test/wasm2js/dynamicLibrary.2asm.js.opt
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ function Table(ret) {
return ret;
}

function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down Expand Up @@ -88,8 +89,7 @@ var retasmFunc = asmFunc({
NaN,
Infinity
}, {
abort: function() { throw new Error('abort'); }
},
memasmFunc
);
abort: function() { throw new Error('abort'); },
memory: { buffer : memasmFunc }
});
export var baz = retasmFunc.baz;
3 changes: 2 additions & 1 deletion test/wasm2js/emscripten-grow-no.2asm.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
function instantiate(asmLibraryArg, wasmMemory) {
function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down
3 changes: 2 additions & 1 deletion test/wasm2js/emscripten-grow-no.2asm.js.opt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
function instantiate(asmLibraryArg, wasmMemory) {
function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down
4 changes: 3 additions & 1 deletion test/wasm2js/emscripten-grow-yes.2asm.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
function instantiate(asmLibraryArg, wasmMemory) {
function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
memory.grow = __wasm_memory_grow;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down
4 changes: 3 additions & 1 deletion test/wasm2js/emscripten-grow-yes.2asm.js.opt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
function instantiate(asmLibraryArg, wasmMemory) {
function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
memory.grow = __wasm_memory_grow;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down
3 changes: 2 additions & 1 deletion test/wasm2js/emscripten.2asm.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
function instantiate(asmLibraryArg, wasmMemory) {
function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var FUNCTION_TABLE = env.table;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
Expand Down
3 changes: 2 additions & 1 deletion test/wasm2js/emscripten.2asm.js.opt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
function instantiate(asmLibraryArg, wasmMemory) {
function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.memory;
var buffer = memory.buffer;
var FUNCTION_TABLE = env.table;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
Expand Down
11 changes: 6 additions & 5 deletions test/wasm2js/minified-memory.2asm.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@

function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.a;
var buffer = memory.buffer;
memory.grow = __wasm_memory_grow;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down Expand Up @@ -72,8 +74,7 @@ var retasmFunc = asmFunc({
NaN,
Infinity
}, {
abort: function() { throw new Error('abort'); }
},
memasmFunc
);
abort: function() { throw new Error('abort'); },
a: { buffer : memasmFunc }
});
export var foo = retasmFunc.foo;
11 changes: 6 additions & 5 deletions test/wasm2js/minified-memory.2asm.js.opt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@

function asmFunc(global, env, buffer) {
function asmFunc(global, env) {
var memory = env.a;
var buffer = memory.buffer;
memory.grow = __wasm_memory_grow;
var HEAP8 = new global.Int8Array(buffer);
var HEAP16 = new global.Int16Array(buffer);
var HEAP32 = new global.Int32Array(buffer);
Expand Down Expand Up @@ -72,8 +74,7 @@ var retasmFunc = asmFunc({
NaN,
Infinity
}, {
abort: function() { throw new Error('abort'); }
},
memasmFunc
);
abort: function() { throw new Error('abort'); },
a: { buffer : memasmFunc }
});
export var foo = retasmFunc.foo;