diff options
Diffstat (limited to 'deps/v8/src/builtins/math.tq')
-rw-r--r-- | deps/v8/src/builtins/math.tq | 96 |
1 files changed, 72 insertions, 24 deletions
diff --git a/deps/v8/src/builtins/math.tq b/deps/v8/src/builtins/math.tq index df43b30efc..99a29bd5cb 100644 --- a/deps/v8/src/builtins/math.tq +++ b/deps/v8/src/builtins/math.tq @@ -7,7 +7,7 @@ namespace math { extern macro Float64Acos(float64): float64; transitioning javascript builtin - MathAcos(context: Context, _receiver: Object, x: Object): Number { + MathAcos(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Acos(value)); } @@ -16,7 +16,7 @@ namespace math { extern macro Float64Acosh(float64): float64; transitioning javascript builtin - MathAcosh(context: Context, _receiver: Object, x: Object): Number { + MathAcosh(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Acosh(value)); } @@ -25,7 +25,7 @@ namespace math { extern macro Float64Asin(float64): float64; transitioning javascript builtin - MathAsin(context: Context, _receiver: Object, x: Object): Number { + MathAsin(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Asin(value)); } @@ -34,7 +34,7 @@ namespace math { extern macro Float64Asinh(float64): float64; transitioning javascript builtin - MathAsinh(context: Context, _receiver: Object, x: Object): Number { + MathAsinh(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Asinh(value)); } @@ -43,7 +43,7 @@ namespace math { extern macro Float64Atan(float64): float64; transitioning javascript builtin - MathAtan(context: Context, _receiver: Object, x: Object): Number { + MathAtan(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Atan(value)); } @@ -52,7 +52,7 @@ namespace math { extern macro Float64Atan2(float64, float64): float64; transitioning javascript builtin - MathAtan2(context: Context, _receiver: Object, y: Object, x: Object): Number { + MathAtan2(js-implicit context: Context)(y: JSAny, x: JSAny): Number { const yValue = Convert<float64>(ToNumber_Inline(context, y)); const xValue = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Atan2(yValue, xValue)); @@ -62,7 +62,7 @@ namespace math { extern macro Float64Atanh(float64): float64; transitioning javascript builtin - MathAtanh(context: Context, _receiver: Object, x: Object): Number { + MathAtanh(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Atanh(value)); } @@ -71,7 +71,7 @@ namespace math { extern macro Float64Cbrt(float64): float64; transitioning javascript builtin - MathCbrt(context: Context, _receiver: Object, x: Object): Number { + MathCbrt(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Cbrt(value)); } @@ -80,7 +80,7 @@ namespace math { extern macro Word32Clz(int32): int32; transitioning javascript builtin - MathClz32(context: Context, _receiver: Object, x: Object): Number { + MathClz32(js-implicit context: Context)(x: JSAny): Number { const num = ToNumber_Inline(context, x); let value: int32; @@ -100,7 +100,7 @@ namespace math { extern macro Float64Cos(float64): float64; transitioning javascript builtin - MathCos(context: Context, _receiver: Object, x: Object): Number { + MathCos(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Cos(value)); } @@ -109,7 +109,7 @@ namespace math { extern macro Float64Cosh(float64): float64; transitioning javascript builtin - MathCosh(context: Context, _receiver: Object, x: Object): Number { + MathCosh(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Cosh(value)); } @@ -118,7 +118,7 @@ namespace math { extern macro Float64Exp(float64): float64; transitioning javascript builtin - MathExp(context: Context, _receiver: Object, x: Object): Number { + MathExp(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Exp(value)); } @@ -127,14 +127,14 @@ namespace math { extern macro Float64Expm1(float64): float64; transitioning javascript builtin - MathExpm1(context: Context, _receiver: Object, x: Object): Number { + MathExpm1(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Expm1(value)); } // ES6 #sec-math.fround transitioning javascript builtin - MathFround(context: Context, _receiver: Object, x: Object): Number { + MathFround(js-implicit context: Context)(x: JSAny): Number { const x32 = Convert<float32>(ToNumber_Inline(context, x)); const x64 = Convert<float64>(x32); return Convert<Number>(x64); @@ -144,7 +144,7 @@ namespace math { extern macro Float64Log(float64): float64; transitioning javascript builtin - MathLog(context: Context, _receiver: Object, x: Object): Number { + MathLog(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Log(value)); } @@ -153,7 +153,7 @@ namespace math { extern macro Float64Log1p(float64): float64; transitioning javascript builtin - MathLog1p(context: Context, _receiver: Object, x: Object): Number { + MathLog1p(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Log1p(value)); } @@ -162,7 +162,7 @@ namespace math { extern macro Float64Log10(float64): float64; transitioning javascript builtin - MathLog10(context: Context, _receiver: Object, x: Object): Number { + MathLog10(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Log10(value)); } @@ -171,7 +171,7 @@ namespace math { extern macro Float64Log2(float64): float64; transitioning javascript builtin - MathLog2(context: Context, _receiver: Object, x: Object): Number { + MathLog2(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Log2(value)); } @@ -180,14 +180,14 @@ namespace math { extern macro Float64Sin(float64): float64; transitioning javascript builtin - MathSin(context: Context, _receiver: Object, x: Object): Number { + MathSin(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Sin(value)); } // ES6 #sec-math.sign transitioning javascript builtin - MathSign(context: Context, _receiver: Object, x: Object): Number { + MathSign(js-implicit context: Context)(x: JSAny): Number { const num = ToNumber_Inline(context, x); const value = Convert<float64>(num); @@ -204,7 +204,7 @@ namespace math { extern macro Float64Sinh(float64): float64; transitioning javascript builtin - MathSinh(context: Context, _receiver: Object, x: Object): Number { + MathSinh(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Sinh(value)); } @@ -213,7 +213,7 @@ namespace math { extern macro Float64Sqrt(float64): float64; transitioning javascript builtin - MathSqrt(context: Context, _receiver: Object, x: Object): Number { + MathSqrt(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Sqrt(value)); } @@ -222,7 +222,7 @@ namespace math { extern macro Float64Tan(float64): float64; transitioning javascript builtin - MathTan(context: Context, _receiver: Object, x: Object): Number { + MathTan(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Tan(value)); } @@ -231,8 +231,56 @@ namespace math { extern macro Float64Tanh(float64): float64; transitioning javascript builtin - MathTanh(context: Context, _receiver: Object, x: Object): Number { + MathTanh(js-implicit context: Context)(x: JSAny): Number { const value = Convert<float64>(ToNumber_Inline(context, x)); return Convert<Number>(Float64Tanh(value)); } + + extern macro Float64Abs(float64): float64; + + // ES6 #sec-math.hypot + transitioning javascript builtin + MathHypot(js-implicit context: Context, receiver: JSAny)(...arguments): + Number { + const length = arguments.length; + if (length == 0) { + return 0; + } + const absValues = AllocateZeroedFixedDoubleArray(length); + let oneArgIsNaN: bool = false; + let max: float64 = 0; + for (let i: intptr = 0; i < length; ++i) { + const value = Convert<float64>(ToNumber_Inline(context, arguments[i])); + if (Float64IsNaN(value)) { + oneArgIsNaN = true; + } else { + const absValue = Float64Abs(value); + absValues.floats[i] = absValue; + if (absValue > max) { + max = absValue; + } + } + } + if (max == V8_INFINITY) { + return V8_INFINITY; + } else if (oneArgIsNaN) { + return kNaN; + } else if (max == 0) { + return 0; + } + assert(max > 0); + + // Kahan summation to avoid rounding errors. + // Normalize the numbers to the largest one to avoid overflow. + let sum: float64 = 0; + let compensation: float64 = 0; + for (let i: intptr = 0; i < length; ++i) { + const n = absValues.floats[i] / max; + const summand = n * n - compensation; + const preliminary = sum + summand; + compensation = (preliminary - sum) - summand; + sum = preliminary; + } + return Convert<Number>(Float64Sqrt(sum) * max); + } } |