blob: e17c8f1785b408eb5921b4596d046b6e4cf2892b [file] [log] [blame]
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --expose-wasm
load("test/mjsunit/wasm/wasm-module-builder.js");
function instantiate(sig, body) {
var builder = new WasmModuleBuilder();
var func = builder.addFunction("", sig)
.addBody(body);
builder.addStart(func.index);
return builder.instantiate();
}
function assertVerifies(sig, body) {
var module = instantiate(sig, body);
assertFalse(module === undefined);
assertFalse(module === null);
assertFalse(module === 0);
assertEquals("object", typeof module);
return module;
}
assertVerifies(kSig_v_v, [kExprNop]);
// Arguments aren't allowed to start functions.
assertThrows(() => {instantiate(kSig_i_i, [kExprGetLocal, 0]);});
assertThrows(() => {instantiate(kSig_i_ii, [kExprGetLocal, 0]);});
assertThrows(() => {instantiate(kSig_i_dd, [kExprGetLocal, 0]);});
assertThrows(() => {instantiate(kSig_i_v, [kExprI32Const, 0]);});
(function testInvalidIndex() {
print("testInvalidIndex");
var builder = new WasmModuleBuilder();
var func = builder.addFunction("", kSig_v_v)
.addBody([kExprNop]);
builder.addStart(func.index + 1);
assertThrows(
() => builder.instantiate(), WebAssembly.CompileError,
'WebAssembly.Module(): ' +
'start function index 1 out of bounds (1 entry) @+20');
})();
(function testTwoStartFuncs() {
print("testTwoStartFuncs");
var builder = new WasmModuleBuilder();
var func = builder.addFunction("", kSig_v_v)
.addBody([kExprNop]);
builder.addExplicitSection([kStartSectionCode, 0]);
builder.addExplicitSection([kStartSectionCode, 0]);
assertThrows(
() => builder.instantiate(), WebAssembly.CompileError,
'WebAssembly.Module(): unexpected section <Start> @+27');
})();
(function testRun1() {
print("testRun1");
var builder = new WasmModuleBuilder();
builder.addMemory(12, 12, true);
var func = builder.addFunction("", kSig_v_v)
.addBody([kExprI32Const, 0, kExprI32Const, 55, kExprI32StoreMem, 0, 0]);
builder.addStart(func.index);
var module = builder.instantiate();
var memory = module.exports.memory.buffer;
var view = new Int8Array(memory);
assertEquals(55, view[0]);
})();
(function testRun2() {
print("testRun2");
var builder = new WasmModuleBuilder();
builder.addMemory(12, 12, true);
var func = builder.addFunction("", kSig_v_v)
.addBody([kExprI32Const, 0, kExprI32Const, 22, kExprI32Const, 55, kExprI32Add, kExprI32StoreMem, 0, 0]);
builder.addStart(func.index);
var module = builder.instantiate();
var memory = module.exports.memory.buffer;
var view = new Int8Array(memory);
assertEquals(77, view[0]);
})();
(function testStartFFI() {
print("testStartFFI");
var ranned = false;
var ffi = {gak: {foo : function() {
print("we ranned at stert!");
ranned = true;
}}};
var builder = new WasmModuleBuilder();
var sig_index = builder.addType(kSig_v_v);
builder.addImport("gak", "foo", sig_index);
var func = builder.addFunction("", sig_index)
.addBody([kExprCallFunction, 0]);
builder.addStart(func.index);
var module = builder.instantiate(ffi);
assertTrue(ranned);
})();
(function testStartFunctionThrowsExplicitly() {
print('testStartFunctionThrowsExplicitly');
let error = new Error('my explicit error');
var ffi = {
foo: {
throw_fn: function() {
throw error;
}
}
};
let builder = new WasmModuleBuilder();
builder.addImport('foo', 'throw_fn', kSig_v_v);
let func = builder.addFunction('', kSig_v_v).addBody([kExprCallFunction, 0]);
builder.addStart(func.index);
assertThrowsEquals(() => builder.instantiate(ffi), error);
assertPromiseResult(builder.asyncInstantiate(ffi), assertUnreachable,
e => assertSame(e, error));
assertPromiseResult(WebAssembly.instantiate(builder.toModule(), ffi),
assertUnreachable, e => assertSame(e, error));
})();
(function testStartFunctionThrowsImplicitly() {
print("testStartFunctionThrowsImplicitly");
let builder = new WasmModuleBuilder();
let func = builder.addFunction('', kSig_v_v).addBody([kExprUnreachable]);
builder.addStart(func.index);
assertThrows(
() => builder.instantiate(), WebAssembly.RuntimeError, /unreachable/);
assertThrowsAsync(builder.asyncInstantiate(), WebAssembly.RuntimeError);
assertThrowsAsync(
WebAssembly.instantiate(builder.toModule()), WebAssembly.RuntimeError);
})();