5c5c6e38e2
Add a section identifier for declaring a start function as an index into the function table. (This could also be done as a decl flag on the function, but don't feel strongly here, since we probably want to redo this when adding an import/export section.) The start function must accept no parameters. Its return value is currently ignored. R=binji@chromium.org,bradnelson@chromium.org BUG=chromium:575167 LOG=Y Review URL: https://codereview.chromium.org/1692173002 Cr-Commit-Position: refs/heads/master@{#33978}
173 lines
4.2 KiB
JavaScript
173 lines
4.2 KiB
JavaScript
// 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);
|
|
})();
|