| // 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, [kExprLocalGet, 0]);}); |
| assertThrows(() => {instantiate(kSig_i_ii, [kExprLocalGet, 0]);}); |
| assertThrows(() => {instantiate(kSig_i_dd, [kExprLocalGet, 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); |
| })(); |