Commit c38cd169 authored by titzer's avatar titzer Committed by Commit bot

[wasm] Use the JavaScript WasmModuleBuilder utility in JS tests.

R=ahaas@chromium.org,binji@chromium.org
BUG=

Review URL: https://codereview.chromium.org/1770913002

Cr-Commit-Position: refs/heads/master@{#34559}
parent 065ae3dd
...@@ -5,141 +5,100 @@ ...@@ -5,141 +5,100 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function assertModule(module, memsize) {
// Check the module exists.
assertFalse(module === undefined);
assertFalse(module === null);
assertFalse(module === 0);
assertEquals("object", typeof module);
// Check the memory is an ArrayBuffer.
var mem = module.memory;
assertFalse(mem === undefined);
assertFalse(mem === null);
assertFalse(mem === 0);
assertEquals("object", typeof mem);
assertTrue(mem instanceof ArrayBuffer);
for (var i = 0; i < 4; i++) {
module.memory = 0; // should be ignored
assertEquals(mem, module.memory);
}
assertEquals(memsize, module.memory.byteLength);
}
var module = (function () { function assertFunction(module, func) {
var kBodySize = 5; assertEquals("object", typeof module.exports);
var kNameOffset = kHeaderSize + 21 + kBodySize + 1;
var exp = module.exports[func];
return _WASMEXP_.instantiateModule(bytesWithHeader( assertFalse(exp === undefined);
// -- memory assertFalse(exp === null);
kDeclMemory, assertFalse(exp === 0);
1, 1, 1, assertEquals("function", typeof exp);
// -- signatures
kDeclSignatures, 1,
2, kAstI32, kAstI32, kAstI32, // int, int -> int
// -- functions
kDeclFunctions, 1,
kDeclFunctionName | kDeclFunctionExport,
0, 0,
kNameOffset, 0, 0, 0, // name offset
kBodySize, 0,
// -- body
kExprI32Sub, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
kDeclEnd,
's', 'u', 'b', 0 // name
));
})();
// Check the module exists. return exp;
assertFalse(module === undefined);
assertFalse(module === null);
assertFalse(module === 0);
assertEquals("object", typeof module);
// Check the memory is an ArrayBuffer.
var mem = module.memory;
assertFalse(mem === undefined);
assertFalse(mem === null);
assertFalse(mem === 0);
assertEquals("object", typeof mem);
assertTrue(mem instanceof ArrayBuffer);
for (var i = 0; i < 4; i++) {
module.memory = 0; // should be ignored
assertEquals(mem, module.memory);
} }
assertEquals(65536, module.memory.byteLength); (function SubTest() {
// Check the properties of the sub function. var builder = new WasmModuleBuilder();
assertEquals("function", typeof module.sub);
builder.addMemory(1, 1, true);
assertEquals(-55, module.sub(33, 88)); builder.addFunction("sub", [kAstI32, kAstI32, kAstI32])
assertEquals(-55555, module.sub(33333, 88888)); .addBody([
assertEquals(-5555555, module.sub(3333333, 8888888)); kExprI32Sub, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1]) // --
var module = (function() { .exportFunc()
var kBodySize = 1;
var kNameOffset2 = kHeaderSize + 19 + kBodySize + 1; var module = builder.instantiate();
assertModule(module, kPageSize);
return _WASMEXP_.instantiateModule(bytesWithHeader(
// -- memory // Check the properties of the sub function.
kDeclMemory, var sub = assertFunction(module, "sub");
1, 1, 1, assertEquals(-55, sub(33, 88));
// -- signatures assertEquals(-55555, sub(33333, 88888));
kDeclSignatures, 1, assertEquals(-5555555, sub(3333333, 8888888));
0, kAstStmt, // signature: void -> void
// -- functions
kDeclFunctions, 1,
kDeclFunctionName | kDeclFunctionExport,
0, 0, // signature index
kNameOffset2, 0, 0, 0, // name offset
kBodySize, 0,
kExprNop, // body
kDeclEnd,
'n', 'o', 'p', 0 // name
));
})(); })();
// Check the module exists.
assertFalse(module === undefined);
assertFalse(module === null);
assertFalse(module === 0);
assertEquals("object", typeof module);
// Check the memory is an ArrayBuffer.
var mem = module.memory;
assertFalse(mem === undefined);
assertFalse(mem === null);
assertFalse(mem === 0);
assertEquals("object", typeof mem);
assertTrue(mem instanceof ArrayBuffer);
for (var i = 0; i < 4; i++) {
module.memory = 0; // should be ignored
assertEquals(mem, module.memory);
}
assertEquals(65536, module.memory.byteLength); (function NopTest() {
var builder = new WasmModuleBuilder();
// Check the properties of the sub function. var kPages = 2;
assertFalse(module.nop === undefined); builder.addMemory(kPages, kPages, true);
assertFalse(module.nop === null); builder.addFunction("nop", [kAstStmt])
assertFalse(module.nop === 0); .addBody([kExprNop])
assertEquals("function", typeof module.nop); .exportFunc();
var module = builder.instantiate();
assertModule(module, kPageSize * kPages);
var nop = assertFunction(module, "nop");
assertEquals(undefined, nop());
})();
assertEquals(undefined, module.nop());
(function testLt() { (function testLt() {
var kBodySize = 5; var builder = new WasmModuleBuilder();
var kNameOffset = kHeaderSize + 21 + kBodySize + 1;
var kPages = 3;
var data = bytesWithHeader( builder.addMemory(kPages, kPages, true);
// -- memory builder.addFunction("flt", [kAstI32, kAstF64, kAstF64])
kDeclMemory, .addBody([
1, 1, 1, kExprF64Lt, // --
// -- signatures kExprGetLocal, 0, // --
kDeclSignatures, 1, kExprGetLocal, 1]) // --
2, kAstI32, kAstF64, kAstF64, // (f64,f64)->int .exportFunc();
// -- functions
kDeclFunctions, 1, var module = builder.instantiate();
kDeclFunctionName | kDeclFunctionExport, assertModule(module, kPageSize * kPages);
0, 0, // signature index
kNameOffset, 0, 0, 0, // name offset var flt = assertFunction(module, "flt");
kBodySize, 0, assertEquals(1, flt(-2, -1));
// -- body assertEquals(0, flt(7.3, 7.1));
kExprF64Lt, // -- assertEquals(1, flt(7.1, 7.3));
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
kDeclEnd,
'f', 'l', 't', 0 // name
);
var module = _WASMEXP_.instantiateModule(data);
assertEquals("function", typeof module.flt);
assertEquals(1, module.flt(-2, -1));
assertEquals(0, module.flt(7.3, 7.1));
assertEquals(1, module.flt(7.1, 7.3));
})(); })();
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
// Flags: --expose-wasm --expose-gc --allow-natives-syntax // Flags: --expose-wasm --expose-gc --allow-natives-syntax
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function assertTraps(code, msg) { function assertTraps(code, msg) {
var threwException = true; var threwException = true;
...@@ -29,38 +30,18 @@ function assertTraps(code, msg) { ...@@ -29,38 +30,18 @@ function assertTraps(code, msg) {
} }
function makeDivRem(opcode) { function makeBinop(opcode) {
var kBodySize = 5; var builder = new WasmModuleBuilder();
var kNameMainOffset = kHeaderSize + 6 + 11 + kBodySize + 1;
builder.addFunction("main", [kAstI32, kAstI32, kAstI32])
var data = bytesWithHeader( .addBody([opcode, kExprGetLocal, 0, kExprGetLocal, 1])
// signatures .exportFunc();
kDeclSignatures, 1,
2, kAstI32, kAstI32, kAstI32, // (int,int) -> int return builder.instantiate().exports.main;
// -- main function
kDeclFunctions, 1,
kDeclFunctionName | kDeclFunctionExport,
0, 0,
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0,
// main body
opcode, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
// names
kDeclEnd,
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data);
assertEquals("function", typeof module.main);
return module.main;
} }
var divs = makeDivRem(kExprI32DivS); var divs = makeBinop(kExprI32DivS);
var divu = makeDivRem(kExprI32DivU); var divu = makeBinop(kExprI32DivU);
assertEquals( 33, divs( 333, 10)); assertEquals( 33, divs( 333, 10));
assertEquals(-33, divs(-336, 10)); assertEquals(-33, divs(-336, 10));
...@@ -78,8 +59,8 @@ assertTraps(kTrapDivUnrepresentable, "divs(0x80000000, -1)"); ...@@ -78,8 +59,8 @@ assertTraps(kTrapDivUnrepresentable, "divs(0x80000000, -1)");
assertEquals(0, divu(0x80000000, -1)); assertEquals(0, divu(0x80000000, -1));
var rems = makeDivRem(kExprI32RemS); var rems = makeBinop(kExprI32RemS);
var remu = makeDivRem(kExprI32RemU); var remu = makeBinop(kExprI32RemU);
assertEquals( 3, rems( 333, 10)); assertEquals( 3, rems( 333, 10));
assertEquals(-6, rems(-336, 10)); assertEquals(-6, rems(-336, 10));
......
...@@ -5,38 +5,20 @@ ...@@ -5,38 +5,20 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
(function testExportedMain() { (function testExportedMain() {
var kBodySize = 3; var kReturnValue = 88;
var kReturnValue = 99; var builder = new WasmModuleBuilder();
var kNameMainOffset = kHeaderSize + 4 + 7 + kBodySize + 8 + 1;
var data = bytesWithHeader( builder.addFunction("main", [kAstI32])
// signatures .addBody([
kDeclSignatures, 1, kExprReturn,
0, kAstI32, // void -> i32 kExprI8Const,
// -- main function kReturnValue])
kDeclFunctions, .exportFunc();
1,
0, // decl flags
0, 0, // signature index
kBodySize, 0,
// main body
kExprReturn,
kExprI8Const,
kReturnValue,
// exports
kDeclExportTable,
1,
0, 0, // func index index
kNameMainOffset, 0, 0, 0, // function name offset
// names
kDeclEnd,
'm', 'a', 'i', 'n', 0 // --
);
var ffi = new Object(); var module = builder.instantiate();
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("object", typeof module.exports); assertEquals("object", typeof module.exports);
assertEquals("function", typeof module.exports.main); assertEquals("function", typeof module.exports.main);
...@@ -45,45 +27,24 @@ load("test/mjsunit/wasm/wasm-constants.js"); ...@@ -45,45 +27,24 @@ load("test/mjsunit/wasm/wasm-constants.js");
})(); })();
(function testExportedTwice() { (function testExportedTwice() {
var kBodySize = 3;
var kReturnValue = 99; var kReturnValue = 99;
var kNameMainOffset = kHeaderSize + 4 + 7 + kBodySize + 14 + 1;
var kNameFooOffset = kNameMainOffset + 5;
var data = bytesWithHeader( var builder = new WasmModuleBuilder();
// signatures
kDeclSignatures, 1, builder.addFunction("main", [kAstI32])
0, kAstI32, // void -> i32 .addBody([
// -- main function kExprReturn,
kDeclFunctions, kExprI8Const,
1, kReturnValue])
0, // decl flags .exportAs("blah")
0, 0, // signature index .exportAs("foo");
kBodySize, 0,
// main body
kExprReturn,
kExprI8Const,
kReturnValue,
// exports
kDeclExportTable,
2,
0, 0, // func index index
kNameMainOffset, 0, 0, 0, // function name offset
0, 0, // func index index
kNameFooOffset, 0, 0, 0, // function name offset
// names
kDeclEnd,
'b', 'l', 'a', 'h', 0, // --
'f', 'o', 'o', 0 // --
);
var ffi = new Object(); var module = builder.instantiate();
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("object", typeof module.exports); assertEquals("object", typeof module.exports);
assertEquals("function", typeof module.exports.blah); assertEquals("function", typeof module.exports.blah);
assertEquals("function", typeof module.exports.foo); assertEquals("function", typeof module.exports.foo);
assertEquals(kReturnValue, module.exports.blah());
assertEquals(kReturnValue, module.exports.foo()); assertEquals(kReturnValue, module.exports.foo());
assertEquals(kReturnValue, module.exports.blah());
})(); })();
...@@ -5,40 +5,21 @@ ...@@ -5,40 +5,21 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function testCallFFI(ffi) { function testCallFFI(ffi) {
var kBodySize = 6; var builder = new WasmModuleBuilder();
var kNameAddOffset = kHeaderSize + 28 + kBodySize + 1;
var kNameMainOffset = kNameAddOffset + 4; var sig_index = [kAstI32, kAstF64, kAstF64];
builder.addImport("fun", sig_index);
var data = bytesWithHeader( builder.addFunction("main", sig_index)
kDeclMemory, .addBody([
1, 1, 1, // memory kExprCallImport, 0, // --
// -- signatures kExprGetLocal, 0, // --
kDeclSignatures, 1, kExprGetLocal, 1]) // --
2, kAstI32, kAstF64, kAstF64, // (f64,f64)->int .exportFunc();
// -- foreign function
kDeclFunctions, 2, var module = builder.instantiate(ffi);
kDeclFunctionName | kDeclFunctionImport,
0, 0, // signature index
kNameAddOffset, 0, 0, 0, // name offset
// -- main function
kDeclFunctionName | kDeclFunctionExport,
0, 0, // signature index
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0,
// main body
kExprCallFunction, 0, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
// names
kDeclEnd,
'f', 'u', 'n', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
print("instantiate FFI");
var module = _WASMEXP_.instantiateModule(data, ffi);
} }
// everything is good. // everything is good.
......
...@@ -5,52 +5,31 @@ ...@@ -5,52 +5,31 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function testCallFFI(func, check) { function testCallFFI(func, check) {
var kBodySize = 6; var builder = new WasmModuleBuilder();
var kNameFunOffset = kHeaderSize + 24 + kBodySize + 1;
var kNameMainOffset = kNameFunOffset + 4; var sig_index = builder.addSignature([kAstI32, kAstF64, kAstF64]);
builder.addImport("func", sig_index);
var ffi = new Object(); builder.addFunction("main", sig_index)
ffi.fun = func; .addBody([
kExprCallImport, 0, // --
var data = bytesWithHeader( kExprGetLocal, 0, // --
// signatures kExprGetLocal, 1]) // --
kDeclSignatures, 1, .exportFunc();
2, kAstI32, kAstF64, kAstF64, // (f64,f64) -> int
// -- foreign function var main = builder.instantiate({func: func}).exports.main;
kDeclFunctions, 2,
kDeclFunctionName | kDeclFunctionImport,
0, 0,
kNameFunOffset, 0, 0, 0, // name offset
// -- main function
kDeclFunctionName | kDeclFunctionExport,
0, 0,
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0,
// main body
kExprCallFunction, 0, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
// names
kDeclEnd,
'f', 'u', 'n', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
for (var i = 0; i < 100000; i += 10003) { for (var i = 0; i < 100000; i += 10003) {
var a = 22.5 + i, b = 10.5 + i; var a = 22.5 + i, b = 10.5 + i;
var r = module.main(a, b); var r = main(a, b);
check(r, a, b); check(r, a, b);
} }
} }
var global = (function() { return this; })(); var global = (function() { return this; })();
var params = [-99, -99, -99, -99]; var params = [-99, -99, -99, -99, -99];
var was_called = false; var was_called = false;
var length = -1; var length = -1;
...@@ -189,62 +168,39 @@ testCallFFI(returnValue(objWithValueOf), checkReturn(198)); ...@@ -189,62 +168,39 @@ testCallFFI(returnValue(objWithValueOf), checkReturn(198));
function testCallBinopVoid(type, func, check) { function testCallBinopVoid(type, func, check) {
var kBodySize = 10;
var kNameFunOffset = kHeaderSize + 28 + kBodySize + 1;
var kNameMainOffset = kNameFunOffset + 4;
var ffi = new Object();
var passed_length = -1; var passed_length = -1;
var passed_a = -1; var passed_a = -1;
var passed_b = -1; var passed_b = -1;
var args_a = -1; var args_a = -1;
var args_b = -1; var args_b = -1;
ffi.fun = function(a, b) { ffi = {func: function(a, b) {
passed_length = arguments.length; passed_length = arguments.length;
passed_a = a; passed_a = a;
passed_b = b; passed_b = b;
args_a = arguments[0]; args_a = arguments[0];
args_b = arguments[1]; args_b = arguments[1];
} }};
var builder = new WasmModuleBuilder();
var data = bytesWithHeader( builder.addImport("func", [kAstStmt, type, type]);
// -- signatures builder.addFunction("main", [kAstI32, type, type])
kDeclSignatures, 2, .addBody([
2, kAstStmt, type, type, // (type,type)->void kExprBlock, 2, // --
2, kAstI32, type, type, // (type,type)->int kExprCallImport, 0, // --
// -- foreign function kExprGetLocal, 0, // --
kDeclFunctions, 2, kExprGetLocal, 1, // --
kDeclFunctionName | kDeclFunctionImport, kExprI8Const, 99]) // --
0, 0, // signature index .exportFunc()
kNameFunOffset, 0, 0, 0, // name offset
// -- main function var main = builder.instantiate(ffi).exports.main;
kDeclFunctionName | kDeclFunctionExport,
1, 0, // signature index
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0, // body size
// main body
kExprBlock, 2, // --
kExprCallFunction, 0, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
kExprI8Const, 99, // --
// names
kDeclEnd,
'f', 'u', 'n', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
print("testCallBinopVoid", type); print("testCallBinopVoid", type);
for (var i = 0; i < 100000; i += 10003.1) { for (var i = 0; i < 100000; i += 10003.1) {
var a = 22.5 + i, b = 10.5 + i; var a = 22.5 + i, b = 10.5 + i;
var r = module.main(a, b); var r = main(a, b);
assertEquals(99, r); assertEquals(99, r);
assertEquals(2, passed_length); assertEquals(2, passed_length);
var expected_a, expected_b; var expected_a, expected_b;
...@@ -282,51 +238,21 @@ testCallBinopVoid(kAstF64); ...@@ -282,51 +238,21 @@ testCallBinopVoid(kAstF64);
function testCallPrint() { function testCallPrint() {
var kBodySize = 10; var builder = new WasmModuleBuilder();
var kNamePrintOffset = kHeaderSize + 10 + 7 + 7 + 9 + kBodySize + 1;
var kNameMainOffset = kNamePrintOffset + 6; builder.addImport("print", [kAstStmt, kAstI32]);
builder.addImport("print", [kAstStmt, kAstF64]);
var ffi = new Object(); builder.addFunction("main", [kAstStmt, kAstF64])
ffi.print = print; .addBody([
kExprBlock, 2, // --
var data = bytesWithHeader( kExprCallImport, 0, // --
// -- signatures kExprI8Const, 97, // --
kDeclSignatures, 2, kExprCallImport, 1, // --
1, kAstStmt, kAstI32, // i32->void kExprGetLocal, 0]) // --
1, kAstStmt, kAstF64, // f64->int .exportFunc()
kDeclFunctions, 3,
// -- import print i32 var main = builder.instantiate({print: print}).exports.main;
kDeclFunctionName | kDeclFunctionImport, for (var i = -9; i < 900; i += 6.125) main(i);
0, 0, // signature index
kNamePrintOffset, 0, 0, 0, // name offset
// -- import print f64
kDeclFunctionName | kDeclFunctionImport,
1, 0, // signature index
kNamePrintOffset, 0, 0, 0, // name offset
// -- decl main
kDeclFunctionName | kDeclFunctionExport,
1, 0, // signature index
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0, // body size
// main body
kExprBlock, 2, // --
kExprCallFunction, 0, // --
kExprI8Const, 97, // --
kExprCallFunction, 1, // --
kExprGetLocal, 0, // --
// names
kDeclEnd,
'p', 'r', 'i', 'n', 't', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
for (var i = -9; i < 900; i += 6.125) {
module.main(i);
}
} }
testCallPrint(); testCallPrint();
......
...@@ -5,49 +5,25 @@ ...@@ -5,49 +5,25 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function testCallImport(func, check) { function testCallImport(func, check) {
var kBodySize = 6; var builder = new WasmModuleBuilder();
var kNameFunOffset = kHeaderSize + 29 + kBodySize + 1;
var kNameMainOffset = kNameFunOffset + 4;
var ffi = new Object(); var sig_index = builder.addSignature([kAstI32, kAstF64, kAstF64]);
ffi.fun = func; builder.addImport("func", sig_index);
builder.addFunction("main", sig_index)
var data = bytesWithHeader( .addBody([
// signatures kExprCallImport, 0, // --
kDeclSignatures, 1, kExprGetLocal, 0, // --
2, kAstI32, kAstF64, kAstF64, // (f64,f64) -> int kExprGetLocal, 1]) // --
// -- main function .exportAs("main");
kDeclFunctions,
1, var main = builder.instantiate({func: func}).exports.main;
kDeclFunctionName | kDeclFunctionExport,
0, 0,
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0,
// main body
kExprCallImport, 0, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
// imports
kDeclImportTable,
1,
0, 0, // sig index
0, 0, 0, 0, // module name offset
kNameFunOffset, 0, 0, 0, // function name offset
// names
kDeclEnd,
'f', 'u', 'n', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
for (var i = 0; i < 100000; i += 10003) { for (var i = 0; i < 100000; i += 10003) {
var a = 22.5 + i, b = 10.5 + i; var a = 22.5 + i, b = 10.5 + i;
var r = module.main(a, b); var r = main(a, b);
check(r, a, b); check(r, a, b);
} }
} }
...@@ -192,10 +168,6 @@ testCallImport(returnValue(objWithValueOf), checkReturn(198)); ...@@ -192,10 +168,6 @@ testCallImport(returnValue(objWithValueOf), checkReturn(198));
function testCallBinopVoid(type, func, check) { function testCallBinopVoid(type, func, check) {
var kBodySize = 10;
var kNameFunOffset = kHeaderSize + 28 + kBodySize + 1;
var kNameMainOffset = kNameFunOffset + 4;
var ffi = new Object(); var ffi = new Object();
var passed_length = -1; var passed_length = -1;
...@@ -204,7 +176,7 @@ function testCallBinopVoid(type, func, check) { ...@@ -204,7 +176,7 @@ function testCallBinopVoid(type, func, check) {
var args_a = -1; var args_a = -1;
var args_b = -1; var args_b = -1;
ffi.fun = function(a, b) { ffi.func = function(a, b) {
passed_length = arguments.length; passed_length = arguments.length;
passed_a = a; passed_a = a;
passed_b = b; passed_b = b;
...@@ -212,42 +184,25 @@ function testCallBinopVoid(type, func, check) { ...@@ -212,42 +184,25 @@ function testCallBinopVoid(type, func, check) {
args_b = arguments[1]; args_b = arguments[1];
} }
var data = bytesWithHeader( var builder = new WasmModuleBuilder();
// -- signatures
kDeclSignatures, 2, builder.addImport("func", [kAstStmt, type, type]);
2, kAstStmt, type, type, // (type,type)->void builder.addFunction("main", [kAstI32, type, type])
2, kAstI32, type, type, // (type,type)->int .addBody([
// -- foreign function kExprBlock, 2, // --
kDeclFunctions, 2, kExprCallImport, 0, // --
kDeclFunctionName | kDeclFunctionImport, kExprGetLocal, 0, // --
0, 0, // signature index kExprGetLocal, 1, // --
kNameFunOffset, 0, 0, 0, // name offset kExprI8Const, 99])
// -- main function .exportFunc("main");
kDeclFunctionName | kDeclFunctionExport,
1, 0, // signature index var main = builder.instantiate(ffi).exports.main;
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0, // body size
// main body
kExprBlock, 2, // --
kExprCallFunction, 0, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
kExprI8Const, 99, // --
// names
kDeclEnd,
'f', 'u', 'n', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
print("testCallBinopVoid", type); print("testCallBinopVoid", type);
for (var i = 0; i < 100000; i += 10003.1) { for (var i = 0; i < 100000; i += 10003.1) {
var a = 22.5 + i, b = 10.5 + i; var a = 22.5 + i, b = 10.5 + i;
var r = module.main(a, b); var r = main(a, b);
assertEquals(99, r); assertEquals(99, r);
assertEquals(2, passed_length); assertEquals(2, passed_length);
var expected_a, expected_b; var expected_a, expected_b;
...@@ -285,50 +240,22 @@ testCallBinopVoid(kAstF64); ...@@ -285,50 +240,22 @@ testCallBinopVoid(kAstF64);
function testCallPrint() { function testCallPrint() {
var kBodySize = 10; var builder = new WasmModuleBuilder();
var kNamePrintOffset = kHeaderSize + 10 + 7 + 7 + 9 + kBodySize + 1; builder.addImport("print", [kAstStmt, kAstI32]);
var kNameMainOffset = kNamePrintOffset + 6; builder.addImport("print", [kAstStmt, kAstF64]);
builder.addFunction("main", [kAstStmt, kAstF64])
var ffi = new Object(); .addBody([
ffi.print = print; kExprBlock, 2, // --
kExprCallImport, 0, // --
var data = bytesWithHeader( kExprI8Const, 97, // --
// -- signatures kExprCallImport, 1, // --
kDeclSignatures, 2, kExprGetLocal, 0]) // --
1, kAstStmt, kAstI32, // i32->void .exportFunc();
1, kAstStmt, kAstF64, // f64->int
kDeclFunctions, 3, var main = builder.instantiate({print: print}).exports.main;
// -- import print i32
kDeclFunctionName | kDeclFunctionImport, for (var i = -9; i < 900; i += 16.125) {
0, 0, // signature index main(i);
kNamePrintOffset, 0, 0, 0, // name offset
// -- import print f64
kDeclFunctionName | kDeclFunctionImport,
1, 0, // signature index
kNamePrintOffset, 0, 0, 0, // name offset
// -- decl main
kDeclFunctionName | kDeclFunctionExport,
1, 0, // signature index
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0, // body size
// main body
kExprBlock, 2, // --
kExprCallFunction, 0, // --
kExprI8Const, 97, // --
kExprCallFunction, 1, // --
kExprGetLocal, 0, // --
// names
kDeclEnd,
'p', 'r', 'i', 'n', 't', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
for (var i = -9; i < 900; i += 6.125) {
module.main(i);
} }
} }
...@@ -337,51 +264,19 @@ testCallPrint(); ...@@ -337,51 +264,19 @@ testCallPrint();
function testCallImport2(foo, bar, expected) { function testCallImport2(foo, bar, expected) {
var kBodySize = 5; var builder = new WasmModuleBuilder();
var kNameFooOffset = kHeaderSize + 37 + kBodySize + 1;
var kNameBarOffset = kNameFooOffset + 4; builder.addImport("foo", [kAstI32]);
var kNameMainOffset = kNameBarOffset + 4; builder.addImport("bar", [kAstI32]);
builder.addFunction("main", [kAstI32])
var ffi = new Object(); .addBody([
ffi.foo = foo; kExprI32Add, // --
ffi.bar = bar; kExprCallImport, 0, // --
kExprCallImport, 1]) // --
var data = bytesWithHeader( .exportFunc();
// signatures
kDeclSignatures, 1, var main = builder.instantiate({foo: foo, bar: bar}).exports.main;
0, kAstI32, // void -> i32 assertEquals(expected, main());
// -- main function
kDeclFunctions,
1,
kDeclFunctionName | kDeclFunctionExport,
0, 0,
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0,
// main body
kExprI32Add, // --
kExprCallImport, 0, // --
kExprCallImport, 1, // --
// imports
kDeclImportTable,
2,
0, 0, // sig index
0, 0, 0, 0, // module name offset
kNameFooOffset, 0, 0, 0, // function name offset
0, 0, // sig index
0, 0, 0, 0, // module name offset
kNameBarOffset, 0, 0, 0, // function name offset
// names
kDeclEnd,
'f', 'o', 'o', 0, // --
'b', 'a', 'r', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
assertEquals(expected, module.main());
} }
testCallImport2(function() { return 33; }, function () { return 44; }, 77); testCallImport2(function() { return 33; }, function () { return 44; }, 77);
...@@ -5,69 +5,42 @@ ...@@ -5,69 +5,42 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
var module = (function () { var module = (function () {
var kFuncWithBody = 9; var builder = new WasmModuleBuilder();
var kFuncImported = 7;
var kBodySize1 = 5; var sig_index = builder.addSignature([kAstI32, kAstI32, kAstI32]);
var kBodySize2 = 8; builder.addImport("add", sig_index);
var kFuncTableSize = 8; builder.addFunction("add", sig_index)
var kSubOffset = kHeaderSize + 13 + kFuncWithBody + kBodySize1 + kFuncImported + kFuncWithBody + kBodySize2 + kFuncTableSize + 1; .addBody([
var kAddOffset = kSubOffset + 4; kExprCallImport, 0, kExprGetLocal, 0, kExprGetLocal, 1
var kMainOffset = kAddOffset + 4; ]);
builder.addFunction("sub", sig_index)
var ffi = new Object(); .addBody([
ffi.add = (function(a, b) { return a + b | 0; }); kExprI32Sub, kExprGetLocal, 0, kExprGetLocal, 1
]);
return _WASMEXP_.instantiateModule(bytesWithHeader( builder.addFunction("main", [kAstI32, kAstI32, kAstI32, kAstI32])
// -- signatures .addBody([
kDeclSignatures, 2, kExprCallIndirect, sig_index,
2, kAstI32, kAstI32, kAstI32, // int, int -> int kExprGetLocal, 0,
3, kAstI32, kAstI32, kAstI32, kAstI32, // int, int, int -> int kExprGetLocal, 1,
// -- function #0 (sub) kExprGetLocal, 2])
kDeclFunctions, 3, .exportFunc()
kDeclFunctionName, builder.appendToFunctionTable([0, 1, 2]);
0, 0, // signature offset
kSubOffset, 0, 0, 0, // name offset return builder.instantiate({add: function(a, b) { return a + b | 0; }});
kBodySize1, 0, // body size
kExprI32Sub, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
// -- function #1 (add)
kDeclFunctionName | kDeclFunctionImport,
0, 0, // signature offset
kAddOffset, 0, 0, 0, // name offset
// -- function #2 (main)
kDeclFunctionName | kDeclFunctionExport,
1, 0, // signature offset
kMainOffset, 0, 0, 0, // name offset
kBodySize2, 0, // body size
kExprCallIndirect, 0,
kExprGetLocal, 0,
kExprGetLocal, 1,
kExprGetLocal, 2,
// -- function table
kDeclFunctionTable,
3,
0, 0,
1, 0,
2, 0,
kDeclEnd,
's', 'u', 'b', 0, // name
'a', 'd', 'd', 0, // name
'm', 'a', 'i', 'n', 0 // name
), ffi);
})(); })();
// Check the module exists. // Check the module exists.
assertFalse(module === undefined); assertFalse(module === undefined);
assertFalse(module === null); assertFalse(module === null);
assertFalse(module === 0); assertFalse(module === 0);
assertEquals("object", typeof module); assertEquals("object", typeof module.exports);
assertEquals("function", typeof module.main); assertEquals("function", typeof module.exports.main);
assertEquals(5, module.main(0, 12, 7)); assertEquals(5, module.exports.main(1, 12, 7));
assertEquals(19, module.main(1, 12, 7)); assertEquals(19, module.exports.main(0, 12, 7));
assertTraps(kTrapFuncSigMismatch, "module.main(2, 12, 33)"); assertTraps(kTrapFuncSigMismatch, "module.exports.main(2, 12, 33)");
assertTraps(kTrapFuncInvalid, "module.main(3, 12, 33)"); assertTraps(kTrapFuncInvalid, "module.exports.main(3, 12, 33)");
...@@ -5,33 +5,20 @@ ...@@ -5,33 +5,20 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
var kReturnValue = 117; var kReturnValue = 117;
var kBodySize = 2; var module = (function Build() {
var kNameOffset = kHeaderSize + 19 + kBodySize + 1; var builder = new WasmModuleBuilder();
var data = bytesWithHeader( builder.addMemory(1, 1, true);
// -- memory builder.addFunction("main", [kAstI32])
kDeclMemory, .addBody([kExprI8Const, kReturnValue])
1, 1, 1, .exportFunc();
// -- signatures
kDeclSignatures, 1, return builder.instantiate();
0, kAstI32, // signature: void -> int })();
// -- main function
kDeclFunctions, 1,
kDeclFunctionName | kDeclFunctionExport,
0, 0, // signature index
kNameOffset, 0, 0, 0, // name offset
kBodySize, 0, // body size
// -- body
kExprI8Const, // --
kReturnValue, // --
kDeclEnd,
'm', 'a', 'i', 'n', 0 // name
);
var module = _WASMEXP_.instantiateModule(data);
// Check the module exists. // Check the module exists.
assertFalse(module === undefined); assertFalse(module === undefined);
...@@ -54,9 +41,10 @@ for (var i = 0; i < 4; i++) { ...@@ -54,9 +41,10 @@ for (var i = 0; i < 4; i++) {
assertEquals(65536, module.memory.byteLength); assertEquals(65536, module.memory.byteLength);
// Check the properties of the main function. // Check the properties of the main function.
assertFalse(module.main === undefined); var main = module.exports.main;
assertFalse(module.main === null); assertFalse(main === undefined);
assertFalse(module.main === 0); assertFalse(main === null);
assertEquals("function", typeof module.main); assertFalse(main === 0);
assertEquals("function", typeof main);
assertEquals(kReturnValue, module.main()); assertEquals(kReturnValue, main());
...@@ -5,27 +5,16 @@ ...@@ -5,27 +5,16 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
var kReturnValue = 97; (function BasicTest() {
var kReturnValue = 107;
var builder = new WasmModuleBuilder();
var kBodySize = 2; builder.addFunction("main", [kAstI32])
var kNameOffset = kHeaderSize + 15 + kBodySize + 1; .addBody([kExprI8Const, kReturnValue])
.exportFunc();
var data = bytesWithHeader( var main = builder.instantiate().exports.main;
// -- signatures assertEquals(kReturnValue, main());
kDeclSignatures, 1, })();
0, kAstI32, // signature: void -> int
// -- main function
kDeclFunctions, 1,
kDeclFunctionName | kDeclFunctionExport,
0, 0, // signature index
kNameOffset, 0, 0, 0, // name offset
kBodySize, 0, // body size
// -- body
kExprI8Const, // --
kReturnValue, // --
kDeclEnd,
'm', 'a', 'i', 'n', 0 // name
);
assertEquals(kReturnValue, _WASMEXP_.instantiateModule(data).main());
...@@ -5,52 +5,36 @@ ...@@ -5,52 +5,36 @@
// Flags: --expose-wasm --expose-gc --stress-compaction // Flags: --expose-wasm --expose-gc --stress-compaction
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
var kMemSize = 65536; var kMemSize = 65536;
function genModule(memory) { function genModule(memory) {
var kBodySize = 27; var builder = new WasmModuleBuilder();
var kNameMainOffset = kHeaderSize + 28 + kBodySize + 1;
builder.addMemory(1, 1, true);
var data = bytesWithHeader( builder.addFunction("main", [kAstI32, kAstI32])
kDeclMemory, .addBody([
1, 1, 1, // memory kExprBlock,2,
// -- signatures kExprLoop,1,
kDeclSignatures, 1, kExprIf,
1, kAstI32, kAstI32, // int->int kExprGetLocal,0,
// -- main function kExprBr, 0,
kDeclFunctions, 1, kExprIfElse,
kDeclFunctionLocals | kDeclFunctionName | kDeclFunctionExport, kExprI32LoadMem,0,kExprGetLocal,0,
0, 0, kExprBr,2, kExprI8Const, 255,
kNameMainOffset, 0, 0, 0, // name offset kExprSetLocal,0,
1, 0, // local int32 count kExprI32Sub,kExprGetLocal,0,kExprI8Const,4,
0, 0, // local int64 count kExprI8Const,0])
0, 0, // local float32 count .exportFunc();
0, 0, // local float64 count
kBodySize, 0, // code size return builder.instantiate(null, memory);
// main body: while(i) { if(mem[i]) return -1; i -= 4; } return 0;
kExprBlock,2,
kExprLoop,1,
kExprIf,
kExprGetLocal,0,
kExprBr, 0,
kExprIfElse,
kExprI32LoadMem,0,kExprGetLocal,0,
kExprBr,2, kExprI8Const, 255,
kExprSetLocal,0,
kExprI32Sub,kExprGetLocal,0,kExprI8Const,4,
kExprI8Const,0,
// names
kDeclEnd,
'm', 'a', 'i', 'n', 0 // --
);
return _WASMEXP_.instantiateModule(data, null, memory);
} }
function testPokeMemory() { function testPokeMemory() {
var module = genModule(null); var module = genModule(null);
var buffer = module.memory; var buffer = module.memory;
var main = module.exports.main;
assertEquals(kMemSize, buffer.byteLength); assertEquals(kMemSize, buffer.byteLength);
var array = new Int8Array(buffer); var array = new Int8Array(buffer);
...@@ -61,21 +45,21 @@ function testPokeMemory() { ...@@ -61,21 +45,21 @@ function testPokeMemory() {
} }
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
assertEquals(0, module.main(kMemSize - 4)); assertEquals(0, main(kMemSize - 4));
array[kMemSize/2 + i] = 1; array[kMemSize/2 + i] = 1;
assertEquals(0, module.main(kMemSize/2 - 4)); assertEquals(0, main(kMemSize/2 - 4));
assertEquals(-1, module.main(kMemSize - 4)); assertEquals(-1, main(kMemSize - 4));
array[kMemSize/2 + i] = 0; array[kMemSize/2 + i] = 0;
assertEquals(0, module.main(kMemSize - 4)); assertEquals(0, main(kMemSize - 4));
} }
} }
testPokeMemory(); testPokeMemory();
function testSurvivalAcrossGc() { function testSurvivalAcrossGc() {
var checker = genModule(null).main; var checker = genModule(null).exports.main;
for (var i = 0; i < 5; i++) { for (var i = 0; i < 5; i++) {
print("gc run ", i); print("gc run ", i);
assertEquals(0, checker(kMemSize - 4)); assertEquals(0, checker(kMemSize - 4));
...@@ -92,6 +76,7 @@ testSurvivalAcrossGc(); ...@@ -92,6 +76,7 @@ testSurvivalAcrossGc();
function testPokeOuterMemory() { function testPokeOuterMemory() {
var buffer = new ArrayBuffer(kMemSize); var buffer = new ArrayBuffer(kMemSize);
var module = genModule(buffer); var module = genModule(buffer);
var main = module.exports.main;
assertEquals(kMemSize, buffer.byteLength); assertEquals(kMemSize, buffer.byteLength);
var array = new Int8Array(buffer); var array = new Int8Array(buffer);
...@@ -102,14 +87,14 @@ function testPokeOuterMemory() { ...@@ -102,14 +87,14 @@ function testPokeOuterMemory() {
} }
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
assertEquals(0, module.main(kMemSize - 4)); assertEquals(0, main(kMemSize - 4));
array[kMemSize/2 + i] = 1; array[kMemSize/2 + i] = 1;
assertEquals(0, module.main(kMemSize/2 - 4)); assertEquals(0, main(kMemSize/2 - 4));
assertEquals(-1, module.main(kMemSize - 4)); assertEquals(-1, main(kMemSize - 4));
array[kMemSize/2 + i] = 0; array[kMemSize/2 + i] = 0;
assertEquals(0, module.main(kMemSize - 4)); assertEquals(0, main(kMemSize - 4));
} }
} }
...@@ -117,7 +102,7 @@ testPokeOuterMemory(); ...@@ -117,7 +102,7 @@ testPokeOuterMemory();
function testOuterMemorySurvivalAcrossGc() { function testOuterMemorySurvivalAcrossGc() {
var buffer = new ArrayBuffer(kMemSize); var buffer = new ArrayBuffer(kMemSize);
var checker = genModule(buffer).main; var checker = genModule(buffer).exports.main;
for (var i = 0; i < 5; i++) { for (var i = 0; i < 5; i++) {
print("gc run ", i); print("gc run ", i);
assertEquals(0, checker(kMemSize - 4)); assertEquals(0, checker(kMemSize - 4));
...@@ -132,39 +117,21 @@ testOuterMemorySurvivalAcrossGc(); ...@@ -132,39 +117,21 @@ testOuterMemorySurvivalAcrossGc();
function testOOBThrows() { function testOOBThrows() {
var kBodySize = 8; var builder = new WasmModuleBuilder();
var kNameMainOffset = kHeaderSize + 29 + kBodySize + 1;
builder.addMemory(1, 1, true);
var data = bytesWithHeader( builder.addFunction("geti", [kAstI32, kAstI32, kAstI32])
kDeclMemory, .addBody([
1, 1, 1, // memory = 64KB kExprI32StoreMem, 0, kExprGetLocal, 0, kExprI32LoadMem, 0, kExprGetLocal, 1
// -- signatures ])
kDeclSignatures, 1, .exportFunc();
2, kAstI32, kAstI32, kAstI32, // int->int
// -- main function var module = builder.instantiate();
kDeclFunctions, 1,
kDeclFunctionLocals | kDeclFunctionName | kDeclFunctionExport,
0, 0,
kNameMainOffset, 0, 0, 0, // name offset
1, 0, // local int32 count
0, 0, // local int64 count
0, 0, // local float32 count
0, 0, // local float64 count
kBodySize, 0, // code size
// geti: return mem[a] = mem[b]
kExprI32StoreMem, 0, kExprGetLocal, 0, kExprI32LoadMem, 0, kExprGetLocal, 1,
// names
kDeclEnd,
'g','e','t','i', 0 // --
);
var memory = null;
var module = _WASMEXP_.instantiateModule(data, null, memory);
var offset; var offset;
function read() { return module.geti(0, offset); } function read() { return module.exports.geti(0, offset); }
function write() { return module.geti(offset, 0); } function write() { return module.exports.geti(offset, 0); }
for (offset = 0; offset < 65533; offset++) { for (offset = 0; offset < 65533; offset++) {
assertEquals(0, read()); assertEquals(0, read());
......
...@@ -5,54 +5,39 @@ ...@@ -5,54 +5,39 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function runSelect2(module, which, a, b) { function runSelect2(select, which, a, b) {
assertEquals(which == 0 ? a : b, module.select(a, b)); assertEquals(which == 0 ? a : b, select(a, b));
} }
function testSelect2(type) { function testSelect2(type) {
var kBodySize = 2;
var kNameOffset = kHeaderSize + 21 + kBodySize + 1;
for (var which = 0; which < 2; which++) { for (var which = 0; which < 2; which++) {
print("type = " + type + ", which = " + which); print("type = " + type + ", which = " + which);
var data = bytesWithHeader( var builder = new WasmModuleBuilder();
// -- memory
kDeclMemory, builder.addFunction("select", [type, type, type])
1, 1, 1, // memory .addBody([kExprGetLocal, which])
// -- signatures .exportFunc()
kDeclSignatures, 1,
2, type, type, type, // signature: (t,t)->t var select = builder.instantiate().exports.select;
// -- select
kDeclFunctions, 1, runSelect2(select, which, 99, 97);
kDeclFunctionName | kDeclFunctionExport, runSelect2(select, which, -99, -97);
0, 0,
kNameOffset, 0, 0, 0, // name offset
kBodySize, 0, // body size
kExprGetLocal, which, // --
kDeclEnd,
's','e','l','e','c','t',0 // name
);
var module = _WASMEXP_.instantiateModule(data);
assertEquals("function", typeof module.select);
runSelect2(module, which, 99, 97);
runSelect2(module, which, -99, -97);
if (type != kAstF32) { if (type != kAstF32) {
runSelect2(module, which, 0x80000000 | 0, 0x7fffffff | 0); runSelect2(select, which, 0x80000000 | 0, 0x7fffffff | 0);
runSelect2(module, which, 0x80000001 | 0, 0x7ffffffe | 0); runSelect2(select, which, 0x80000001 | 0, 0x7ffffffe | 0);
runSelect2(module, which, 0xffffffff | 0, 0xfffffffe | 0); runSelect2(select, which, 0xffffffff | 0, 0xfffffffe | 0);
runSelect2(module, which, -2147483647, 2147483646); runSelect2(select, which, -2147483647, 2147483646);
runSelect2(module, which, -2147483646, 2147483645); runSelect2(select, which, -2147483646, 2147483645);
runSelect2(module, which, -2147483648, 2147483647); runSelect2(select, which, -2147483648, 2147483647);
} }
if (type != kAstI32 && type != kAstI64) { if (type != kAstI32 && type != kAstI64) {
runSelect2(module, which, -1.25, 5.25); runSelect2(select, which, -1.25, 5.25);
runSelect2(module, which, Infinity, -Infinity); runSelect2(select, which, Infinity, -Infinity);
} }
} }
} }
...@@ -63,20 +48,20 @@ testSelect2(kAstF32); ...@@ -63,20 +48,20 @@ testSelect2(kAstF32);
testSelect2(kAstF64); testSelect2(kAstF64);
function runSelect10(module, which, a, b) { function runSelect10(select, which, a, b) {
var x = -1; var x = -1;
var result = [ var result = [
module.select(a, b, x, x, x, x, x, x, x, x), select(a, b, x, x, x, x, x, x, x, x),
module.select(x, a, b, x, x, x, x, x, x, x), select(x, a, b, x, x, x, x, x, x, x),
module.select(x, x, a, b, x, x, x, x, x, x), select(x, x, a, b, x, x, x, x, x, x),
module.select(x, x, x, a, b, x, x, x, x, x), select(x, x, x, a, b, x, x, x, x, x),
module.select(x, x, x, x, a, b, x, x, x, x), select(x, x, x, x, a, b, x, x, x, x),
module.select(x, x, x, x, x, a, b, x, x, x), select(x, x, x, x, x, a, b, x, x, x),
module.select(x, x, x, x, x, x, a, b, x, x), select(x, x, x, x, x, x, a, b, x, x),
module.select(x, x, x, x, x, x, x, a, b, x), select(x, x, x, x, x, x, x, a, b, x),
module.select(x, x, x, x, x, x, x, x, a, b), select(x, x, x, x, x, x, x, x, a, b),
module.select(x, x, x, x, x, x, x, x, x, a) select(x, x, x, x, x, x, x, x, x, a)
]; ];
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
...@@ -86,49 +71,36 @@ function runSelect10(module, which, a, b) { ...@@ -86,49 +71,36 @@ function runSelect10(module, which, a, b) {
} }
} }
function testSelect10(type) { function testSelect10(t) {
var kBodySize = 2; var kBodySize = 2;
var kNameOffset = kHeaderSize + 29 + kBodySize + 1; var kNameOffset = kHeaderSize + 29 + kBodySize + 1;
for (var which = 0; which < 10; which++) { for (var which = 0; which < 10; which++) {
print("type = " + type + ", which = " + which); print("type = " + t + ", which = " + which);
var t = type; var builder = new WasmModuleBuilder();
var data = bytesWithHeader( builder.addFunction("select", [t,t,t,t,t,t,t,t,t,t,t])
kDeclMemory, .addBody([kExprGetLocal, which])
1, 1, 1, // memory .exportFunc();
// signatures
kDeclSignatures, 1, var select = builder.instantiate().exports.select;
10, t,t,t,t,t,t,t,t,t,t,t, // (tx10)->t
// main function assertEquals("function", typeof select);
kDeclFunctions, 1, runSelect10(select, which, 99, 97);
kDeclFunctionName | kDeclFunctionExport, runSelect10(select, which, -99, -97);
0, 0,
kNameOffset, 0, 0, 0, // name offset if (t != kAstF32) {
kBodySize, 0, // body size runSelect10(select, which, 0x80000000 | 0, 0x7fffffff | 0);
kExprGetLocal, which, // -- runSelect10(select, which, 0x80000001 | 0, 0x7ffffffe | 0);
kDeclEnd, runSelect10(select, which, 0xffffffff | 0, 0xfffffffe | 0);
's','e','l','e','c','t',0 // name runSelect10(select, which, -2147483647, 2147483646);
); runSelect10(select, which, -2147483646, 2147483645);
runSelect10(select, which, -2147483648, 2147483647);
var module = _WASMEXP_.instantiateModule(data);
assertEquals("function", typeof module.select);
runSelect10(module, which, 99, 97);
runSelect10(module, which, -99, -97);
if (type != kAstF32) {
runSelect10(module, which, 0x80000000 | 0, 0x7fffffff | 0);
runSelect10(module, which, 0x80000001 | 0, 0x7ffffffe | 0);
runSelect10(module, which, 0xffffffff | 0, 0xfffffffe | 0);
runSelect10(module, which, -2147483647, 2147483646);
runSelect10(module, which, -2147483646, 2147483645);
runSelect10(module, which, -2147483648, 2147483647);
} }
if (type != kAstI32 && type != kAstI64) { if (t != kAstI32 && t != kAstI64) {
runSelect10(module, which, -1.25, 5.25); runSelect10(select, which, -1.25, 5.25);
runSelect10(module, which, Infinity, -Infinity); runSelect10(select, which, Infinity, -Infinity);
} }
} }
} }
......
...@@ -5,44 +5,14 @@ ...@@ -5,44 +5,14 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function testStack(func, check) { var expected = "Error\n" +
var kBodySize = 2; // The line numbers below will change as this test gains / loses lines..
var kNameFunOffset = kHeaderSize + 22 + kBodySize + 1; " at STACK (stack.js:24:11)\n" + // --
var kNameMainOffset = kNameFunOffset + 4; " at <WASM> (<anonymous>)\n" + // TODO(jfb): wasm stack here.
" at testStack (stack.js:38:18)\n" + // --
var ffi = new Object(); " at stack.js:40:3"; // --
ffi.fun = func;
var data = bytesWithHeader(
// signatures
kDeclSignatures, 1, // --
0, kAstStmt, // () -> void
// -- foreign function
kDeclFunctions, 2, // --
kDeclFunctionName | kDeclFunctionImport, // --
0, 0, // --
kNameFunOffset, 0, 0, 0, // name offset
// -- main function
kDeclFunctionName | kDeclFunctionExport, // --
0, 0, // --
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0,
// main body
kExprCallFunction, 0, // --
// names
kDeclEnd, // --
'f', 'u', 'n', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
module.main();
check();
}
// The stack trace contains file path, only keep "stack.js". // The stack trace contains file path, only keep "stack.js".
function stripPath(s) { function stripPath(s) {
...@@ -55,16 +25,16 @@ function STACK() { ...@@ -55,16 +25,16 @@ function STACK() {
stack = e.stack; stack = e.stack;
} }
function check_STACK() { (function testStack() {
assertEquals(expected, stripPath(stack)); var builder = new WasmModuleBuilder();
}
var expected = "Error\n" + builder.addImport("func", [kAstStmt]);
// The line numbers below will change as this test gains / loses lines..
" at STACK (stack.js:54:11)\n" + // -- builder.addFunction(undefined, [kAstStmt])
" at <WASM> (<anonymous>)\n" + // -- .addBody([kExprCallImport, 0])
" at testStack (stack.js:43:10)\n" + .exportAs("main");
// TODO(jfb) Add WebAssembly stack here.
" at stack.js:70:1";
testStack(STACK, check_STACK); var module = builder.instantiate({func: STACK});
module.exports.main();
assertEquals(expected, stripPath(stack));
})();
...@@ -5,44 +5,21 @@ ...@@ -5,44 +5,21 @@
// Flags: --expose-wasm --expose-gc --allow-natives-syntax // Flags: --expose-wasm --expose-gc --allow-natives-syntax
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function makeFFI(func) { function makeFFI(func) {
var kBodySize = 6; var builder = new WasmModuleBuilder();
var kNameFunOffset = kHeaderSize + 24 + kBodySize + 1;
var kNameMainOffset = kNameFunOffset + 4; var sig_index = builder.addSignature([kAstI32, kAstF64, kAstF64]);
builder.addImport("func", sig_index);
var ffi = new Object(); builder.addFunction("main", sig_index)
ffi.fun = func; .addBody([
kExprCallImport, 0, // --
var data = bytesWithHeader( kExprGetLocal, 0, // --
// signatures kExprGetLocal, 1]) // --
kDeclSignatures, 1, .exportFunc()
2, kAstI32, kAstF64, kAstF64, // (f64,f64) -> int
// -- foreign function return builder.instantiate({func: func}).exports.main;
kDeclFunctions, 2,
kDeclFunctionName | kDeclFunctionImport,
0, 0,
kNameFunOffset, 0, 0, 0, // name offset
// -- main function
kDeclFunctionName | kDeclFunctionExport,
0, 0,
kNameMainOffset, 0, 0, 0, // name offset
kBodySize, 0,
// main body
kExprCallFunction, 0, // --
kExprGetLocal, 0, // --
kExprGetLocal, 1, // --
// names
kDeclEnd,
'f', 'u', 'n', 0, // --
'm', 'a', 'i', 'n', 0 // --
);
var module = _WASMEXP_.instantiateModule(data, ffi);
assertEquals("function", typeof module.main);
return module.main;
} }
......
...@@ -5,38 +5,17 @@ ...@@ -5,38 +5,17 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
function instantiate(sig, body) { function instantiate(sig, body) {
var module = new Array(); var builder = new WasmModuleBuilder();
module = module.concat([
// -- header var func = builder.addFunction("", sig)
kWasmH0, kWasmH1, kWasmH2, kWasmH3, .addBody(body);
kWasmV0, kWasmV1, kWasmV2, kWasmV3
]); builder.addStart(func.index);
module = module.concat([
// -- signatures return builder.instantiate();
kDeclSignatures, 1,
]);
module = module.concat(sig);
module = module.concat([
// -- functions
kDeclFunctions, 1,
0, // decl flags
0, 0, // signature
body.length, 0, // body size
]);
module = module.concat(body);
module = module.concat([
// -- declare start function
kDeclStartFunction,
0
]);
var data = bytes.apply(this, module);
print(module);
print(data instanceof ArrayBuffer);
print(data.byteLength);
return _WASMEXP_.instantiateModule(data);
} }
function assertFails(sig, body) { function assertFails(sig, body) {
...@@ -58,120 +37,75 @@ function assertVerifies(sig, body) { ...@@ -58,120 +37,75 @@ function assertVerifies(sig, body) {
return module; return module;
} }
assertVerifies([0, kAstStmt], [kExprNop]); assertVerifies([kAstStmt], [kExprNop]);
assertVerifies([0, kAstI32], [kExprI8Const, 0]); assertVerifies([kAstI32], [kExprI8Const, 0]);
// Arguments aren't allow to start functions. // Arguments aren't allow to start functions.
assertFails([1, kAstI32, kAstI32], [kExprGetLocal, 0]); assertFails([kAstI32, kAstI32], [kExprGetLocal, 0]);
assertFails([2, kAstI32, kAstI32, kAstF32], [kExprGetLocal, 0]); assertFails([kAstI32, kAstI32, kAstF32], [kExprGetLocal, 0]);
assertFails([3, kAstI32, kAstI32, kAstF32, kAstF64], [kExprGetLocal, 0]); assertFails([kAstI32, kAstI32, kAstF32, kAstF64], [kExprGetLocal, 0]);
(function testInvalidIndex() { (function testInvalidIndex() {
var kBodySize = 1; print("testInvalidIndex");
var data = bytesWithHeader( var builder = new WasmModuleBuilder();
// -- signatures
kDeclSignatures, 1, var func = builder.addFunction("", [kAstStmt])
0, kAstStmt, .addBody([kExprNop]);
// -- functions
kDeclFunctions, 1, builder.addStart(func.index + 1);
0, // decl flags
0, 0, // signature assertThrows(builder.instantiate);
kBodySize, 0, // body size
kExprNop, // body
// -- declare start function
kDeclStartFunction,
1
);
assertThrows(function() { _WASMEXP_.instantiateModule(data); });
})(); })();
(function testTwoStartFuncs() { (function testTwoStartFuncs() {
var kBodySize = 1; print("testTwoStartFuncs");
var data = bytesWithHeader( var builder = new WasmModuleBuilder();
// -- signatures
kDeclSignatures, 1, var func = builder.addFunction("", [kAstStmt])
0, kAstStmt, .addBody([kExprNop]);
// -- functions
kDeclFunctions, 1, builder.addExplicitSection([kDeclStartFunction, 0]);
0, // decl flags builder.addExplicitSection([kDeclStartFunction, 0]);
0, 0, // signature
kBodySize, 0, // body size assertThrows(builder.instantiate);
kExprNop, // body
// -- declare start function
kDeclStartFunction,
0,
// -- declare start function
kDeclStartFunction,
0
);
assertThrows(function() { _WASMEXP_.instantiateModule(data); });
})(); })();
(function testRun() { (function testRun() {
var kBodySize = 6; print("testRun");
var builder = new WasmModuleBuilder();
var data = bytesWithHeader(
kDeclMemory, builder.addMemory(12, 12, true);
12, 12, 1, // memory
// -- signatures var func = builder.addFunction("", [kAstStmt])
kDeclSignatures, 1, .addBody([kExprI32StoreMem, 0, kExprI8Const, 0, kExprI8Const, 77]);
0, kAstStmt,
// -- start function builder.addStart(func.index);
kDeclFunctions, 1,
0, // decl flags var module = builder.instantiate();
0, 0, // signature
kBodySize, 0, // code size
// -- start body
kExprI32StoreMem, 0, kExprI8Const, 0, kExprI8Const, 77,
// -- declare start function
kDeclStartFunction,
0
);
var module = _WASMEXP_.instantiateModule(data);
var memory = module.memory; var memory = module.memory;
var view = new Int8Array(memory); var view = new Int8Array(memory);
assertEquals(77, view[0]); assertEquals(77, view[0]);
})(); })();
(function testStartFFI() { (function testStartFFI() {
var kBodySize = 2; print("testStartFFI");
var kNameOffset = kHeaderSize + 4 + 9 + 7 + 3;
var data = bytesWithHeader(
// -- signatures
kDeclSignatures, 1,
0, kAstStmt,
// -- imported function
kDeclFunctions, 2,
kDeclFunctionImport | kDeclFunctionName, // decl flags
0, 0, // signature
kNameOffset, 0, 0, 0,
// -- start function
0, // decl flags
0, 0, // signature
kBodySize, 0, // code size
// -- start body
kExprCallFunction, 0,
// -- declare start function
kDeclStartFunction,
1,
kDeclEnd,
'f', 'o', 'o', 0
);
var ranned = false; var ranned = false;
var ffi = new Object(); var ffi = { foo : function() {
ffi.foo = function() {
print("we ranned at stert!"); print("we ranned at stert!");
ranned = true; ranned = true;
} }};
var module = _WASMEXP_.instantiateModule(data, ffi);
var memory = module.memory; var builder = new WasmModuleBuilder();
var view = new Int8Array(memory); var sig_index = builder.addSignature([kAstStmt]);
builder.addImport("foo", sig_index);
var func = builder.addFunction("", sig_index)
.addBody([kExprCallImport, 0]);
builder.addStart(func.index);
var module = builder.instantiate(ffi);
assertTrue(ranned); assertTrue(ranned);
})(); })();
...@@ -5,42 +5,20 @@ ...@@ -5,42 +5,20 @@
// Flags: --expose-wasm // Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");
var module = (function () { var main = (function () {
var kFuncWithBody = 9; var builder = new WasmModuleBuilder();
var kFuncImported = 7; builder.addFunction("main", [kAstStmt])
var kBodySize1 = 1; .addBody([kExprUnreachable])
var kMainOffset = kHeaderSize + 6 + kFuncWithBody + kBodySize1 + 1; .exportAs("main");
var ffi = new Object(); return builder.instantiate().exports.main;
ffi.add = (function(a, b) { return a + b | 0; });
return _WASMEXP_.instantiateModule(bytesWithHeader(
// -- signatures
kDeclSignatures, 1,
0, kAstStmt, // void -> void
// -- function #0 (unreachable)
kDeclFunctions, 1,
kDeclFunctionName | kDeclFunctionExport,
0, 0, // signature offset
kMainOffset, 0, 0, 0, // name offset
kBodySize1, 0, // body size
kExprUnreachable,
kDeclEnd,
'm', 'a', 'i', 'n', 0 // name
), ffi);
})(); })();
// Check the module exists.
assertFalse(module === undefined);
assertFalse(module === null);
assertFalse(module === 0);
assertEquals("object", typeof module);
assertEquals("function", typeof module.main);
var exception = ""; var exception = "";
try { try {
assertEquals(0, module.main()); assertEquals(0, main());
} catch(e) { } catch(e) {
print("correctly caught: " + e); print("correctly caught: " + e);
exception = e; exception = e;
......
...@@ -27,6 +27,7 @@ var kWasmV2 = 0; ...@@ -27,6 +27,7 @@ var kWasmV2 = 0;
var kWasmV3 = 0; var kWasmV3 = 0;
var kHeaderSize = 8; var kHeaderSize = 8;
var kPageSize = 65536;
function bytesWithHeader() { function bytesWithHeader() {
var buffer = new ArrayBuffer(kHeaderSize + arguments.length); var buffer = new ArrayBuffer(kHeaderSize + arguments.length);
......
...@@ -23,6 +23,11 @@ WasmFunctionBuilder.prototype.exportAs = function(name) { ...@@ -23,6 +23,11 @@ WasmFunctionBuilder.prototype.exportAs = function(name) {
return this; return this;
} }
WasmFunctionBuilder.prototype.exportFunc = function() {
this.exports.push(this.name);
return this;
}
WasmFunctionBuilder.prototype.addBody = function(body) { WasmFunctionBuilder.prototype.addBody = function(body) {
this.body = body; this.body = body;
return this; return this;
...@@ -40,14 +45,24 @@ function WasmModuleBuilder() { ...@@ -40,14 +45,24 @@ function WasmModuleBuilder() {
this.exports = []; this.exports = [];
this.function_table = []; this.function_table = [];
this.data_segments = []; this.data_segments = [];
this.explicit = [];
return this; return this;
} }
WasmModuleBuilder.prototype.addStart = function(start_index) {
this.start_index = start_index;
}
WasmModuleBuilder.prototype.addMemory = function(min, max, exp) { WasmModuleBuilder.prototype.addMemory = function(min, max, exp) {
this.memory = {min: min, max: max, exp: exp}; this.memory = {min: min, max: max, exp: exp};
return this; return this;
} }
WasmModuleBuilder.prototype.addExplicitSection = function(bytes) {
this.explicit.push(bytes);
return this;
}
// Add a signature; format is [rettype, param0, param1, ...] // Add a signature; format is [rettype, param0, param1, ...]
WasmModuleBuilder.prototype.addSignature = function(sig) { WasmModuleBuilder.prototype.addSignature = function(sig) {
// TODO: canonicalize signatures? // TODO: canonicalize signatures?
...@@ -199,6 +214,13 @@ WasmModuleBuilder.prototype.toArray = function(debug) { ...@@ -199,6 +214,13 @@ WasmModuleBuilder.prototype.toArray = function(debug) {
} }
} }
// Add start function section.
if (this.start_index != undefined) {
if (debug) print("emitting start function @ " + bytes.length);
emit_u8(bytes, kDeclStartFunction);
emit_varint(bytes, this.start_index);
}
if (this.function_table.length > 0) { if (this.function_table.length > 0) {
if (debug) print("emitting function table @ " + bytes.length); if (debug) print("emitting function table @ " + bytes.length);
emit_u8(bytes, kDeclFunctionTable); emit_u8(bytes, kDeclFunctionTable);
...@@ -232,6 +254,14 @@ WasmModuleBuilder.prototype.toArray = function(debug) { ...@@ -232,6 +254,14 @@ WasmModuleBuilder.prototype.toArray = function(debug) {
} }
} }
// Emit any explicitly added sections
for (exp of this.explicit) {
if (debug) print("emitting explicit @ " + bytes.length);
for (var i = 0; i < exp.length; i++) {
emit_u8(bytes, exp[i]);
}
}
// End the module. // End the module.
if (debug) print("emitting end @ " + bytes.length); if (debug) print("emitting end @ " + bytes.length);
emit_u8(bytes, kDeclEnd); emit_u8(bytes, kDeclEnd);
...@@ -305,7 +335,11 @@ WasmModuleBuilder.prototype.toBuffer = function(debug) { ...@@ -305,7 +335,11 @@ WasmModuleBuilder.prototype.toBuffer = function(debug) {
return buffer; return buffer;
} }
WasmModuleBuilder.prototype.instantiate = function(ffi) { WasmModuleBuilder.prototype.instantiate = function(ffi, memory) {
var buffer = this.toBuffer(); var buffer = this.toBuffer();
return _WASMEXP_.instantiateModule(buffer, ffi); if (memory != undefined) {
return _WASMEXP_.instantiateModule(buffer, ffi, memory);
} else {
return _WASMEXP_.instantiateModule(buffer, ffi);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment