8d6da6d5c9
Element segments and tables in tests used an ad-hoc mechanism to describe the different types of initializer expressions, e.g. an number which could denote either the value of a constant or the index of a global. This CL tidies up and generalizes the test infrastructure by directly using WasmInitExpr in those cases. Additional changes: - Introduce WasmElemSegment class. - Remove obsolete --experimental-wasm-bulk-memory flag from tests. - Rename WasmInitExpr.type -> kind. - Remove dependency of wasm-module-builder from mjsunit.js (except in assertTraps). Change-Id: I716254a04ceea9ceb8ac6b848e12e1637f618f0d Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2857638 Commit-Queue: Manos Koukoutos <manoskouk@chromium.org> Reviewed-by: Clemens Backes <clemensb@chromium.org> Cr-Commit-Position: refs/heads/master@{#74368}
82 lines
2.9 KiB
JavaScript
82 lines
2.9 KiB
JavaScript
// Copyright 2019 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: --experimental-wasm-reftypes
|
|
|
|
load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
|
(function TestExternRefTableSetWithMultipleTypes() {
|
|
print(arguments.callee.name);
|
|
let table = new WebAssembly.Table({element: "externref", initial: 10});
|
|
|
|
// Table should be initialized with null.
|
|
assertEquals(null, table.get(1));
|
|
let obj = {'hello' : 'world'};
|
|
table.set(2, obj);
|
|
assertSame(obj, table.get(2));
|
|
table.set(3, 1234);
|
|
assertEquals(1234, table.get(3));
|
|
table.set(4, 123.5);
|
|
assertEquals(123.5, table.get(4));
|
|
table.set(5, undefined);
|
|
assertEquals(undefined, table.get(5));
|
|
// Overwrite entry 4, because null would otherwise be the default value.
|
|
table.set(4, null);
|
|
assertEquals(null, table.get(4));
|
|
table.set(7, print);
|
|
assertEquals(print, table.get(7));
|
|
|
|
assertThrows(() => table.set(12), RangeError);
|
|
})();
|
|
|
|
(function TestImportExternRefTable() {
|
|
print(arguments.callee.name);
|
|
|
|
const builder = new WasmModuleBuilder();
|
|
const table_index = builder.addImportedTable("imp", "table", 3, 10, kWasmExternRef);
|
|
builder.addFunction('get', kSig_r_v)
|
|
.addBody([kExprI32Const, 0, kExprTableGet, table_index]);
|
|
|
|
let table_ref = new WebAssembly.Table({element: "externref", initial: 3, maximum: 10});
|
|
builder.instantiate({imp:{table: table_ref}});
|
|
|
|
let table_func = new WebAssembly.Table({ element: "anyfunc", initial: 3, maximum: 10 });
|
|
assertThrows(() => builder.instantiate({ imp: { table: table_func } }),
|
|
WebAssembly.LinkError, /imported table does not match the expected type/);
|
|
})();
|
|
|
|
(function TestExternRefDropDeclarativeElementSegment() {
|
|
print(arguments.callee.name);
|
|
|
|
const builder = new WasmModuleBuilder();
|
|
builder.addDeclarativeElementSegment([WasmInitExpr.RefNull(kWasmFuncRef)],
|
|
kWasmFuncRef);
|
|
builder.addFunction('drop', kSig_v_v)
|
|
.addBody([kNumericPrefix, kExprElemDrop, 0])
|
|
.exportFunc();
|
|
const instance = builder.instantiate();
|
|
|
|
// Counts as double-drop because declarative segments are dropped on
|
|
// initialization and is therefore not expected to throw.
|
|
instance.exports.drop();
|
|
})();
|
|
|
|
(function TestExternRefTableInitFromDeclarativeElementSegment() {
|
|
print(arguments.callee.name);
|
|
|
|
const builder = new WasmModuleBuilder();
|
|
const table = builder.addTable(kWasmAnyFunc, 10);
|
|
builder.addDeclarativeElementSegment([WasmInitExpr.RefNull(kWasmFuncRef)],
|
|
kWasmFuncRef);
|
|
builder.addFunction('init', kSig_v_v)
|
|
.addBody([
|
|
kExprI32Const, 0, kExprI32Const, 0, kExprI32Const, 1, kNumericPrefix,
|
|
kExprTableInit, table.index, 0
|
|
])
|
|
.exportFunc();
|
|
const instance = builder.instantiate();
|
|
|
|
assertTraps(kTrapTableOutOfBounds, () => instance.exports.init());
|
|
})();
|