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 // SET_DATE_LOCAL(this, t); | |
ulan
2012/03/08 08:12:42
Commented code here and below.
rossberg
2012/03/08 09:53:41
Done.
| |
675 if (!NUMBER_IS_NAN(t)) t = YearFromTime(t); | |
676 // SET_DATE_YEAR(this, t); | |
677 return t; | |
646 } | 678 } |
647 | 679 |
648 | 680 |
649 // ECMA 262 - 15.9.5.11 | 681 // ECMA 262 - 15.9.5.11 |
650 function DateGetUTCFullYear() { | 682 function DateGetUTCFullYear() { |
651 var t = DATE_VALUE(this); | 683 var t = DATE_VALUE(this); |
652 if (NUMBER_IS_NAN(t)) return t; | 684 if (NUMBER_IS_NAN(t)) return t; |
653 return YearFromTime(t); | 685 return YearFromTime(t); |
654 } | 686 } |
655 | 687 |
656 | 688 |
657 // ECMA 262 - 15.9.5.12 | 689 // ECMA 262 - 15.9.5.12 |
658 function DateGetMonth() { | 690 function DateGetMonth() { |
659 var t = DATE_VALUE(this); | 691 var t = DATE_MONTH(this); |
660 if (NUMBER_IS_NAN(t)) return t; | 692 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
661 return MonthFromTime(LocalTimeNoCheck(t)); | 693 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
694 return DATE_MONTH(this); | |
662 } | 695 } |
663 | 696 |
664 | 697 |
665 // ECMA 262 - 15.9.5.13 | 698 // ECMA 262 - 15.9.5.13 |
666 function DateGetUTCMonth() { | 699 function DateGetUTCMonth() { |
667 var t = DATE_VALUE(this); | 700 var t = DATE_VALUE(this); |
668 if (NUMBER_IS_NAN(t)) return t; | 701 if (NUMBER_IS_NAN(t)) return t; |
669 return MonthFromTime(t); | 702 return MonthFromTime(t); |
670 } | 703 } |
671 | 704 |
672 | 705 |
673 // ECMA 262 - 15.9.5.14 | 706 // ECMA 262 - 15.9.5.14 |
674 function DateGetDate() { | 707 function DateGetDate() { |
675 var t = DATE_VALUE(this); | 708 var t = DATE_DAY(this); |
676 if (NUMBER_IS_NAN(t)) return t; | 709 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
677 return DateFromTime(LocalTimeNoCheck(t)); | 710 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
711 return DATE_DAY(this); | |
678 } | 712 } |
679 | 713 |
680 | 714 |
681 // ECMA 262 - 15.9.5.15 | 715 // ECMA 262 - 15.9.5.15 |
682 function DateGetUTCDate() { | 716 function DateGetUTCDate() { |
683 var t = DATE_VALUE(this); | 717 var t = DATE_VALUE(this); |
684 return NAN_OR_DATE_FROM_TIME(t); | 718 return NAN_OR_DATE_FROM_TIME(t); |
685 } | 719 } |
686 | 720 |
687 | 721 |
688 // ECMA 262 - 15.9.5.16 | 722 // ECMA 262 - 15.9.5.16 |
689 function DateGetDay() { | 723 function DateGetDay() { |
690 var t = DATE_VALUE(this); | 724 var t = DATE_WEEKDAY(this); |
691 if (NUMBER_IS_NAN(t)) return t; | 725 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
692 return WeekDay(LocalTimeNoCheck(t)); | 726 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
727 return DATE_WEEKDAY(this); | |
693 } | 728 } |
694 | 729 |
695 | 730 |
696 // ECMA 262 - 15.9.5.17 | 731 // ECMA 262 - 15.9.5.17 |
697 function DateGetUTCDay() { | 732 function DateGetUTCDay() { |
698 var t = DATE_VALUE(this); | 733 var t = DATE_VALUE(this); |
699 if (NUMBER_IS_NAN(t)) return t; | 734 if (NUMBER_IS_NAN(t)) return t; |
700 return WeekDay(t); | 735 return WeekDay(t); |
701 } | 736 } |
702 | 737 |
703 | 738 |
704 // ECMA 262 - 15.9.5.18 | 739 // ECMA 262 - 15.9.5.18 |
705 function DateGetHours() { | 740 function DateGetHours() { |
706 var t = DATE_VALUE(this); | 741 var t = DATE_HOUR(this); |
707 if (NUMBER_IS_NAN(t)) return t; | 742 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
708 return HOUR_FROM_TIME(LocalTimeNoCheck(t)); | 743 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
744 return DATE_HOUR(this); | |
709 } | 745 } |
710 | 746 |
711 | 747 |
712 // ECMA 262 - 15.9.5.19 | 748 // ECMA 262 - 15.9.5.19 |
713 function DateGetUTCHours() { | 749 function DateGetUTCHours() { |
714 var t = DATE_VALUE(this); | 750 var t = DATE_VALUE(this); |
715 if (NUMBER_IS_NAN(t)) return t; | 751 if (NUMBER_IS_NAN(t)) return t; |
716 return HOUR_FROM_TIME(t); | 752 return HOUR_FROM_TIME(t); |
717 } | 753 } |
718 | 754 |
719 | 755 |
720 // ECMA 262 - 15.9.5.20 | 756 // ECMA 262 - 15.9.5.20 |
721 function DateGetMinutes() { | 757 function DateGetMinutes() { |
722 var t = DATE_VALUE(this); | 758 var t = DATE_MIN(this); |
723 if (NUMBER_IS_NAN(t)) return t; | 759 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
724 return MIN_FROM_TIME(LocalTimeNoCheck(t)); | 760 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
761 return DATE_MIN(this); | |
725 } | 762 } |
726 | 763 |
727 | 764 |
728 // ECMA 262 - 15.9.5.21 | 765 // ECMA 262 - 15.9.5.21 |
729 function DateGetUTCMinutes() { | 766 function DateGetUTCMinutes() { |
730 var t = DATE_VALUE(this); | 767 var t = DATE_VALUE(this); |
731 return NAN_OR_MIN_FROM_TIME(t); | 768 return NAN_OR_MIN_FROM_TIME(t); |
732 } | 769 } |
733 | 770 |
734 | 771 |
735 // ECMA 262 - 15.9.5.22 | 772 // ECMA 262 - 15.9.5.22 |
736 function DateGetSeconds() { | 773 function DateGetSeconds() { |
737 var t = DATE_VALUE(this); | 774 var t = DATE_SEC(this); |
738 if (NUMBER_IS_NAN(t)) return t; | 775 if (!IS_UNDEFINED(t) && DATE_LOCAL(this) === local_time_offset) return t; |
739 return SEC_FROM_TIME(LocalTimeNoCheck(t)); | 776 ResetDate(this, DATE_VALUE_UNCHECKED(this)); |
777 return DATE_SEC(this); | |
740 } | 778 } |
741 | 779 |
742 | 780 |
743 // ECMA 262 - 15.9.5.23 | 781 // ECMA 262 - 15.9.5.23 |
744 function DateGetUTCSeconds() { | 782 function DateGetUTCSeconds() { |
745 var t = DATE_VALUE(this); | 783 var t = DATE_VALUE(this); |
746 return NAN_OR_SEC_FROM_TIME(t); | 784 return NAN_OR_SEC_FROM_TIME(t); |
747 } | 785 } |
748 | 786 |
749 | 787 |
(...skipping 16 matching lines...) Expand all Loading... | |
766 function DateGetTimezoneOffset() { | 804 function DateGetTimezoneOffset() { |
767 var t = DATE_VALUE(this); | 805 var t = DATE_VALUE(this); |
768 if (NUMBER_IS_NAN(t)) return t; | 806 if (NUMBER_IS_NAN(t)) return t; |
769 return (t - LocalTimeNoCheck(t)) / msPerMinute; | 807 return (t - LocalTimeNoCheck(t)) / msPerMinute; |
770 } | 808 } |
771 | 809 |
772 | 810 |
773 // ECMA 262 - 15.9.5.27 | 811 // ECMA 262 - 15.9.5.27 |
774 function DateSetTime(ms) { | 812 function DateSetTime(ms) { |
775 if (!IS_DATE(this)) ThrowDateTypeError(); | 813 if (!IS_DATE(this)) ThrowDateTypeError(); |
776 return SET_DATE_VALUE(this, TimeClip(ToNumber(ms))); | 814 return ResetDate(this, TimeClip(ToNumber(ms))); |
777 } | 815 } |
778 | 816 |
779 | 817 |
780 // ECMA 262 - 15.9.5.28 | 818 // ECMA 262 - 15.9.5.28 |
781 function DateSetMilliseconds(ms) { | 819 function DateSetMilliseconds(ms) { |
782 var t = LocalTime(DATE_VALUE(this)); | 820 var t = LocalTime(DATE_VALUE(this)); |
783 ms = ToNumber(ms); | 821 ms = ToNumber(ms); |
784 var time = MakeTime(HOUR_FROM_TIME(t), | 822 var time = MakeTime(HOUR_FROM_TIME(t), |
785 MIN_FROM_TIME(t), | 823 MIN_FROM_TIME(t), |
786 SEC_FROM_TIME(t), | 824 SEC_FROM_TIME(t), |
787 ms); | 825 ms); |
788 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(DAY(t), time)))); | 826 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
789 } | 827 } |
790 | 828 |
791 | 829 |
792 // ECMA 262 - 15.9.5.29 | 830 // ECMA 262 - 15.9.5.29 |
793 function DateSetUTCMilliseconds(ms) { | 831 function DateSetUTCMilliseconds(ms) { |
794 var t = DATE_VALUE(this); | 832 var t = DATE_VALUE(this); |
795 ms = ToNumber(ms); | 833 ms = ToNumber(ms); |
796 var time = MakeTime(HOUR_FROM_TIME(t), | 834 var time = MakeTime(HOUR_FROM_TIME(t), |
797 MIN_FROM_TIME(t), | 835 MIN_FROM_TIME(t), |
798 SEC_FROM_TIME(t), | 836 SEC_FROM_TIME(t), |
799 ms); | 837 ms); |
800 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 838 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
801 } | 839 } |
802 | 840 |
803 | 841 |
804 // ECMA 262 - 15.9.5.30 | 842 // ECMA 262 - 15.9.5.30 |
805 function DateSetSeconds(sec, ms) { | 843 function DateSetSeconds(sec, ms) { |
806 var t = LocalTime(DATE_VALUE(this)); | 844 var t = LocalTime(DATE_VALUE(this)); |
807 sec = ToNumber(sec); | 845 sec = ToNumber(sec); |
808 ms = %_ArgumentsLength() < 2 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 846 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); | 847 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)))); | 848 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
811 } | 849 } |
812 | 850 |
813 | 851 |
814 // ECMA 262 - 15.9.5.31 | 852 // ECMA 262 - 15.9.5.31 |
815 function DateSetUTCSeconds(sec, ms) { | 853 function DateSetUTCSeconds(sec, ms) { |
816 var t = DATE_VALUE(this); | 854 var t = DATE_VALUE(this); |
817 sec = ToNumber(sec); | 855 sec = ToNumber(sec); |
818 ms = %_ArgumentsLength() < 2 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 856 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); | 857 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); |
820 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 858 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
821 } | 859 } |
822 | 860 |
823 | 861 |
824 // ECMA 262 - 15.9.5.33 | 862 // ECMA 262 - 15.9.5.33 |
825 function DateSetMinutes(min, sec, ms) { | 863 function DateSetMinutes(min, sec, ms) { |
826 var t = LocalTime(DATE_VALUE(this)); | 864 var t = LocalTime(DATE_VALUE(this)); |
827 min = ToNumber(min); | 865 min = ToNumber(min); |
828 var argc = %_ArgumentsLength(); | 866 var argc = %_ArgumentsLength(); |
829 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 867 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
830 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 868 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
831 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); | 869 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); |
832 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(DAY(t), time)))); | 870 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
833 } | 871 } |
834 | 872 |
835 | 873 |
836 // ECMA 262 - 15.9.5.34 | 874 // ECMA 262 - 15.9.5.34 |
837 function DateSetUTCMinutes(min, sec, ms) { | 875 function DateSetUTCMinutes(min, sec, ms) { |
838 var t = DATE_VALUE(this); | 876 var t = DATE_VALUE(this); |
839 min = ToNumber(min); | 877 min = ToNumber(min); |
840 var argc = %_ArgumentsLength(); | 878 var argc = %_ArgumentsLength(); |
841 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 879 sec = argc < 2 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
842 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 880 ms = argc < 3 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
843 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); | 881 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); |
844 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 882 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
845 } | 883 } |
846 | 884 |
847 | 885 |
848 // ECMA 262 - 15.9.5.35 | 886 // ECMA 262 - 15.9.5.35 |
849 function DateSetHours(hour, min, sec, ms) { | 887 function DateSetHours(hour, min, sec, ms) { |
850 var t = LocalTime(DATE_VALUE(this)); | 888 var t = LocalTime(DATE_VALUE(this)); |
851 hour = ToNumber(hour); | 889 hour = ToNumber(hour); |
852 var argc = %_ArgumentsLength(); | 890 var argc = %_ArgumentsLength(); |
853 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); | 891 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); |
854 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 892 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
855 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 893 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
856 var time = MakeTime(hour, min, sec, ms); | 894 var time = MakeTime(hour, min, sec, ms); |
857 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(DAY(t), time)))); | 895 return ResetDate(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
858 } | 896 } |
859 | 897 |
860 | 898 |
861 // ECMA 262 - 15.9.5.34 | 899 // ECMA 262 - 15.9.5.34 |
862 function DateSetUTCHours(hour, min, sec, ms) { | 900 function DateSetUTCHours(hour, min, sec, ms) { |
863 var t = DATE_VALUE(this); | 901 var t = DATE_VALUE(this); |
864 hour = ToNumber(hour); | 902 hour = ToNumber(hour); |
865 var argc = %_ArgumentsLength(); | 903 var argc = %_ArgumentsLength(); |
866 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); | 904 min = argc < 2 ? NAN_OR_MIN_FROM_TIME(t) : ToNumber(min); |
867 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); | 905 sec = argc < 3 ? NAN_OR_SEC_FROM_TIME(t) : ToNumber(sec); |
868 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); | 906 ms = argc < 4 ? NAN_OR_MS_FROM_TIME(t) : ToNumber(ms); |
869 var time = MakeTime(hour, min, sec, ms); | 907 var time = MakeTime(hour, min, sec, ms); |
870 return SET_DATE_VALUE(this, TimeClip(MakeDate(DAY(t), time))); | 908 return ResetDate(this, TimeClip(MakeDate(DAY(t), time))); |
871 } | 909 } |
872 | 910 |
873 | 911 |
874 // ECMA 262 - 15.9.5.36 | 912 // ECMA 262 - 15.9.5.36 |
875 function DateSetDate(date) { | 913 function DateSetDate(date) { |
876 var t = LocalTime(DATE_VALUE(this)); | 914 var t = LocalTime(DATE_VALUE(this)); |
877 date = ToNumber(date); | 915 date = ToNumber(date); |
878 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); | 916 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); |
879 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 917 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
880 } | 918 } |
881 | 919 |
882 | 920 |
883 // ECMA 262 - 15.9.5.37 | 921 // ECMA 262 - 15.9.5.37 |
884 function DateSetUTCDate(date) { | 922 function DateSetUTCDate(date) { |
885 var t = DATE_VALUE(this); | 923 var t = DATE_VALUE(this); |
886 date = ToNumber(date); | 924 date = ToNumber(date); |
887 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); | 925 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); |
888 return SET_DATE_VALUE(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 926 return ResetDate(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
889 } | 927 } |
890 | 928 |
891 | 929 |
892 // ECMA 262 - 15.9.5.38 | 930 // ECMA 262 - 15.9.5.38 |
893 function DateSetMonth(month, date) { | 931 function DateSetMonth(month, date) { |
894 var t = LocalTime(DATE_VALUE(this)); | 932 var t = LocalTime(DATE_VALUE(this)); |
895 month = ToNumber(month); | 933 month = ToNumber(month); |
896 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); | 934 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); |
897 var day = MakeDay(YearFromTime(t), month, date); | 935 var day = MakeDay(YearFromTime(t), month, date); |
898 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 936 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
899 } | 937 } |
900 | 938 |
901 | 939 |
902 // ECMA 262 - 15.9.5.39 | 940 // ECMA 262 - 15.9.5.39 |
903 function DateSetUTCMonth(month, date) { | 941 function DateSetUTCMonth(month, date) { |
904 var t = DATE_VALUE(this); | 942 var t = DATE_VALUE(this); |
905 month = ToNumber(month); | 943 month = ToNumber(month); |
906 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); | 944 date = %_ArgumentsLength() < 2 ? NAN_OR_DATE_FROM_TIME(t) : ToNumber(date); |
907 var day = MakeDay(YearFromTime(t), month, date); | 945 var day = MakeDay(YearFromTime(t), month, date); |
908 return SET_DATE_VALUE(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 946 return ResetDate(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
909 } | 947 } |
910 | 948 |
911 | 949 |
912 // ECMA 262 - 15.9.5.40 | 950 // ECMA 262 - 15.9.5.40 |
913 function DateSetFullYear(year, month, date) { | 951 function DateSetFullYear(year, month, date) { |
914 var t = DATE_VALUE(this); | 952 var t = DATE_VALUE(this); |
915 t = NUMBER_IS_NAN(t) ? 0 : LocalTimeNoCheck(t); | 953 t = NUMBER_IS_NAN(t) ? 0 : LocalTimeNoCheck(t); |
916 year = ToNumber(year); | 954 year = ToNumber(year); |
917 var argc = %_ArgumentsLength(); | 955 var argc = %_ArgumentsLength(); |
918 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); | 956 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); |
919 date = argc < 3 ? DateFromTime(t) : ToNumber(date); | 957 date = argc < 3 ? DateFromTime(t) : ToNumber(date); |
920 var day = MakeDay(year, month, date); | 958 var day = MakeDay(year, month, date); |
921 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 959 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
922 } | 960 } |
923 | 961 |
924 | 962 |
925 // ECMA 262 - 15.9.5.41 | 963 // ECMA 262 - 15.9.5.41 |
926 function DateSetUTCFullYear(year, month, date) { | 964 function DateSetUTCFullYear(year, month, date) { |
927 var t = DATE_VALUE(this); | 965 var t = DATE_VALUE(this); |
928 if (NUMBER_IS_NAN(t)) t = 0; | 966 if (NUMBER_IS_NAN(t)) t = 0; |
929 var argc = %_ArgumentsLength(); | 967 var argc = %_ArgumentsLength(); |
930 year = ToNumber(year); | 968 year = ToNumber(year); |
931 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); | 969 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); |
932 date = argc < 3 ? DateFromTime(t) : ToNumber(date); | 970 date = argc < 3 ? DateFromTime(t) : ToNumber(date); |
933 var day = MakeDay(year, month, date); | 971 var day = MakeDay(year, month, date); |
934 return SET_DATE_VALUE(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 972 return ResetDate(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
935 } | 973 } |
936 | 974 |
937 | 975 |
938 // ECMA 262 - 15.9.5.42 | 976 // ECMA 262 - 15.9.5.42 |
939 function DateToUTCString() { | 977 function DateToUTCString() { |
940 var t = DATE_VALUE(this); | 978 var t = DATE_VALUE(this); |
941 if (NUMBER_IS_NAN(t)) return kInvalidDate; | 979 if (NUMBER_IS_NAN(t)) return kInvalidDate; |
942 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT | 980 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT |
943 return WeekDays[WeekDay(t)] + ', ' | 981 return WeekDays[WeekDay(t)] + ', ' |
944 + TwoDigitString(DateFromTime(t)) + ' ' | 982 + TwoDigitString(DateFromTime(t)) + ' ' |
945 + Months[MonthFromTime(t)] + ' ' | 983 + Months[MonthFromTime(t)] + ' ' |
946 + YearFromTime(t) + ' ' | 984 + YearFromTime(t) + ' ' |
947 + TimeString(t) + ' GMT'; | 985 + TimeString(t) + ' GMT'; |
948 } | 986 } |
949 | 987 |
950 | 988 |
951 // ECMA 262 - B.2.4 | 989 // ECMA 262 - B.2.4 |
952 function DateGetYear() { | 990 function DateGetYear() { |
953 var t = DATE_VALUE(this); | 991 var t = DATE_VALUE(this); |
954 if (NUMBER_IS_NAN(t)) return $NaN; | 992 if (NUMBER_IS_NAN(t)) return $NaN; |
955 return YearFromTime(LocalTimeNoCheck(t)) - 1900; | 993 return YearFromTime(LocalTimeNoCheck(t)) - 1900; |
956 } | 994 } |
957 | 995 |
958 | 996 |
959 // ECMA 262 - B.2.5 | 997 // ECMA 262 - B.2.5 |
960 function DateSetYear(year) { | 998 function DateSetYear(year) { |
961 var t = LocalTime(DATE_VALUE(this)); | 999 var t = LocalTime(DATE_VALUE(this)); |
962 if (NUMBER_IS_NAN(t)) t = 0; | 1000 if (NUMBER_IS_NAN(t)) t = 0; |
963 year = ToNumber(year); | 1001 year = ToNumber(year); |
964 if (NUMBER_IS_NAN(year)) return SET_DATE_VALUE(this, $NaN); | 1002 if (NUMBER_IS_NAN(year)) return ResetDate(this, $NaN); |
965 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) | 1003 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) |
966 ? 1900 + TO_INTEGER(year) : year; | 1004 ? 1900 + TO_INTEGER(year) : year; |
967 var day = MakeDay(year, MonthFromTime(t), DateFromTime(t)); | 1005 var day = MakeDay(year, MonthFromTime(t), DateFromTime(t)); |
968 return SET_DATE_VALUE(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 1006 return ResetDate(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
969 } | 1007 } |
970 | 1008 |
971 | 1009 |
972 // ECMA 262 - B.2.6 | 1010 // ECMA 262 - B.2.6 |
973 // | 1011 // |
974 // Notice that this does not follow ECMA 262 completely. ECMA 262 | 1012 // Notice that this does not follow ECMA 262 completely. ECMA 262 |
975 // says that toGMTString should be the same Function object as | 1013 // says that toGMTString should be the same Function object as |
976 // toUTCString. JSC does not do this, so for compatibility we do not | 1014 // toUTCString. JSC does not do this, so for compatibility we do not |
977 // do that either. Instead, we create a new function whose name | 1015 // do that either. Instead, we create a new function whose name |
978 // property will return toGMTString. | 1016 // property will return toGMTString. |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1116 "toGMTString", DateToGMTString, | 1154 "toGMTString", DateToGMTString, |
1117 "toUTCString", DateToUTCString, | 1155 "toUTCString", DateToUTCString, |
1118 "getYear", DateGetYear, | 1156 "getYear", DateGetYear, |
1119 "setYear", DateSetYear, | 1157 "setYear", DateSetYear, |
1120 "toISOString", DateToISOString, | 1158 "toISOString", DateToISOString, |
1121 "toJSON", DateToJSON | 1159 "toJSON", DateToJSON |
1122 )); | 1160 )); |
1123 } | 1161 } |
1124 | 1162 |
1125 SetUpDate(); | 1163 SetUpDate(); |
OLD | NEW |