// 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 @+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); })();