bool SCInput::readDouble(double *p) { union { uint64_t u; double d; } pun; if (!read(&pun.u)) return false; *p = CanonicalizeNaN(pun.d); return true; }
Value SharedTypedArrayObjectTemplate<double>::getIndexValue(JSObject *tarray, uint32_t index) { double val = getIndex(tarray, index); /* * Doubles in typed arrays could be typed-punned arrays of integers. This * could allow user code to break the engine-wide invariant that only * canonical nans are stored into jsvals, which means user code could * confuse the engine into interpreting a double-typed jsval as an * object-typed jsval. */ return DoubleValue(CanonicalizeNaN(val)); }
Value SharedTypedArrayObjectTemplate<float>::getIndexValue(JSObject *tarray, uint32_t index) { float val = getIndex(tarray, index); double dval = val; /* * Doubles in typed arrays could be typed-punned arrays of integers. This * could allow user code to break the engine-wide invariant that only * canonical nans are stored into jsvals, which means user code could * confuse the engine into interpreting a double-typed jsval as an * object-typed jsval. * * This could be removed for platforms/compilers known to convert a 32-bit * non-canonical nan to a 64-bit canonical nan. */ return DoubleValue(CanonicalizeNaN(dval)); }
bool SCOutput::writeDouble(double d) { return write(ReinterpretDoubleAsUInt64(CanonicalizeNaN(d))); }