From be6e1fd2822013ef11115da57c998e253193e3a5 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 10 Aug 2009 18:09:51 -0700 Subject: [PATCH] Fixed parseInt handling negative numbers wrong in JIT'd code (bug 507993, r=brendan). --- js/src/jsnum.cpp | 11 ++++++++++- js/src/trace-test.js | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/js/src/jsnum.cpp b/js/src/jsnum.cpp index 1bbb575d4a88..f2b4cb9bfdf5 100644 --- a/js/src/jsnum.cpp +++ b/js/src/jsnum.cpp @@ -208,7 +208,16 @@ ParseIntDouble(jsdouble d) { if (!JSDOUBLE_IS_FINITE(d)) return js_NaN; - return floor(d); + + /* Don't preserve -0, because js_strtointeger doesn't. */ + if (d == 0) + return 0; + if (d > 0) + return floor(d); + d = ceil(d); + + /* ceil does not seem to return -0 if not given -0. */ + return (d == 0) ? -0.0 : d; } #endif diff --git a/js/src/trace-test.js b/js/src/trace-test.js index 49d67ca12aa0..7e5eb747fa84 100644 --- a/js/src/trace-test.js +++ b/js/src/trace-test.js @@ -5683,6 +5683,29 @@ function testClosureIncrSideExit() { testClosureIncrSideExit.expected = "ddd"; test(testClosureIncrSideExit); +function parseIntHelper(n) { + var a; + for (var i = 0; i < 5; i++) + a = parseInt(n); + return a; +} +function doParseIntTests() { + var inputs = [0, -0, .1, -.1, .7, -.7, 1.3, -1.3]; + var outputs = new Array(8); + //avoid jit, unrolled + outputs[0] = outputs[1] = outputs[2] = outputs[4] = 0; + outputs[3] = outputs[5] = -0; + outputs[6] = 1; + outputs[7] = -1; + for (var i = 0; i < 8; i++) { + var testfn = new Function('return parseIntHelper(' + uneval(inputs[i]) + ');'); + testfn.name = 'testParseInt' + uneval(inputs[i]); + testfn.expected = outputs[i]; + test(testfn); + } +} +doParseIntTests(); + /***************************************************************************** * * * _____ _ _ _____ ______ _____ _______ *