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 var $Date = global.Date; | 40 var $Date = global.Date; |
41 | 41 |
42 // Helper function to throw error. | 42 // Helper function to throw error. |
43 function ThrowDateTypeError() { | 43 function ThrowDateTypeError() { |
44 throw new $TypeError('this is not a Date object.'); | 44 throw new $TypeError('this is not a Date object.'); |
45 } | 45 } |
46 | 46 |
47 // ECMA 262 - 5.2 | 47 // ECMA 262 - 5.2 |
48 function Modulo(value, remainder) { | 48 function Modulo(value, remainder) { |
49 var mod = value % remainder; | 49 var mod = value % remainder; |
50 // Guard against returning -0. | 50 // All uses of this function for dates should produce a Smi. |
51 if (mod == 0) return 0; | 51 return (mod >= 0 ? mod : mod + remainder) | 0; |
52 return mod >= 0 ? mod : mod + remainder; | |
53 } | 52 } |
54 | 53 |
55 | 54 |
56 function TimeWithinDay(time) { | 55 function TimeWithinDay(time) { |
57 return Modulo(time, msPerDay); | 56 return Modulo(time, msPerDay); |
58 } | 57 } |
59 | 58 |
60 | 59 |
61 // ECMA 262 - 15.9.1.3 | 60 // ECMA 262 - 15.9.1.3 |
62 function DaysInYear(year) { | 61 function DaysInYear(year) { |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 0 <= TO_INTEGER(year) && | 447 0 <= TO_INTEGER(year) && |
449 TO_INTEGER(year) <= 99) ? 1900 + TO_INTEGER(year) : year; | 448 TO_INTEGER(year) <= 99) ? 1900 + TO_INTEGER(year) : year; |
450 var day = MakeDay(year, month, date); | 449 var day = MakeDay(year, month, date); |
451 var time = MakeTime(hours, minutes, seconds, ms); | 450 var time = MakeTime(hours, minutes, seconds, ms); |
452 value = TimeClip(UTC(MakeDate(day, time))); | 451 value = TimeClip(UTC(MakeDate(day, time))); |
453 } | 452 } |
454 SET_DATE_VALUE(this, value); | 453 SET_DATE_VALUE(this, value); |
455 }); | 454 }); |
456 | 455 |
457 | 456 |
| 457 function ResetDate(date, time) { |
| 458 SET_DATE_VALUE(date, time); |
| 459 // Cache aggressively in case of a reset - we will typically use most fields. |
| 460 if (NUMBER_IS_NAN(time)) { |
| 461 SET_DATE_LOCAL(date, time); |
| 462 SET_DATE_YEAR(date, time); |
| 463 SET_DATE_MONTH(date, time); |
| 464 SET_DATE_DAY(date, time); |
| 465 SET_DATE_HOUR(date, time); |
| 466 SET_DATE_MIN(date, time); |
| 467 SET_DATE_SEC(date, time); |
| 468 SET_DATE_WEEKDAY(date, time); |
| 469 } else { |
| 470 var local = LocalTimeNoCheck(time); |
| 471 SET_DATE_LOCAL(date, local_time_offset); |
| 472 SET_DATE_YEAR(date, YearFromTime(local)); |
| 473 SET_DATE_MONTH(date, MonthFromTime(local)); |
| 474 SET_DATE_DAY(date, DateFromTime(local)); |
| 475 SET_DATE_HOUR(date, HOUR_FROM_TIME(local)); |
| 476 SET_DATE_MIN(date, MIN_FROM_TIME(local)); |
| 477 SET_DATE_SEC(date, SEC_FROM_TIME(local)); |
| 478 SET_DATE_WEEKDAY(date, WeekDay(local)); |
| 479 } |
| 480 |
| 481 return time; |
| 482 } |
| 483 |
| 484 |
458 %FunctionSetPrototype($Date, new $Date($NaN)); | 485 %FunctionSetPrototype($Date, new $Date($NaN)); |
459 | 486 |
460 | 487 |
461 var WeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; | 488 var WeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; |
462 var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', | 489 var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', |
463 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; | 490 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; |
464 | 491 |
465 | 492 |
466 function TwoDigitString(value) { | 493 function TwoDigitString(value) { |
467 return value < 10 ? "0" + value : "" + value; | 494 return value < 10 ? "0" + value : "" + value; |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 | 658 |
632 | 659 |
633 // ECMA 262 - 15.9.5.9 | 660 // ECMA 262 - 15.9.5.9 |
634 function DateGetTime() { | 661 function DateGetTime() { |
635 return DATE_VALUE(this); | 662 return DATE_VALUE(this); |
636 } | 663 } |
637 | 664 |
638 | 665 |
639 // ECMA 262 - 15.9.5.10 | 666 // ECMA 262 - 15.9.5.10 |
640 function DateGetFullYear() { | 667 function DateGetFullYear() { |
641 var t = DATE_VALUE(this); | 668 var t = DATE_YEAR(this); |
642 if (NUMBER_IS_NAN(t)) return t; | 669 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
| 670 t = DATE_VALUE_UNCHECKED(this); |
643 var cache = Date_cache; | 671 var cache = Date_cache; |
644 if (cache.time === t) return cache.year; | 672 if (cache.time === t) return cache.year; |
645 return YearFromTime(LocalTimeNoCheck(t)); | 673 t = LocalTimeNoCheck(t); |
| 674 if (!NUMBER_IS_NAN(t)) t = YearFromTime(t); |
| 675 return t; |
646 } | 676 } |
647 | 677 |
648 | 678 |
649 // ECMA 262 - 15.9.5.11 | 679 // ECMA 262 - 15.9.5.11 |
650 function DateGetUTCFullYear() { | 680 function DateGetUTCFullYear() { |
651 var t = DATE_VALUE(this); | 681 var t = DATE_VALUE(this); |
652 if (NUMBER_IS_NAN(t)) return t; | 682 if (NUMBER_IS_NAN(t)) return t; |
653 return YearFromTime(t); | 683 return YearFromTime(t); |
654 } | 684 } |
655 | 685 |
656 | 686 |
657 // ECMA 262 - 15.9.5.12 | 687 // ECMA 262 - 15.9.5.12 |
658 function DateGetMonth() { | 688 function DateGetMonth() { |
659 var t = DATE_VALUE(this); | 689 var t = DATE_MONTH(this); |
660 if (NUMBER_IS_NAN(t)) return t; | 690 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
661 return MonthFromTime(LocalTimeNoCheck(t)); | 691 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
| 692 return DATE_MONTH(this); |
662 } | 693 } |
663 | 694 |
664 | 695 |
665 // ECMA 262 - 15.9.5.13 | 696 // ECMA 262 - 15.9.5.13 |
666 function DateGetUTCMonth() { | 697 function DateGetUTCMonth() { |
667 var t = DATE_VALUE(this); | 698 var t = DATE_VALUE(this); |
668 if (NUMBER_IS_NAN(t)) return t; | 699 if (NUMBER_IS_NAN(t)) return t; |
669 return MonthFromTime(t); | 700 return MonthFromTime(t); |
670 } | 701 } |
671 | 702 |
672 | 703 |
673 // ECMA 262 - 15.9.5.14 | 704 // ECMA 262 - 15.9.5.14 |
674 function DateGetDate() { | 705 function DateGetDate() { |
675 var t = DATE_VALUE(this); | 706 var t = DATE_DAY(this); |
676 if (NUMBER_IS_NAN(t)) return t; | 707 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
677 return DateFromTime(LocalTimeNoCheck(t)); | 708 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
| 709 return DATE_DAY(this); |
678 } | 710 } |
679 | 711 |
680 | 712 |
681 // ECMA 262 - 15.9.5.15 | 713 // ECMA 262 - 15.9.5.15 |
682 function DateGetUTCDate() { | 714 function DateGetUTCDate() { |
683 var t = DATE_VALUE(this); | 715 var t = DATE_VALUE(this); |
684 return NAN_OR_DATE_FROM_TIME(t); | 716 return NAN_OR_DATE_FROM_TIME(t); |
685 } | 717 } |
686 | 718 |
687 | 719 |
688 // ECMA 262 - 15.9.5.16 | 720 // ECMA 262 - 15.9.5.16 |
689 function DateGetDay() { | 721 function DateGetDay() { |
690 var t = DATE_VALUE(this); | 722 var t = DATE_WEEKDAY(this); |
691 if (NUMBER_IS_NAN(t)) return t; | 723 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
692 return WeekDay(LocalTimeNoCheck(t)); | 724 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
| 725 return DATE_WEEKDAY(this); |
693 } | 726 } |
694 | 727 |
695 | 728 |
696 // ECMA 262 - 15.9.5.17 | 729 // ECMA 262 - 15.9.5.17 |
697 function DateGetUTCDay() { | 730 function DateGetUTCDay() { |
698 var t = DATE_VALUE(this); | 731 var t = DATE_VALUE(this); |
699 if (NUMBER_IS_NAN(t)) return t; | 732 if (NUMBER_IS_NAN(t)) return t; |
700 return WeekDay(t); | 733 return WeekDay(t); |
701 } | 734 } |
702 | 735 |
703 | 736 |
704 // ECMA 262 - 15.9.5.18 | 737 // ECMA 262 - 15.9.5.18 |
705 function DateGetHours() { | 738 function DateGetHours() { |
706 var t = DATE_VALUE(this); | 739 var t = DATE_HOUR(this); |
707 if (NUMBER_IS_NAN(t)) return t; | 740 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
708 return HOUR_FROM_TIME(LocalTimeNoCheck(t)); | 741 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
| 742 return DATE_HOUR(this); |
709 } | 743 } |
710 | 744 |
711 | 745 |
712 // ECMA 262 - 15.9.5.19 | 746 // ECMA 262 - 15.9.5.19 |
713 function DateGetUTCHours() { | 747 function DateGetUTCHours() { |
714 var t = DATE_VALUE(this); | 748 var t = DATE_VALUE(this); |
715 if (NUMBER_IS_NAN(t)) return t; | 749 if (NUMBER_IS_NAN(t)) return t; |
716 return HOUR_FROM_TIME(t); | 750 return HOUR_FROM_TIME(t); |
717 } | 751 } |
718 | 752 |
719 | 753 |
720 // ECMA 262 - 15.9.5.20 | 754 // ECMA 262 - 15.9.5.20 |
721 function DateGetMinutes() { | 755 function DateGetMinutes() { |
722 var t = DATE_VALUE(this); | 756 var t = DATE_MIN(this); |
723 if (NUMBER_IS_NAN(t)) return t; | 757 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
724 return MIN_FROM_TIME(LocalTimeNoCheck(t)); | 758 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
| 759 return DATE_MIN(this); |
725 } | 760 } |
726 | 761 |
727 | 762 |
728 // ECMA 262 - 15.9.5.21 | 763 // ECMA 262 - 15.9.5.21 |
729 function DateGetUTCMinutes() { | 764 function DateGetUTCMinutes() { |
730 var t = DATE_VALUE(this); | 765 var t = DATE_VALUE(this); |
731 return NAN_OR_MIN_FROM_TIME(t); | 766 return NAN_OR_MIN_FROM_TIME(t); |
732 } | 767 } |
733 | 768 |
734 | 769 |
735 // ECMA 262 - 15.9.5.22 | 770 // ECMA 262 - 15.9.5.22 |
736 function DateGetSeconds() { | 771 function DateGetSeconds() { |
737 var t = DATE_VALUE(this); | 772 var t = DATE_SEC(this); |
738 if (NUMBER_IS_NAN(t)) return t; | 773 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
739 return SEC_FROM_TIME(LocalTimeNoCheck(t)); | 774 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
| 775 return DATE_SEC(this); |
740 } | 776 } |
741 | 777 |
742 | 778 |
743 // ECMA 262 - 15.9.5.23 | 779 // ECMA 262 - 15.9.5.23 |
744 function DateGetUTCSeconds() { | 780 function DateGetUTCSeconds() { |
745 var t = DATE_VALUE(this); | 781 var t = DATE_VALUE(this); |
746 return NAN_OR_SEC_FROM_TIME(t); | 782 return NAN_OR_SEC_FROM_TIME(t); |
747 } | 783 } |
748 | 784 |
749 | 785 |
(...skipping 16 matching lines...) Expand all Loading... |
766 function DateGetTimezoneOffset() { | 802 function DateGetTimezoneOffset() { |
767 var t = DATE_VALUE(this); | 803 var t = DATE_VALUE(this); |
768 if (NUMBER_IS_NAN(t)) return t; | 804 if (NUMBER_IS_NAN(t)) return t; |
769 return (t - LocalTimeNoCheck(t)) / msPerMinute; | 805 return (t - LocalTimeNoCheck(t)) / msPerMinute; |
770 } | 806 } |
771 | 807 |
772 | 808 |
773 // ECMA 262 - 15.9.5.27 | 809 // ECMA 262 - 15.9.5.27 |
774 function DateSetTime(ms) { | 810 function DateSetTime(ms) { |
775 if (!IS_DATE(this)) ThrowDateTypeError(); | 811 if (!IS_DATE(this)) ThrowDateTypeError(); |
776 return SET_DATE_VALUE(this, TimeClip(ToNumber(ms))); | 812 return ResetDate(this, TimeClip(ToNumber(ms))); |
777 } | 813 } |
778 | 814 |
779 | 815 |
780 // ECMA 262 - 15.9.5.28 | 816 // ECMA 262 - 15.9.5.28 |
781 function DateSetMilliseconds(ms) { | 817 function DateSetMilliseconds(ms) { |
782 var t = LocalTime(DATE_VALUE(this)); | 818 var t = LocalTime(DATE_VALUE(this)); |
783 ms = ToNumber(ms); | 819 ms = ToNumber(ms); |
784 var time = MakeTime(HOUR_FROM_TIME(t), | 820 var time = MakeTime(HOUR_FROM_TIME(t), |
785 MIN_FROM_TIME(t), | 821 MIN_FROM_TIME(t), |
786 SEC_FROM_TIME(t), | 822 SEC_FROM_TIME(t), |
787 ms); | 823 ms); |
788 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(DAY(t), time)))); | 824 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
789 } | 825 } |
790 | 826 |
791 | 827 |
792 // ECMA 262 - 15.9.5.29 | 828 // ECMA 262 - 15.9.5.29 |
793 function DateSetUTCMilliseconds(ms) { | 829 function DateSetUTCMilliseconds(ms) { |
794 var t = DATE_VALUE(this); | 830 var t = DATE_VALUE(this); |
795 ms = ToNumber(ms); | 831 ms = ToNumber(ms); |
796 var time = MakeTime(HOUR_FROM_TIME(t), | 832 var time = MakeTime(HOUR_FROM_TIME(t), |
797 MIN_FROM_TIME(t), | 833 MIN_FROM_TIME(t), |
798 SEC_FROM_TIME(t), | 834 SEC_FROM_TIME(t), |
799 ms); | 835 ms); |
800 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 836 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
801 } | 837 } |
802 | 838 |
803 | 839 |
804 // ECMA 262 - 15.9.5.30 | 840 // ECMA 262 - 15.9.5.30 |
805 function DateSetSeconds(sec, ms) { | 841 function DateSetSeconds(sec, ms) { |
806 var t = LocalTime(DATE_VALUE(this)); | 842 var t = LocalTime(DATE_VALUE(this)); |
807 sec = ToNumber(sec); | 843 sec = ToNumber(sec); |
808 ms = %_ArgumentsLength() < 2 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 844 ms = %_ArgumentsLength() < 2 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
809 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); | 845 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); |
810 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(DAY(t), time)))); | 846 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
811 } | 847 } |
812 | 848 |
813 | 849 |
814 // ECMA 262 - 15.9.5.31 | 850 // ECMA 262 - 15.9.5.31 |
815 function DateSetUTCSeconds(sec, ms) { | 851 function DateSetUTCSeconds(sec, ms) { |
816 var t = DATE_VALUE(this); | 852 var t = DATE_VALUE(this); |
817 sec = ToNumber(sec); | 853 sec = ToNumber(sec); |
818 ms = %_ArgumentsLength() < 2 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 854 ms = %_ArgumentsLength() < 2 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
819 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); | 855 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); |
820 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 856 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
821 } | 857 } |
822 | 858 |
823 | 859 |
824 // ECMA 262 - 15.9.5.33 | 860 // ECMA 262 - 15.9.5.33 |
825 function DateSetMinutes(min, sec, ms) { | 861 function DateSetMinutes(min, sec, ms) { |
826 var t = LocalTime(DATE_VALUE(this)); | 862 var t = LocalTime(DATE_VALUE(this)); |
827 min = ToNumber(min); | 863 min = ToNumber(min); |
828 var argc = %_ArgumentsLength(); | 864 var argc = %_ArgumentsLength(); |
829 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 865 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
830 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 866 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
831 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); | 867 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); |
832 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(DAY(t), time)))); | 868 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
833 } | 869 } |
834 | 870 |
835 | 871 |
836 // ECMA 262 - 15.9.5.34 | 872 // ECMA 262 - 15.9.5.34 |
837 function DateSetUTCMinutes(min, sec, ms) { | 873 function DateSetUTCMinutes(min, sec, ms) { |
838 var t = DATE_VALUE(this); | 874 var t = DATE_VALUE(this); |
839 min = ToNumber(min); | 875 min = ToNumber(min); |
840 var argc = %_ArgumentsLength(); | 876 var argc = %_ArgumentsLength(); |
841 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 877 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
842 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 878 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
843 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); | 879 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); |
844 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 880 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
845 } | 881 } |
846 | 882 |
847 | 883 |
848 // ECMA 262 - 15.9.5.35 | 884 // ECMA 262 - 15.9.5.35 |
849 function DateSetHours(hour, min, sec, ms) { | 885 function DateSetHours(hour, min, sec, ms) { |
850 var t = LocalTime(DATE_VALUE(this)); | 886 var t = LocalTime(DATE_VALUE(this)); |
851 hour = ToNumber(hour); | 887 hour = ToNumber(hour); |
852 var argc = %_ArgumentsLength(); | 888 var argc = %_ArgumentsLength(); |
853 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); | 889 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); |
854 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 890 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
855 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 891 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
856 var time = MakeTime(hour, min, sec, ms); | 892 var time = MakeTime(hour, min, sec, ms); |
857 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(DAY(t), time)))); | 893 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
858 } | 894 } |
859 | 895 |
860 | 896 |
861 // ECMA 262 - 15.9.5.34 | 897 // ECMA 262 - 15.9.5.34 |
862 function DateSetUTCHours(hour, min, sec, ms) { | 898 function DateSetUTCHours(hour, min, sec, ms) { |
863 var t = DATE_VALUE(this); | 899 var t = DATE_VALUE(this); |
864 hour = ToNumber(hour); | 900 hour = ToNumber(hour); |
865 var argc = %_ArgumentsLength(); | 901 var argc = %_ArgumentsLength(); |
866 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); | 902 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); |
867 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 903 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
868 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 904 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
869 var time = MakeTime(hour, min, sec, ms); | 905 var time = MakeTime(hour, min, sec, ms); |
870 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 906 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
871 } | 907 } |
872 | 908 |
873 | 909 |
874 // ECMA 262 - 15.9.5.36 | 910 // ECMA 262 - 15.9.5.36 |
875 function DateSetDate(date) { | 911 function DateSetDate(date) { |
876 var t = LocalTime(DATE_VALUE(this)); | 912 var t = LocalTime(DATE_VALUE(this)); |
877 date = ToNumber(date); | 913 date = ToNumber(date); |
878 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); | 914 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); |
879 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 915 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
880 } | 916 } |
881 | 917 |
882 | 918 |
883 // ECMA 262 - 15.9.5.37 | 919 // ECMA 262 - 15.9.5.37 |
884 function DateSetUTCDate(date) { | 920 function DateSetUTCDate(date) { |
885 var t = DATE_VALUE(this); | 921 var t = DATE_VALUE(this); |
886 date = ToNumber(date); | 922 date = ToNumber(date); |
887 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); | 923 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); |
888 return SET_DATE_VALUE(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 924 return ResetDate(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
889 } | 925 } |
890 | 926 |
891 | 927 |
892 // ECMA 262 - 15.9.5.38 | 928 // ECMA 262 - 15.9.5.38 |
893 function DateSetMonth(month, date) { | 929 function DateSetMonth(month, date) { |
894 var t = LocalTime(DATE_VALUE(this)); | 930 var t = LocalTime(DATE_VALUE(this)); |
895 month = ToNumber(month); | 931 month = ToNumber(month); |
896 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); | 932 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); |
897 var day = MakeDay(YearFromTime(t), month, date); | 933 var day = MakeDay(YearFromTime(t), month, date); |
898 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 934 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
899 } | 935 } |
900 | 936 |
901 | 937 |
902 // ECMA 262 - 15.9.5.39 | 938 // ECMA 262 - 15.9.5.39 |
903 function DateSetUTCMonth(month, date) { | 939 function DateSetUTCMonth(month, date) { |
904 var t = DATE_VALUE(this); | 940 var t = DATE_VALUE(this); |
905 month = ToNumber(month); | 941 month = ToNumber(month); |
906 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); | 942 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); |
907 var day = MakeDay(YearFromTime(t), month, date); | 943 var day = MakeDay(YearFromTime(t), month, date); |
908 return SET_DATE_VALUE(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 944 return ResetDate(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
909 } | 945 } |
910 | 946 |
911 | 947 |
912 // ECMA 262 - 15.9.5.40 | 948 // ECMA 262 - 15.9.5.40 |
913 function DateSetFullYear(year, month, date) { | 949 function DateSetFullYear(year, month, date) { |
914 var t = DATE_VALUE(this); | 950 var t = DATE_VALUE(this); |
915 t = NUMBER_IS_NAN(t) ? 0 : LocalTimeNoCheck(t); | 951 t = NUMBER_IS_NAN(t) ? 0 : LocalTimeNoCheck(t); |
916 year = ToNumber(year); | 952 year = ToNumber(year); |
917 var argc = %_ArgumentsLength(); | 953 var argc = %_ArgumentsLength(); |
918 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); | 954 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); |
919 date = argc < 3 ? DateFromTime(t) : ToNumber(date); | 955 date = argc < 3 ? DateFromTime(t) : ToNumber(date); |
920 var day = MakeDay(year, month, date); | 956 var day = MakeDay(year, month, date); |
921 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 957 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
922 } | 958 } |
923 | 959 |
924 | 960 |
925 // ECMA 262 - 15.9.5.41 | 961 // ECMA 262 - 15.9.5.41 |
926 function DateSetUTCFullYear(year, month, date) { | 962 function DateSetUTCFullYear(year, month, date) { |
927 var t = DATE_VALUE(this); | 963 var t = DATE_VALUE(this); |
928 if (NUMBER_IS_NAN(t)) t = 0; | 964 if (NUMBER_IS_NAN(t)) t = 0; |
929 var argc = %_ArgumentsLength(); | 965 var argc = %_ArgumentsLength(); |
930 year = ToNumber(year); | 966 year = ToNumber(year); |
931 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); | 967 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); |
932 date = argc < 3 ? DateFromTime(t) : ToNumber(date); | 968 date = argc < 3 ? DateFromTime(t) : ToNumber(date); |
933 var day = MakeDay(year, month, date); | 969 var day = MakeDay(year, month, date); |
934 return SET_DATE_VALUE(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 970 return ResetDate(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
935 } | 971 } |
936 | 972 |
937 | 973 |
938 // ECMA 262 - 15.9.5.42 | 974 // ECMA 262 - 15.9.5.42 |
939 function DateToUTCString() { | 975 function DateToUTCString() { |
940 var t = DATE_VALUE(this); | 976 var t = DATE_VALUE(this); |
941 if (NUMBER_IS_NAN(t)) return kInvalidDate; | 977 if (NUMBER_IS_NAN(t)) return kInvalidDate; |
942 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT | 978 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT |
943 return WeekDays[WeekDay(t)] + ', ' | 979 return WeekDays[WeekDay(t)] + ', ' |
944 + TwoDigitString(DateFromTime(t)) + ' ' | 980 + TwoDigitString(DateFromTime(t)) + ' ' |
945 + Months[MonthFromTime(t)] + ' ' | 981 + Months[MonthFromTime(t)] + ' ' |
946 + YearFromTime(t) + ' ' | 982 + YearFromTime(t) + ' ' |
947 + TimeString(t) + ' GMT'; | 983 + TimeString(t) + ' GMT'; |
948 } | 984 } |
949 | 985 |
950 | 986 |
951 // ECMA 262 - B.2.4 | 987 // ECMA 262 - B.2.4 |
952 function DateGetYear() { | 988 function DateGetYear() { |
953 var t = DATE_VALUE(this); | 989 var t = DATE_VALUE(this); |
954 if (NUMBER_IS_NAN(t)) return $NaN; | 990 if (NUMBER_IS_NAN(t)) return $NaN; |
955 return YearFromTime(LocalTimeNoCheck(t)) - 1900; | 991 return YearFromTime(LocalTimeNoCheck(t)) - 1900; |
956 } | 992 } |
957 | 993 |
958 | 994 |
959 // ECMA 262 - B.2.5 | 995 // ECMA 262 - B.2.5 |
960 function DateSetYear(year) { | 996 function DateSetYear(year) { |
961 var t = LocalTime(DATE_VALUE(this)); | 997 var t = LocalTime(DATE_VALUE(this)); |
962 if (NUMBER_IS_NAN(t)) t = 0; | 998 if (NUMBER_IS_NAN(t)) t = 0; |
963 year = ToNumber(year); | 999 year = ToNumber(year); |
964 if (NUMBER_IS_NAN(year)) return SET_DATE_VALUE(this, $NaN); | 1000 if (NUMBER_IS_NAN(year)) return ResetDate(this, $NaN); |
965 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) | 1001 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) |
966 ? 1900 + TO_INTEGER(year) : year; | 1002 ? 1900 + TO_INTEGER(year) : year; |
967 var day = MakeDay(year, MonthFromTime(t), DateFromTime(t)); | 1003 var day = MakeDay(year, MonthFromTime(t), DateFromTime(t)); |
968 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 1004 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
969 } | 1005 } |
970 | 1006 |
971 | 1007 |
972 // ECMA 262 - B.2.6 | 1008 // ECMA 262 - B.2.6 |
973 // | 1009 // |
974 // Notice that this does not follow ECMA 262 completely. ECMA 262 | 1010 // Notice that this does not follow ECMA 262 completely. ECMA 262 |
975 // says that toGMTString should be the same Function object as | 1011 // says that toGMTString should be the same Function object as |
976 // toUTCString. JSC does not do this, so for compatibility we do not | 1012 // toUTCString. JSC does not do this, so for compatibility we do not |
977 // do that either. Instead, we create a new function whose name | 1013 // do that either. Instead, we create a new function whose name |
978 // property will return toGMTString. | 1014 // property will return toGMTString. |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1116 "toGMTString", DateToGMTString, | 1152 "toGMTString", DateToGMTString, |
1117 "toUTCString", DateToUTCString, | 1153 "toUTCString", DateToUTCString, |
1118 "getYear", DateGetYear, | 1154 "getYear", DateGetYear, |
1119 "setYear", DateSetYear, | 1155 "setYear", DateSetYear, |
1120 "toISOString", DateToISOString, | 1156 "toISOString", DateToISOString, |
1121 "toJSON", DateToJSON | 1157 "toJSON", DateToJSON |
1122 )); | 1158 )); |
1123 } | 1159 } |
1124 | 1160 |
1125 SetUpDate(); | 1161 SetUpDate(); |
OLD | NEW |