v8/test/mjsunit/wasm/gc-casts-from-any.js
Matthias Liedtke fd43005037 [wasm-gc] Add new ref.test null taking any reference
ref.test null is a variant of ref.test (commit
e4828a364e) which treats null as success
(returning 1).

Bug: v8:7748
Change-Id: Ib2ce7d5b4b73b3d1a995333d5a477c0c982de415
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3925975
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Matthias Liedtke <mliedtke@chromium.org>
Cr-Commit-Position: refs/heads/main@{#83490}
2022-09-29 15:26:45 +00:00

138 lines
6.0 KiB
JavaScript

// Copyright 2022 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-gc
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
(function TestRefTest() {
var builder = new WasmModuleBuilder();
let structSuper = builder.addStruct([makeField(kWasmI32, true)]);
let structSub = builder.addStruct([makeField(kWasmI32, true)], structSuper);
let array = builder.addArray(kWasmI32);
let fct =
builder.addFunction('createStructSuper',
makeSig([kWasmI32], [kWasmExternRef]))
.addBody([
kExprLocalGet, 0,
kGCPrefix, kExprStructNew, structSuper,
kGCPrefix, kExprExternExternalize,
]).exportFunc();
builder.addFunction('createStructSub', makeSig([kWasmI32], [kWasmExternRef]))
.addBody([
kExprLocalGet, 0,
kGCPrefix, kExprStructNew, structSub,
kGCPrefix, kExprExternExternalize,
]).exportFunc();
builder.addFunction('createArray', makeSig([kWasmI32], [kWasmExternRef]))
.addBody([
kExprLocalGet, 0,
kGCPrefix, kExprArrayNewFixed, array, 1,
kGCPrefix, kExprExternExternalize,
]).exportFunc();
builder.addFunction('createFuncRef', makeSig([], [kWasmFuncRef]))
.addBody([
kExprRefFunc, fct.index,
]).exportFunc();
[
["StructSuper", structSuper],
["StructSub", structSub],
["Array", array],
["I31", kI31RefCode],
["AnyArray", kArrayRefCode],
["Data", kDataRefCode],
["Eq", kEqRefCode],
// 'ref.test any' is semantically the same as '!ref.is_null' here.
["Any", kAnyRefCode],
].forEach(([typeName, typeCode]) => {
builder.addFunction(`refTest${typeName}`,
makeSig([kWasmExternRef], [kWasmI32, kWasmI32]))
.addBody([
kExprLocalGet, 0,
kGCPrefix, kExprExternInternalize,
kGCPrefix, kExprRefTest, typeCode,
kExprLocalGet, 0,
kGCPrefix, kExprExternInternalize,
kGCPrefix, kExprRefTestNull, typeCode,
]).exportFunc();
});
var instance = builder.instantiate();
let wasm = instance.exports;
// result: [ref.test, ref.test null]
assertEquals([0, 1], wasm.refTestStructSuper(null));
assertEquals([0, 0], wasm.refTestStructSuper(undefined));
assertEquals([1, 1], wasm.refTestStructSuper(wasm.createStructSuper()));
assertEquals([1, 1], wasm.refTestStructSuper(wasm.createStructSub()));
assertEquals([0, 0], wasm.refTestStructSuper(wasm.createArray()));
assertEquals([0, 0], wasm.refTestStructSuper(wasm.createFuncRef()));
assertEquals([0, 0], wasm.refTestStructSuper(1));
assertEquals([0, 0], wasm.refTestStructSuper({'JavaScript': 'Object'}));
assertEquals([0, 1], wasm.refTestStructSub(null));
assertEquals([0, 0], wasm.refTestStructSub(undefined));
assertEquals([0, 0], wasm.refTestStructSub(wasm.createStructSuper()));
assertEquals([1, 1], wasm.refTestStructSub(wasm.createStructSub()));
assertEquals([0, 0], wasm.refTestStructSub(wasm.createArray()));
assertEquals([0, 0], wasm.refTestStructSub(wasm.createFuncRef()));
assertEquals([0, 0], wasm.refTestStructSub(1));
assertEquals([0, 0], wasm.refTestStructSub({'JavaScript': 'Object'}));
assertEquals([0, 1], wasm.refTestArray(null));
assertEquals([0, 0], wasm.refTestArray(undefined));
assertEquals([0, 0], wasm.refTestArray(wasm.createStructSuper()));
assertEquals([0, 0], wasm.refTestArray(wasm.createStructSub()));
assertEquals([1, 1], wasm.refTestArray(wasm.createArray()));
assertEquals([0, 0], wasm.refTestArray(wasm.createFuncRef()));
assertEquals([0, 0], wasm.refTestArray(1));
assertEquals([0, 0], wasm.refTestArray({'JavaScript': 'Object'}));
assertEquals([0, 1], wasm.refTestI31(null));
assertEquals([0, 0], wasm.refTestI31(undefined));
assertEquals([0, 0], wasm.refTestI31(wasm.createStructSuper()));
assertEquals([0, 0], wasm.refTestI31(wasm.createStructSub()));
assertEquals([0, 0], wasm.refTestI31(wasm.createArray()));
assertEquals([0, 0], wasm.refTestI31(wasm.createFuncRef()));
assertEquals([1, 1], wasm.refTestI31(1));
assertEquals([0, 0], wasm.refTestI31({'JavaScript': 'Object'}));
assertEquals([0, 1], wasm.refTestAnyArray(null));
assertEquals([0, 0], wasm.refTestAnyArray(undefined));
assertEquals([0, 0], wasm.refTestAnyArray(wasm.createStructSuper()));
assertEquals([0, 0], wasm.refTestAnyArray(wasm.createStructSub()));
assertEquals([1, 1], wasm.refTestAnyArray(wasm.createArray()));
assertEquals([0, 0], wasm.refTestAnyArray(wasm.createFuncRef()));
assertEquals([0, 0], wasm.refTestAnyArray(1));
assertEquals([0, 0], wasm.refTestAnyArray({'JavaScript': 'Object'}));
assertEquals([0, 1], wasm.refTestData(null));
assertEquals([0, 0], wasm.refTestData(undefined));
assertEquals([1, 1], wasm.refTestData(wasm.createStructSuper()));
assertEquals([1, 1], wasm.refTestData(wasm.createStructSub()));
assertEquals([1, 1], wasm.refTestData(wasm.createArray()));
assertEquals([0, 0], wasm.refTestData(wasm.createFuncRef()));
assertEquals([0, 0], wasm.refTestData(1));
assertEquals([0, 0], wasm.refTestData({'JavaScript': 'Object'}));
assertEquals([0, 1], wasm.refTestEq(null));
assertEquals([0, 0], wasm.refTestEq(undefined));
assertEquals([1, 1], wasm.refTestEq(wasm.createStructSuper()));
assertEquals([1, 1], wasm.refTestEq(wasm.createStructSub()));
assertEquals([1, 1], wasm.refTestEq(wasm.createArray()));
assertEquals([0, 0], wasm.refTestEq(wasm.createFuncRef()));
assertEquals([1, 1], wasm.refTestEq(1)); // ref.i31
assertEquals([0, 0], wasm.refTestEq({'JavaScript': 'Object'}));
assertEquals([0, 1], wasm.refTestAny(null));
assertEquals([1, 1], wasm.refTestAny(undefined));
assertEquals([1, 1], wasm.refTestAny(wasm.createStructSuper()));
assertEquals([1, 1], wasm.refTestAny(wasm.createStructSub()));
assertEquals([1, 1], wasm.refTestAny(wasm.createArray()));
assertEquals([1, 1], wasm.refTestAny(wasm.createFuncRef()));
assertEquals([1, 1], wasm.refTestAny(1)); // ref.i31
assertEquals([1, 1], wasm.refTestAny({'JavaScript': 'Object'}));
})();