*vp = cx->runtime->NaNValue; return JS_TRUE; } /* pow(x, +-0) is always 1, even for x = NaN. */ if (y == 0) { *vp = JSVAL_ONE; return JS_TRUE; } z = pow(x, y); return js_NewNumberInRootedValue(cx, z, vp); } static const int64 RNG_MULTIPLIER = 0x5DEECE66DLL; static const int64 RNG_ADDEND = 0xBLL; static const int64 RNG_MASK = (1LL << 48) - 1; static const jsdouble RNG_DSCALE = jsdouble(1LL << 53); /* * Math.random() support, lifted from java.util.Random.java. */ static inline void random_setSeed(JSContext *cx, int64 seed) { cx->rngSeed = (seed ^ RNG_MULTIPLIER) & RNG_MASK; } void js_InitRandom(JSContext *cx) { /* * Set the seed from current time. Since we have a RNG per context and we often bring
static inline jsdouble random_nextDouble(JSContext *cx) { return jsdouble((random_next(cx, 26) << 27) + random_next(cx, 27)) / RNG_DSCALE; }
static inline jsdouble random_nextDouble(JSThreadData *data) { return jsdouble((random_next(data, 26) << 27) + random_next(data, 27)) / RNG_DSCALE; }