// Copyright 2018 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-bigint load("test/mjsunit/wasm/wasm-module-builder.js"); (function TestWasmI64ToJSBigInt() { let builder = new WasmModuleBuilder(); builder .addFunction("fn", kSig_l_v) // () -> i64 .addBody([ kExprI64Const, 0x3, ]) .exportFunc(); let module = builder.instantiate(); assertEquals(typeof module.exports.fn(), "bigint"); assertEquals(module.exports.fn(), 3n); })(); (function TestJSBigIntToWasmI64Global() { let builder = new WasmModuleBuilder(); let a_global_index = builder .addImportedGlobal("mod", "a", kWasmI64) let b_global_index = builder .addImportedGlobal("mod", "b", kWasmI64); let c_global_index = builder .addImportedGlobal("mod", "c", kWasmI64); builder .addExportOfKind('a', kExternalGlobal, a_global_index) .addExportOfKind('b', kExternalGlobal, b_global_index) .addExportOfKind('c', kExternalGlobal, c_global_index); let module = builder.instantiate({ mod: { a: 1n, b: 2n ** 63n, c: "123", } }); assertEquals(module.exports.a.value, 1n); assertEquals(module.exports.b.value, - (2n ** 63n)); assertEquals(module.exports.c.value, 123n); })(); (function TestJSBigIntToWasmI64MutableGlobal() { let builder = new WasmModuleBuilder(); let a_global_index = builder .addImportedGlobal("mod", "a", kWasmI64, /* mutable = */ true) builder .addExportOfKind('a', kExternalGlobal, a_global_index); // as non object let fn = () => builder.instantiate({ mod: { a: 1n, } }); assertThrows(fn, WebAssembly.LinkError); // as WebAssembly.Global object let module = builder.instantiate({ mod: { a: new WebAssembly.Global({ value: "i64", mutable: true }, 1n), } }); assertEquals(module.exports.a.value, 1n); })(); (function TestJSBigIntToWasmI64Identity() { let builder = new WasmModuleBuilder(); builder .addFunction("f", kSig_l_l) // i64 -> i64 .addBody([ kExprGetLocal, 0, ]) .exportFunc(); let module = builder.instantiate(); let f = module.exports.f; assertEquals(f(0n), 0n); assertEquals(f(123n), 123n); assertEquals(f(-123n), -123n); assertEquals(f("5"), 5n); assertThrows(() => f(5), TypeError); })(); (function TestJSBigIntToWasmI64Projection() { let builder = new WasmModuleBuilder(); builder .addFunction("f", kSig_l_ll) // i64 -> i64 .addBody([ kExprGetLocal, 1, ]) .exportFunc(); let module = builder.instantiate(); let f = module.exports.f; assertEquals(f(1n, 0n), 0n); assertEquals(f(1n, 123n), 123n); assertEquals(f(1n, -123n), -123n); assertEquals(f(1n, "5"), 5n); assertThrows(() => f(1n, 5), TypeError); })(); (function TestI64Global() { let argument = { "value": "i64", "mutable": true }; let global = new WebAssembly.Global(argument); assertEquals(global.value, 0n); // initial value global.value = 123n; assertEquals(global.valueOf(), 123n); global.value = 2n ** 63n; assertEquals(global.valueOf(), - (2n ** 63n)); })(); (function TestI64GlobalValueOf() { let argument = { "value": "i64" }; // as literal let global = new WebAssembly.Global(argument, { valueOf() { return 123n; } }); assertEquals(global.value, 123n); // as string let global2 = new WebAssembly.Global(argument, { valueOf() { return "321"; } }); assertEquals(global2.value, 321n); })(); (function TestInvalidValtypeGlobalErrorMessage() { let argument = { "value": "some string" }; assertThrows(() => new WebAssembly.Global(argument), TypeError); try { new WebAssembly.Global(argument); } catch (e) { assertContains("'value' must be", e.message); assertContains("i64", e.message); } })(); (function TestGlobalI64ValueWrongType() { let argument = { "value": "i64" }; assertThrows(() => new WebAssembly.Global(argument, 666), TypeError); })(); (function TestGlobalI64SetWrongType() { let argument = { "value": "i64", "mutable": true }; let global = new WebAssembly.Global(argument); assertThrows(() => global.value = 1, TypeError); })(); (function TestFuncParamF64PassingBigInt() { let builder = new WasmModuleBuilder(); builder .addFunction("f", kSig_v_d) // f64 -> () .addBody([]) .exportFunc(); let module = builder.instantiate(); assertThrows(() => module.exports.f(123n), TypeError); })();