// 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-constants.js"); function instantiate(sig, body) { var module = new Array(); module = module.concat([ // -- signatures 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) { try { var module = instantiate(sig, body); print("expected failure, but passes"); assertFalse(true); } catch (expected) { print("ok: " + expected); } } 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([0, kAstStmt], [kExprNop]); assertVerifies([0, kAstI32], [kExprI8Const, 0]); // Arguments aren't allow to start functions. assertFails([1, kAstI32, kAstI32], [kExprGetLocal, 0]); assertFails([2, kAstI32, kAstI32, kAstF32], [kExprGetLocal, 0]); assertFails([3, kAstI32, kAstI32, kAstF32, kAstF64], [kExprGetLocal, 0]); (function testInvalidIndex() { var kBodySize = 1; var data = bytes( // -- signatures kDeclSignatures, 1, 0, kAstStmt, // -- functions kDeclFunctions, 1, 0, // decl flags 0, 0, // signature kBodySize, 0, // body size kExprNop, // body // -- declare start function kDeclStartFunction, 1 ); assertThrows(function() { _WASMEXP_.instantiateModule(data); }); })(); (function testTwoStartFuncs() { var kBodySize = 1; var data = bytes( // -- signatures kDeclSignatures, 1, 0, kAstStmt, // -- functions kDeclFunctions, 1, 0, // decl flags 0, 0, // signature kBodySize, 0, // body size kExprNop, // body // -- declare start function kDeclStartFunction, 0, // -- declare start function kDeclStartFunction, 0 ); assertThrows(function() { _WASMEXP_.instantiateModule(data); }); })(); (function testRun() { var kBodySize = 6; var data = bytes( kDeclMemory, 12, 12, 1, // memory // -- signatures kDeclSignatures, 1, 0, kAstStmt, // -- start function kDeclFunctions, 1, 0, // decl flags 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 view = new Int8Array(memory); assertEquals(77, view[0]); })(); (function testStartFFI() { var kBodySize = 2; var kNameOffset = 4 + 9 + 7 + 3; var data = bytes( // -- 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 ffi = new Object(); ffi.foo = function() { print("we ranned at stert!"); ranned = true; } var module = _WASMEXP_.instantiateModule(data, ffi); var memory = module.memory; var view = new Int8Array(memory); assertTrue(ranned); })();