OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 29 matching lines...) Expand all Loading... |
40 // changes to these properties. | 40 // changes to these properties. |
41 const $Date = global.Date; | 41 const $Date = global.Date; |
42 | 42 |
43 // Helper function to throw error. | 43 // Helper function to throw error. |
44 function ThrowDateTypeError() { | 44 function ThrowDateTypeError() { |
45 throw new $TypeError('this is not a Date object.'); | 45 throw new $TypeError('this is not a Date object.'); |
46 } | 46 } |
47 | 47 |
48 // ECMA 262 - 15.9.1.2 | 48 // ECMA 262 - 15.9.1.2 |
49 function Day(time) { | 49 function Day(time) { |
50 return FLOOR(time/msPerDay); | 50 return FLOOR(time / msPerDay); |
51 } | 51 } |
52 | 52 |
53 | 53 |
54 // ECMA 262 - 5.2 | 54 // ECMA 262 - 5.2 |
55 function Modulo(value, remainder) { | 55 function Modulo(value, remainder) { |
56 var mod = value % remainder; | 56 var mod = value % remainder; |
57 // Guard against returning -0. | 57 // Guard against returning -0. |
58 if (mod == 0) return 0; | 58 if (mod == 0) return 0; |
59 return mod >= 0 ? mod : mod + remainder; | 59 return mod >= 0 ? mod : mod + remainder; |
60 } | 60 } |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 | 421 |
422 // ECMA 262 - 15.9.1.14 | 422 // ECMA 262 - 15.9.1.14 |
423 function TimeClip(time) { | 423 function TimeClip(time) { |
424 if (!$isFinite(time)) return $NaN; | 424 if (!$isFinite(time)) return $NaN; |
425 if ($abs(time) > 8.64E15) return $NaN; | 425 if ($abs(time) > 8.64E15) return $NaN; |
426 return TO_INTEGER(time); | 426 return TO_INTEGER(time); |
427 } | 427 } |
428 | 428 |
429 | 429 |
430 %SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) { | 430 %SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) { |
431 if (%_IsConstructCall()) { | 431 if (!%_IsConstructCall()) { |
432 // ECMA 262 - 15.9.3 | 432 // ECMA 262 - 15.9.2 |
433 var argc = %_ArgumentsLength(); | 433 return (new $Date()).toString(); |
434 if (argc == 0) { | 434 } |
435 %_SetValueOf(this, %DateCurrentTime()); | 435 |
436 return; | 436 // ECMA 262 - 15.9.3 |
| 437 var argc = %_ArgumentsLength(); |
| 438 var value; |
| 439 if (argc == 0) { |
| 440 value = %DateCurrentTime(); |
| 441 |
| 442 } else if (argc == 1) { |
| 443 if (IS_NUMBER(year)) { |
| 444 value = TimeClip(year); |
| 445 } else { |
| 446 // According to ECMA 262, no hint should be given for this |
| 447 // conversion. However, ToPrimitive defaults to STRING_HINT for |
| 448 // Date objects which will lose precision when the Date |
| 449 // constructor is called with another Date object as its |
| 450 // argument. We therefore use NUMBER_HINT for the conversion, |
| 451 // which is the default for everything else than Date objects. |
| 452 // This makes us behave like KJS and SpiderMonkey. |
| 453 var time = ToPrimitive(year, NUMBER_HINT); |
| 454 value = IS_STRING(time) ? DateParse(time) : TimeClip(ToNumber(time)); |
437 } | 455 } |
438 if (argc == 1) { | 456 |
439 // According to ECMA 262, no hint should be given for this | 457 } else { |
440 // conversion. However, ToPrimitive defaults to String Hint | |
441 // for Date objects which will lose precision when the Date | |
442 // constructor is called with another Date object as its | |
443 // argument. We therefore use Number Hint for the conversion | |
444 // (which is the default for everything else than Date | |
445 // objects). This makes us behave like KJS and SpiderMonkey. | |
446 var time = ToPrimitive(year, NUMBER_HINT); | |
447 if (IS_STRING(time)) { | |
448 %_SetValueOf(this, DateParse(time)); | |
449 } else { | |
450 %_SetValueOf(this, TimeClip(ToNumber(time))); | |
451 } | |
452 return; | |
453 } | |
454 year = ToNumber(year); | 458 year = ToNumber(year); |
455 month = ToNumber(month); | 459 month = ToNumber(month); |
456 date = argc > 2 ? ToNumber(date) : 1; | 460 date = argc > 2 ? ToNumber(date) : 1; |
457 hours = argc > 3 ? ToNumber(hours) : 0; | 461 hours = argc > 3 ? ToNumber(hours) : 0; |
458 minutes = argc > 4 ? ToNumber(minutes) : 0; | 462 minutes = argc > 4 ? ToNumber(minutes) : 0; |
459 seconds = argc > 5 ? ToNumber(seconds) : 0; | 463 seconds = argc > 5 ? ToNumber(seconds) : 0; |
460 ms = argc > 6 ? ToNumber(ms) : 0; | 464 ms = argc > 6 ? ToNumber(ms) : 0; |
461 year = (!NUMBER_IS_NAN(year) && 0 <= TO_INTEGER(year) && TO_INTEGER(year) <=
99) | 465 year = (!NUMBER_IS_NAN(year) && 0 <= TO_INTEGER(year) && TO_INTEGER(year) <=
99) |
462 ? 1900 + TO_INTEGER(year) : year; | 466 ? 1900 + TO_INTEGER(year) : year; |
463 var day = MakeDay(year, month, date); | 467 var day = MakeDay(year, month, date); |
464 var time = MakeTime(hours, minutes, seconds, ms); | 468 var time = MakeTime(hours, minutes, seconds, ms); |
465 %_SetValueOf(this, TimeClip(UTC(MakeDate(day, time)))); | 469 value = TimeClip(UTC(MakeDate(day, time))); |
466 } else { | |
467 // ECMA 262 - 15.9.2 | |
468 return (new $Date()).toString(); | |
469 } | 470 } |
| 471 %_SetValueOf(this, value); |
470 }); | 472 }); |
471 | 473 |
472 | 474 |
473 // Helper functions. | 475 // Helper functions. |
474 function GetTimeFrom(aDate) { | 476 function GetTimeFrom(aDate) { |
475 return DATE_VALUE(aDate); | 477 return DATE_VALUE(aDate); |
476 } | 478 } |
477 | 479 |
478 | 480 |
479 function GetMillisecondsFrom(aDate) { | 481 function GetMillisecondsFrom(aDate) { |
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 "toGMTString", DateToGMTString, | 1130 "toGMTString", DateToGMTString, |
1129 "toUTCString", DateToUTCString, | 1131 "toUTCString", DateToUTCString, |
1130 "getYear", DateGetYear, | 1132 "getYear", DateGetYear, |
1131 "setYear", DateSetYear, | 1133 "setYear", DateSetYear, |
1132 "toISOString", DateToISOString, | 1134 "toISOString", DateToISOString, |
1133 "toJSON", DateToJSON | 1135 "toJSON", DateToJSON |
1134 )); | 1136 )); |
1135 } | 1137 } |
1136 | 1138 |
1137 SetupDate(); | 1139 SetupDate(); |
OLD | NEW |