Changeset 68347 in webkit
- Timestamp:
- Sep 26, 2010 2:26:24 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r68339 r68347 1 2010-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 1 15 2010-09-25 Oliver Hunt <oliver@apple.com> 2 16 -
trunk/JavaScriptCore/runtime/DateConstructor.cpp
r60708 r68347 91 91 } 92 92 } 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]))) 100 109 value = NaN; 101 110 else { 102 111 GregorianDateTime t; 103 int year = args.at(0).toInt32(exec);112 int year = JSC::toInt32(doubleArguments[0]); 104 113 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]); 110 119 t.isDST = -1; 111 double ms = (numArgs >= 7) ? args.at(6).toNumber(exec): 0;120 double ms = (numArgs >= 7) ? doubleArguments[6] : 0; 112 121 value = gregorianDateTimeToMS(exec, t, ms, false); 113 122 } … … 161 170 static EncodedJSValue JSC_HOST_CALL dateUTC(ExecState* exec) 162 171 { 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 }; 163 181 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]))) 171 189 return JSValue::encode(jsNaN(exec)); 172 190 173 191 GregorianDateTime t; 174 int year = exec->argument(0).toInt32(exec);192 int year = JSC::toInt32(doubleArguments[0]); 175 193 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; 182 200 return JSValue::encode(jsNumber(exec, timeClip(gregorianDateTimeToMS(exec, t, ms, true)))); 183 201 } -
trunk/LayoutTests/ChangeLog
r68346 r68347 1 2010-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 1 20 2010-09-26 Sheriff Bot <webkit.review.bot@gmail.com> 2 21 -
trunk/LayoutTests/fast/js/date-constructor-expected.txt
r65201 r68347 25 25 PASS new Date(new Date(1111, 1, 1, 1, 1, 1, 1, 1)).getTime() - timeZoneOffset is -27104799538999 26 26 PASS new Date(new Date(1111, 1, 1, 1, 1, 1, 1, 1, 1)).getTime() - timeZoneOffset is -27104799538999 27 PASS testStr is "1234567" 28 PASS testStr is "1234567" 27 29 PASS successfullyParsed is true 28 30 -
trunk/LayoutTests/fast/js/script-tests/date-constructor.js
r65201 r68347 41 41 // shouldBe('new Date(new Date(1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111)).getTime() - timeZoneOffset', '-24085894227889'); 42 42 43 // Regression test for Bug 26978 (https://bugs.webkit.org/show_bug.cgi?id=26978) 44 var testStr = ""; 45 var year = { valueOf: function() { testStr += 1; return 2007; } }; 46 var month = { valueOf: function() { testStr += 2; return 2; } }; 47 var date = { valueOf: function() { testStr += 3; return 4; } }; 48 var hours = { valueOf: function() { testStr += 4; return 13; } }; 49 var minutes = { valueOf: function() { testStr += 5; return 50; } }; 50 var seconds = { valueOf: function() { testStr += 6; return 0; } }; 51 var ms = { valueOf: function() { testStr += 7; return 999; } }; 52 53 testStr = ""; 54 new Date(year, month, date, hours, minutes, seconds, ms); 55 shouldBe('testStr', '\"1234567\"'); 56 57 testStr = ""; 58 Date.UTC(year, month, date, hours, minutes, seconds, ms); 59 shouldBe('testStr', '\"1234567\"'); 60 43 61 var successfullyParsed = true;
Note: See TracChangeset
for help on using the changeset viewer.