d6aed4435f
In our internal code, we should only use pending exceptions. They will be converted to scheduled exceptions on the API boundary. Hence, the ErrorThrower just sets a pending exception; it should never have to think about scheduled exceptions. The new ScheduledErrorThrower inherits from ErrorThrower and reschedules any pending exceptions in its destructor (turning them into scheduled exceptions). In some situations, there might already be a scheduled exception, e.g. when calling other API methods (v8::Value::Get). In this case, the ErrorThrower should also not set another pending exception. For the reasons mentioned above, this can only be handled in the ScheduledErrorThrower, which is used the API methods. This fixes one DCHECK failure and one TODO about scheduled exceptions if no instance can be created, because the start function throws. R=mtrofin@chromium.org, mstarzinger@chromium.org BUG=v8:6232,chromium:736256 Change-Id: I4905be04c565df9495de18fb26adbb5c05d193d2 Reviewed-on: https://chromium-review.googlesource.com/548641 Commit-Queue: Clemens Hammacher <clemensh@chromium.org> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Reviewed-by: Mircea Trofin <mtrofin@chromium.org> Cr-Commit-Position: refs/heads/master@{#46314}
149 lines
4.1 KiB
JavaScript
149 lines
4.1 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');
|
|
function throw_fn() {
|
|
throw error;
|
|
}
|
|
let builder = new WasmModuleBuilder();
|
|
builder.addImport('foo', 'bar', kSig_v_v);
|
|
let func = builder.addFunction('', kSig_v_v).addBody([kExprCallFunction, 0]);
|
|
builder.addStart(func.index);
|
|
|
|
assertThrowsEquals(() => builder.instantiate(ffi), 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/);
|
|
})();
|