| // 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() { |
| var builder = new WasmModuleBuilder(); |
| |
| builder |
| .addFunction("fn", kSig_l_v) // () -> i64 |
| .addBody([ |
| kExprI64Const, 0x3, |
| ]) |
| .exportFunc(); |
| |
| var module = builder.instantiate(); |
| |
| assertEquals(typeof module.exports.fn(), "bigint"); |
| assertEquals(module.exports.fn(), 3n); |
| })(); |
| |
| (function TestJSBigIntToWasmI64Global() { |
| var builder = new WasmModuleBuilder(); |
| |
| var a_global_index = builder |
| .addImportedGlobal("mod", "a", kWasmI64) |
| |
| var b_global_index = builder |
| .addImportedGlobal("mod", "b", kWasmI64); |
| |
| var 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); |
| |
| var 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() { |
| var builder = new WasmModuleBuilder(); |
| |
| var a_global_index = builder |
| .addImportedGlobal("mod", "a", kWasmI64, /* mutable = */ true) |
| |
| builder |
| .addExportOfKind('a', kExternalGlobal, a_global_index); |
| |
| // as non object |
| var fn = () => builder.instantiate({ |
| mod: { |
| a: 1n, |
| } |
| }); |
| |
| assertThrows(fn, WebAssembly.LinkError); |
| |
| // as WebAssembly.Global object |
| var module = builder.instantiate({ |
| mod: { |
| a: new WebAssembly.Global({ value: "i64", mutable: true }, 1n), |
| } |
| }); |
| |
| assertEquals(module.exports.a.value, 1n); |
| })(); |
| |
| (function TestJSBigIntToWasmI64Identity() { |
| var builder = new WasmModuleBuilder(); |
| |
| builder |
| .addFunction("f", kSig_l_l) // i64 -> i64 |
| .addBody([ |
| kExprGetLocal, 0x0, |
| ]) |
| .exportFunc(); |
| |
| var module = builder.instantiate(); |
| var f = module.exports.f; |
| |
| assertEquals(f(0n), 0n); |
| assertEquals(f(-0n), -0n); |
| assertEquals(f(123n), 123n); |
| assertEquals(f(-123n), -123n); |
| |
| assertEquals(f("5"), 5n); |
| |
| assertThrows(() => f(5), TypeError); |
| })(); |
| |
| (function TestI64Global() { |
| var argument = { "value": "i64", "mutable": true }; |
| var 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() { |
| var argument = { "value": "i64" }; |
| |
| // as literal |
| var global = new WebAssembly.Global(argument, { |
| valueOf() { |
| return 123n; |
| } |
| }); |
| assertEquals(global.value, 123n); |
| |
| // as string |
| var global2 = new WebAssembly.Global(argument, { |
| valueOf() { |
| return "321"; |
| } |
| }); |
| assertEquals(global2.value, 321n); |
| })(); |
| |
| (function TestInvalidValtypeGlobalErrorMessage() { |
| var 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() { |
| var argument = { "value": "i64" }; |
| assertThrows(() => new WebAssembly.Global(argument, 666), TypeError); |
| })(); |
| |
| (function TestGlobalI64SetWrongType() { |
| var argument = { "value": "i64", "mutable": true }; |
| var global = new WebAssembly.Global(argument); |
| |
| assertThrows(() => global.value = 1, TypeError); |
| })(); |
| |
| (function TestFuncParamF64PassingBigInt() { |
| var builder = new WasmModuleBuilder(); |
| |
| builder |
| .addFunction("f", kSig_v_d) // f64 -> () |
| .addBody([]) |
| .exportFunc(); |
| |
| var module = builder.instantiate(); |
| |
| assertThrows(() => module.exports.f(123n), TypeError); |
| })(); |