Changeset 68347 in webkit


Ignore:
Timestamp:
Sep 26, 2010 2:26:24 PM (14 years ago)
Author:
commit-queue@webkit.org
Message:

2010-09-26 Mark Hahnenberg <mhahnenb@gmail.com>

Reviewed by Oliver Hunt.

valueOf called in wrong order in atan2 and date constructors.
https://bugs.webkit.org/show_bug.cgi?id=26978

Fixed the issue where the parameters to the Date constructor
were being evaluated to numbers more than once.

  • runtime/DateConstructor.cpp: (JSC::constructDate): (JSC::dateUTC):

2010-09-26 Mark Hahnenberg <mhahnenb@gmail.com>

Reviewed by Oliver Hunt.

valueOf called in wrong order in atan2 and date constructors.
https://bugs.webkit.org/show_bug.cgi?id=26978

Added regression test for the Date constructor issue.

  • fast/js/date-constructor-expected.txt:
  • fast/js/script-tests/date-constructor.js: (year.valueOf): (month.valueOf): (date.valueOf): (hours.valueOf): (minutes.valueOf): (seconds.valueOf): (ms.valueOf):
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r68339 r68347  
     12010-09-26  Mark Hahnenberg  <mhahnenb@gmail.com>
     2
     3        Reviewed by Oliver Hunt.
     4
     5        valueOf called in wrong order in atan2 and date constructors.
     6        https://bugs.webkit.org/show_bug.cgi?id=26978
     7
     8        Fixed the issue where the parameters to the Date constructor
     9        were being evaluated to numbers more than once.
     10
     11        * runtime/DateConstructor.cpp:
     12        (JSC::constructDate):
     13        (JSC::dateUTC):
     14
    1152010-09-25  Oliver Hunt  <oliver@apple.com>
    216
  • trunk/JavaScriptCore/runtime/DateConstructor.cpp

    r60708 r68347  
    9191        }
    9292    } else {
    93         if (isnan(args.at(0).toNumber(exec))
    94                 || isnan(args.at(1).toNumber(exec))
    95                 || (numArgs >= 3 && isnan(args.at(2).toNumber(exec)))
    96                 || (numArgs >= 4 && isnan(args.at(3).toNumber(exec)))
    97                 || (numArgs >= 5 && isnan(args.at(4).toNumber(exec)))
    98                 || (numArgs >= 6 && isnan(args.at(5).toNumber(exec)))
    99                 || (numArgs >= 7 && isnan(args.at(6).toNumber(exec))))
     93        double doubleArguments[7] = {
     94            args.at(0).toNumber(exec),
     95            args.at(1).toNumber(exec),
     96            args.at(2).toNumber(exec),
     97            args.at(3).toNumber(exec),
     98            args.at(4).toNumber(exec),
     99            args.at(5).toNumber(exec),
     100            args.at(6).toNumber(exec)
     101        };
     102        if (isnan(doubleArguments[0])
     103                || isnan(doubleArguments[1])
     104                || (numArgs >= 3 && isnan(doubleArguments[2]))
     105                || (numArgs >= 4 && isnan(doubleArguments[3]))
     106                || (numArgs >= 5 && isnan(doubleArguments[4]))
     107                || (numArgs >= 6 && isnan(doubleArguments[5]))
     108                || (numArgs >= 7 && isnan(doubleArguments[6])))
    100109            value = NaN;
    101110        else {
    102111            GregorianDateTime t;
    103             int year = args.at(0).toInt32(exec);
     112            int year = JSC::toInt32(doubleArguments[0]);
    104113            t.year = (year >= 0 && year <= 99) ? year : year - 1900;
    105             t.month = args.at(1).toInt32(exec);
    106             t.monthDay = (numArgs >= 3) ? args.at(2).toInt32(exec) : 1;
    107             t.hour = args.at(3).toInt32(exec);
    108             t.minute = args.at(4).toInt32(exec);
    109             t.second = args.at(5).toInt32(exec);
     114            t.month = JSC::toInt32(doubleArguments[1]);
     115            t.monthDay = (numArgs >= 3) ? JSC::toInt32(doubleArguments[2]) : 1;
     116            t.hour = JSC::toInt32(doubleArguments[3]);
     117            t.minute = JSC::toInt32(doubleArguments[4]);
     118            t.second = JSC::toInt32(doubleArguments[5]);
    110119            t.isDST = -1;
    111             double ms = (numArgs >= 7) ? args.at(6).toNumber(exec) : 0;
     120            double ms = (numArgs >= 7) ? doubleArguments[6] : 0;
    112121            value = gregorianDateTimeToMS(exec, t, ms, false);
    113122        }
     
    161170static EncodedJSValue JSC_HOST_CALL dateUTC(ExecState* exec)
    162171{
     172    double doubleArguments[7] = {
     173        exec->argument(0).toNumber(exec),
     174        exec->argument(1).toNumber(exec),
     175        exec->argument(2).toNumber(exec),
     176        exec->argument(3).toNumber(exec),
     177        exec->argument(4).toNumber(exec),
     178        exec->argument(5).toNumber(exec),
     179        exec->argument(6).toNumber(exec)
     180    };
    163181    int n = exec->argumentCount();
    164     if (isnan(exec->argument(0).toNumber(exec))
    165             || isnan(exec->argument(1).toNumber(exec))
    166             || (n >= 3 && isnan(exec->argument(2).toNumber(exec)))
    167             || (n >= 4 && isnan(exec->argument(3).toNumber(exec)))
    168             || (n >= 5 && isnan(exec->argument(4).toNumber(exec)))
    169             || (n >= 6 && isnan(exec->argument(5).toNumber(exec)))
    170             || (n >= 7 && isnan(exec->argument(6).toNumber(exec))))
     182    if (isnan(doubleArguments[0])
     183            || isnan(doubleArguments[1])
     184            || (n >= 3 && isnan(doubleArguments[2]))
     185            || (n >= 4 && isnan(doubleArguments[3]))
     186            || (n >= 5 && isnan(doubleArguments[4]))
     187            || (n >= 6 && isnan(doubleArguments[5]))
     188            || (n >= 7 && isnan(doubleArguments[6])))
    171189        return JSValue::encode(jsNaN(exec));
    172190
    173191    GregorianDateTime t;
    174     int year = exec->argument(0).toInt32(exec);
     192    int year = JSC::toInt32(doubleArguments[0]);
    175193    t.year = (year >= 0 && year <= 99) ? year : year - 1900;
    176     t.month = exec->argument(1).toInt32(exec);
    177     t.monthDay = (n >= 3) ? exec->argument(2).toInt32(exec) : 1;
    178     t.hour = exec->argument(3).toInt32(exec);
    179     t.minute = exec->argument(4).toInt32(exec);
    180     t.second = exec->argument(5).toInt32(exec);
    181     double ms = (n >= 7) ? exec->argument(6).toNumber(exec) : 0;
     194    t.month = JSC::toInt32(doubleArguments[1]);
     195    t.monthDay = (n >= 3) ? JSC::toInt32(doubleArguments[2]) : 1;
     196    t.hour = JSC::toInt32(doubleArguments[3]);
     197    t.minute = JSC::toInt32(doubleArguments[4]);
     198    t.second = JSC::toInt32(doubleArguments[5]);
     199    double ms = (n >= 7) ? doubleArguments[6] : 0;
    182200    return JSValue::encode(jsNumber(exec, timeClip(gregorianDateTimeToMS(exec, t, ms, true))));
    183201}
  • trunk/LayoutTests/ChangeLog

    r68346 r68347  
     12010-09-26  Mark Hahnenberg  <mhahnenb@gmail.com>
     2
     3        Reviewed by Oliver Hunt.
     4
     5        valueOf called in wrong order in atan2 and date constructors.
     6        https://bugs.webkit.org/show_bug.cgi?id=26978
     7
     8        Added regression test for the Date constructor issue.
     9
     10        * fast/js/date-constructor-expected.txt:
     11        * fast/js/script-tests/date-constructor.js:
     12        (year.valueOf):
     13        (month.valueOf):
     14        (date.valueOf):
     15        (hours.valueOf):
     16        (minutes.valueOf):
     17        (seconds.valueOf):
     18        (ms.valueOf):
     19
    1202010-09-26  Sheriff Bot  <webkit.review.bot@gmail.com>
    221
  • trunk/LayoutTests/fast/js/date-constructor-expected.txt

    r65201 r68347  
    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 testStr is "1234567"
     28PASS testStr is "1234567"
    2729PASS successfullyParsed is true
    2830
  • trunk/LayoutTests/fast/js/script-tests/date-constructor.js

    r65201 r68347  
    4141// shouldBe('new Date(new Date(1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111)).getTime() - timeZoneOffset', '-24085894227889');
    4242
     43// Regression test for Bug 26978 (https://bugs.webkit.org/show_bug.cgi?id=26978)
     44var testStr = "";
     45var year = { valueOf: function() { testStr += 1; return 2007; } };
     46var month = { valueOf: function() { testStr += 2; return 2; } };
     47var date = { valueOf: function() { testStr += 3; return 4; } };
     48var hours = { valueOf: function() { testStr += 4; return 13; } };
     49var minutes = { valueOf: function() { testStr += 5; return 50; } };
     50var seconds = { valueOf: function() { testStr += 6; return 0; } };
     51var ms = { valueOf: function() { testStr += 7; return 999; } };
     52
     53testStr = "";
     54new Date(year, month, date, hours, minutes, seconds, ms);
     55shouldBe('testStr', '\"1234567\"');
     56
     57testStr = "";
     58Date.UTC(year, month, date, hours, minutes, seconds, ms);
     59shouldBe('testStr', '\"1234567\"');
     60
    4361var successfullyParsed = true;
Note: See TracChangeset for help on using the changeset viewer.