From 3651ffe993a9243a89fe965fedee9315f3ab68f4 Mon Sep 17 00:00:00 2001 From: Jonathan Liu Date: Mon, 17 Dec 2012 23:15:57 +1100 Subject: Fix Math.pow implementation with MinGW-w64 https://bugs.webkit.org/show_bug.cgi?id=105087 Patch by Jonathan Liu on 2012-12-17 Reviewed by Simon Hausmann. The MinGW-w64 runtime has different behaviour for pow() compared to other C runtimes. This results in the following test262 tests failing with the latest MinGW-w64 runtime: - S15.8.2.13_A14 - S15.8.2.13_A16 - S15.8.2.13_A20 - S15.8.2.13_A22 Handle the special cases that are different with MinGW-w64. * runtime/MathObject.cpp: (JSC::mathPow): Change-Id: Ifad1aa24ac36f2d452e9166a4298525793597da3 git-svn-id: http://svn.webkit.org/repository/webkit/trunk@137895 268f45cc-cd09-0410-ab3c-d52691b4dbfc Reviewed-by: Simon Hausmann --- Source/JavaScriptCore/runtime/MathObject.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'Source/JavaScriptCore/runtime/MathObject.cpp') diff --git a/Source/JavaScriptCore/runtime/MathObject.cpp b/Source/JavaScriptCore/runtime/MathObject.cpp index 7634487ad..f939b8dd4 100644 --- a/Source/JavaScriptCore/runtime/MathObject.cpp +++ b/Source/JavaScriptCore/runtime/MathObject.cpp @@ -232,6 +232,22 @@ static ALWAYS_INLINE double mathPow(double x, double y) ALWAYS_INLINE double mathPow(double x, double y) { +#if COMPILER(MINGW64) + // MinGW-w64 has a custom implementation for pow. + // This handles certain special cases that are different. + if ((x == 0.0 || isinf(x)) && isfinite(y)) { + double f; + if (modf(y, &f) != 0.0) + return ((x == 0.0) ^ (y > 0.0)) ? std::numeric_limits::infinity() : 0.0; + } + + if (x == 2.0) { + int yInt = static_cast(y); + if (y == yInt) + return ldexp(1.0, yInt); + } +#endif + return pow(x, y); } -- cgit v1.2.1