Changeset 104267 in webkit


Ignore:
Timestamp:
Jan 5, 2012 9:29:28 PM (12 years ago)
Author:
barraclough@apple.com
Message:

Date constructor handles infinite values incorrectly.
https://bugs.webkit.org/show_bug.cgi?id=70998

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

  • runtime/DateConstructor.cpp:

(JSC::constructDate):

  • should be checking !finite rather then isnan.

LayoutTests:

  • fast/js/date-constructor-expected.txt:
  • fast/js/script-tests/date-constructor.js:
    • Added test cases.
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r104266 r104267  
     12012-01-05  Gavin Barraclough  <barraclough@apple.com>
     2
     3        Date constructor handles infinite values incorrectly.
     4        https://bugs.webkit.org/show_bug.cgi?id=70998
     5
     6        Reviewed by Filip Pizlo.
     7
     8        * fast/js/date-constructor-expected.txt:
     9        * fast/js/script-tests/date-constructor.js:
     10            - Added test cases.
     11
    1122012-01-05  Gavin Barraclough  <barraclough@apple.com>
    213
  • trunk/LayoutTests/fast/js/date-constructor-expected.txt

    r68347 r104267  
    2525PASS new Date(new Date(1111, 1, 1, 1, 1, 1, 1, 1)).getTime() - timeZoneOffset is -27104799538999
    2626PASS new Date(new Date(1111, 1, 1, 1, 1, 1, 1, 1, 1)).getTime() - timeZoneOffset is -27104799538999
     27PASS Number(new Date(new Date(Infinity, 1, 1, 1, 1, 1, 1, 1, 1))) is Number.NaN
     28PASS Number(new Date(new Date(1, Infinity, 1, 1, 1, 1, 1, 1, 1))) is Number.NaN
     29PASS Number(new Date(new Date(1, 1, Infinity, 1, 1, 1, 1, 1, 1))) is Number.NaN
     30PASS Number(new Date(new Date(1, 1, 1, Infinity, 1, 1, 1, 1, 1))) is Number.NaN
     31PASS Number(new Date(new Date(1, 1, 1, 1, Infinity, 1, 1, 1, 1))) is Number.NaN
     32PASS Number(new Date(new Date(1, 1, 1, 1, 1, Infinity, 1, 1, 1))) is Number.NaN
     33PASS Number(new Date(new Date(1, 1, 1, 1, 1, 1, Infinity, 1, 1))) is Number.NaN
     34PASS Number(new Date(new Date(1, 1, 1, 1, 1, 1, 1, 1, Infinity))) is -2174741938999
    2735PASS testStr is "1234567"
    2836PASS testStr is "1234567"
  • trunk/LayoutTests/fast/js/script-tests/date-constructor.js

    r98407 r104267  
    3636shouldBe('new Date(new Date(1111, 1, 1, 1, 1, 1, 1, 1, 1)).getTime() - timeZoneOffset', '-27104799538999');
    3737
     38shouldBe("Number(new Date(new Date(Infinity, 1, 1, 1, 1, 1, 1, 1, 1)))", 'Number.NaN');
     39shouldBe("Number(new Date(new Date(1, Infinity, 1, 1, 1, 1, 1, 1, 1)))", 'Number.NaN');
     40shouldBe("Number(new Date(new Date(1, 1, Infinity, 1, 1, 1, 1, 1, 1)))", 'Number.NaN');
     41shouldBe("Number(new Date(new Date(1, 1, 1, Infinity, 1, 1, 1, 1, 1)))", 'Number.NaN');
     42shouldBe("Number(new Date(new Date(1, 1, 1, 1, Infinity, 1, 1, 1, 1)))", 'Number.NaN');
     43shouldBe("Number(new Date(new Date(1, 1, 1, 1, 1, Infinity, 1, 1, 1)))", 'Number.NaN');
     44shouldBe("Number(new Date(new Date(1, 1, 1, 1, 1, 1, Infinity, 1, 1)))", 'Number.NaN');
     45shouldBe("Number(new Date(new Date(1, 1, 1, 1, 1, 1, 1, 1, Infinity)))", '-2174741938999');
     46
    3847// In Firefox, the results of the following tests are timezone-dependent, which likely implies that the implementation is not quite correct.
    3948// Our results are even worse, though, as the dates are clipped: (new Date(1111, 1201).getTime()) == (new Date(1111, 601).getTime())
  • trunk/Source/JavaScriptCore/ChangeLog

    r104266 r104267  
     12012-01-05  Gavin Barraclough  <barraclough@apple.com>
     2
     3        Date constructor handles infinite values incorrectly.
     4        https://bugs.webkit.org/show_bug.cgi?id=70998
     5
     6        Reviewed by Filip Pizlo.
     7
     8        * runtime/DateConstructor.cpp:
     9        (JSC::constructDate):
     10            - should be checking !finite rather then isnan.
     11
    1122012-01-05  Gavin Barraclough  <barraclough@apple.com>
    213
  • trunk/Source/JavaScriptCore/runtime/DateConstructor.cpp

    r103083 r104267  
    126126            args.at(6).toNumber(exec)
    127127        };
    128         if (isnan(doubleArguments[0])
    129                 || isnan(doubleArguments[1])
    130                 || (numArgs >= 3 && isnan(doubleArguments[2]))
    131                 || (numArgs >= 4 && isnan(doubleArguments[3]))
    132                 || (numArgs >= 5 && isnan(doubleArguments[4]))
    133                 || (numArgs >= 6 && isnan(doubleArguments[5]))
    134                 || (numArgs >= 7 && isnan(doubleArguments[6])))
     128        if (!isfinite(doubleArguments[0])
     129            || !isfinite(doubleArguments[1])
     130            || (numArgs >= 3 && !isfinite(doubleArguments[2]))
     131            || (numArgs >= 4 && !isfinite(doubleArguments[3]))
     132            || (numArgs >= 5 && !isfinite(doubleArguments[4]))
     133            || (numArgs >= 6 && !isfinite(doubleArguments[5]))
     134            || (numArgs >= 7 && !isfinite(doubleArguments[6])))
    135135            value = std::numeric_limits<double>::quiet_NaN();
    136136        else {
Note: See TracChangeset for help on using the changeset viewer.