e0dc3d2962
We assumed that if the ErrorThrower is empty after instantiation, then instantiation succeeded and an instance exists which we can return. However, if the start function throws, no instance exists, which caused a crash. With this CL we handle execeptions thrown by the start function correctly. R=clemensh@chromium.org Bug: chromium:848966 Change-Id: I51dc94e6bc563aa4a4b88c44a14e831af913fbd8 Reviewed-on: https://chromium-review.googlesource.com/1092234 Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Commit-Queue: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#53687}
162 lines
4.6 KiB
JavaScript
162 lines
4.6 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");
|
|
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(): Wasm decoding failed: ' +
|
|
'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(): Wasm decoding failed: ' +
|
|
'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/);
|
|
assertPromiseResult(builder.asyncInstantiate(), assertUnreachable,
|
|
e => assertInstanceof(e, WebAssembly.RuntimeError));
|
|
assertPromiseResult(WebAssembly.instantiate(builder.toModule()),
|
|
assertUnreachable,
|
|
e => assertInstanceof(e, WebAssembly.RuntimeError));
|
|
})();
|