| |
| |
| |
| |
| |
|
|
| addToLibrary({ |
| #if ASSERTIONS |
| $writeI53ToI64__deps: ['$readI53FromI64', '$readI53FromU64' |
| #if MINIMAL_RUNTIME |
| , '$warnOnce' |
| #endif |
| ], |
| #endif |
| |
| |
| |
| |
| |
| |
| $writeI53ToI64: (ptr, num) => { |
| {{{ makeSetValue('ptr', 0, 'num', 'u32') }}}; |
| var lower = {{{ makeGetValue('ptr', 0, 'u32') }}}; |
| {{{ makeSetValue('ptr', 4, '(num - lower)/4294967296', 'u32') }}}; |
| #if ASSERTIONS |
| var deserialized = (num >= 0) ? readI53FromU64(ptr) : readI53FromI64(ptr); |
| var offset = {{{ getHeapOffset('ptr', 'u32') }}}; |
| if (deserialized != num) warnOnce(`writeI53ToI64() out of range: serialized JS Number ${num} to Wasm heap as bytes lo=${ptrToString(HEAPU32[offset])}, hi=${ptrToString(HEAPU32[offset+1])}, which deserializes back to ${deserialized} instead!`); |
| #endif |
| }, |
|
|
| |
| |
| $writeI53ToI64Clamped__deps: ['$writeI53ToI64'], |
| $writeI53ToI64Clamped: (ptr, num) => { |
| if (num > 0x7FFFFFFFFFFFFFFF) { |
| {{{ makeSetValue('ptr', 0, 0xFFFFFFFF, 'u32') }}}; |
| {{{ makeSetValue('ptr', 4, 0x7FFFFFFF, 'u32') }}}; |
| } else if (num < -0x8000000000000000) { |
| {{{ makeSetValue('ptr', 0, 0, 'u32') }}}; |
| {{{ makeSetValue('ptr', 4, 0x80000000, 'u32') }}}; |
| } else { |
| writeI53ToI64(ptr, num); |
| } |
| }, |
|
|
| |
| $writeI53ToI64Signaling__deps: ['$writeI53ToI64'], |
| $writeI53ToI64Signaling: (ptr, num) => { |
| if (num > 0x7FFFFFFFFFFFFFFF || num < -0x8000000000000000) { |
| #if ASSERTIONS |
| throw `RangeError in writeI53ToI64Signaling(): input value ${num} is out of range of int64`; |
| #else |
| throw `RangeError: ${num}`; |
| #endif |
| } |
| writeI53ToI64(ptr, num); |
| }, |
|
|
| |
| |
| $writeI53ToU64Clamped__deps: ['$writeI53ToI64'], |
| $writeI53ToU64Clamped: (ptr, num) => { |
| if (num > 0xFFFFFFFFFFFFFFFF) { |
| {{{ makeSetValue('ptr', 0, 0xFFFFFFFF, 'u32') }}}; |
| {{{ makeSetValue('ptr', 4, 0xFFFFFFFF, 'u32') }}}; |
| } else if (num < 0) { |
| {{{ makeSetValue('ptr', 0, 0, 'u32') }}}; |
| {{{ makeSetValue('ptr', 4, 0, 'u32') }}}; |
| } else { |
| writeI53ToI64(ptr, num); |
| } |
| }, |
|
|
| |
| $writeI53ToU64Signaling__deps: ['$writeI53ToI64'], |
| $writeI53ToU64Signaling: (ptr, num) => { |
| if (num < 0 || num > 0xFFFFFFFFFFFFFFFF) { |
| #if ASSERTIONS |
| throw `RangeError in writeI53ToU64Signaling(): input value ${num} is out of range of uint64`; |
| #else |
| throw `RangeError: ${num}`; |
| #endif |
| } |
| writeI53ToI64(ptr, num); |
| }, |
|
|
| |
| |
| |
| $readI53FromI64: (ptr) => { |
| return {{{ makeGetValue('ptr', 0, 'u32') }}} + {{{ makeGetValue('ptr', 4, 'i32') }}} * 4294967296; |
| }, |
|
|
| |
| |
| |
| $readI53FromU64: (ptr) => { |
| return {{{ makeGetValue('ptr', 0, 'u32') }}} + {{{ makeGetValue('ptr', 4, 'u32') }}} * 4294967296; |
| }, |
|
|
| |
| |
| $convertI32PairToI53: (lo, hi) => { |
| #if ASSERTIONS |
| |
| |
| |
| assert(hi === (hi|0)); |
| #endif |
| return (lo >>> 0) + hi * 4294967296; |
| }, |
|
|
| |
| |
| |
| $convertI32PairToI53Checked: (lo, hi) => { |
| #if ASSERTIONS |
| assert(lo == (lo >>> 0) || lo == (lo|0)); |
| assert(hi === (hi|0)); |
| #endif |
| return ((hi + 0x200000) >>> 0 < 0x400001 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; |
| }, |
|
|
| |
| |
| |
| $convertU32PairToI53: (lo, hi) => { |
| return (lo >>> 0) + (hi >>> 0) * 4294967296; |
| }, |
|
|
| #if WASM_BIGINT |
| $INT53_MAX: '{{{ Math.pow(2, 53) }}}', |
| $INT53_MIN: '-{{{ Math.pow(2, 53) }}}', |
| |
| |
| |
| |
| $bigintToI53Checked__deps: ['$INT53_MAX', '$INT53_MIN'], |
| $bigintToI53Checked: (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num), |
| #endif |
| }); |
|
|
| #if WASM_BIGINT |
| globalThis.i53ConversionDeps = ['$bigintToI53Checked']; |
| #else |
| globalThis.i53ConversionDeps = ['$convertI32PairToI53Checked']; |
| #endif |
|
|