let InvalidI31Values = [ null,
Number.EPSILON,
Number.MAX_SAFE_INTEGER,
Number.MIN_SAFE_INTEGER,
Number.MIN_VALUE,
Number.MAX_VALUE,
Number.NaN,
-0, // Number objects are not coerced
...WasmI31refValues.map(n => new Number(n)), // Non-integers are not valid
...WasmI31refValues.map(n => n + 0.1),
...WasmI31refValues.map(n => n + 0.5),
...WasmI31refValues.map(n => n + 0.9)
];
// Return an equivalent JS number for if a JS number is converted to i31ref // and then zero extended back to 32-bits. function valueAsI31GetU(value) { // Zero extending will drop the sign bit, if any return value & 0x7fffffff;
}
// Test that wasm will represent JS number values that are 31-bit integers as // an i31ref for (let i of WasmI31refValues) {
assertEq(castFromAnyref(i), 1);
assertEq(castFromExternref(i), 1);
}
// Test that wasm will not represent a JS value that is not a 31-bit number as // an i31ref for (let i of InvalidI31Values) {
assertEq(castFromAnyref(i), 0);
assertEq(castFromExternref(i), 0);
}
// Test that we can roundtrip 31-bit integers through the i31ref type // faithfully. for (let i of WasmI31refValues) {
assertEq(refI31(i), i);
assertEq(refI31Identity(i), i);
assertEq(i31GetU(i), valueAsI31GetU(i));
assertEq(i31GetS(i), i);
}
// Test that i31ref values are truncated when given a 32-bit value for (let i of WasmI31refValues) {
let adjusted = i | 0x80000000;
assertEq(refI31(adjusted), i);
}
// Test that comparing identical i31 values works for (let a of WasmI31refValues) { for (let b of WasmI31refValues) {
assertEq(!!i31EqualsI31(a, b), a === b);
}
}
// Test that an i31ref is never mistaken for a different kind of reference for (let a of WasmI31refValues) { for (let b of WasmEqrefValues) {
assertEq(!!i31EqualsEq(a, b), a === b);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.