Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(637)

Side by Side Diff: src/date.js

Issue 9572008: Implement date library functions in C++. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 minutes = argc > 4 ? ToNumber(minutes) : 0; 443 minutes = argc > 4 ? ToNumber(minutes) : 0;
445 seconds = argc > 5 ? ToNumber(seconds) : 0; 444 seconds = argc > 5 ? ToNumber(seconds) : 0;
446 ms = argc > 6 ? ToNumber(ms) : 0; 445 ms = argc > 6 ? ToNumber(ms) : 0;
447 year = (!NUMBER_IS_NAN(year) && 446 year = (!NUMBER_IS_NAN(year) &&
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 %_SetValueOf(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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 date = argc > 2 ? ToNumber(date) : 1; 584 date = argc > 2 ? ToNumber(date) : 1;
558 hours = argc > 3 ? ToNumber(hours) : 0; 585 hours = argc > 3 ? ToNumber(hours) : 0;
559 minutes = argc > 4 ? ToNumber(minutes) : 0; 586 minutes = argc > 4 ? ToNumber(minutes) : 0;
560 seconds = argc > 5 ? ToNumber(seconds) : 0; 587 seconds = argc > 5 ? ToNumber(seconds) : 0;
561 ms = argc > 6 ? ToNumber(ms) : 0; 588 ms = argc > 6 ? ToNumber(ms) : 0;
562 year = (!NUMBER_IS_NAN(year) && 589 year = (!NUMBER_IS_NAN(year) &&
563 0 <= TO_INTEGER(year) && 590 0 <= TO_INTEGER(year) &&
564 TO_INTEGER(year) <= 99) ? 1900 + TO_INTEGER(year) : year; 591 TO_INTEGER(year) <= 99) ? 1900 + TO_INTEGER(year) : year;
565 var day = MakeDay(year, month, date); 592 var day = MakeDay(year, month, date);
566 var time = MakeTime(hours, minutes, seconds, ms); 593 var time = MakeTime(hours, minutes, seconds, ms);
567 return %_SetValueOf(this, TimeClip(MakeDate(day, time))); 594 return TimeClip(MakeDate(day, time));
568 } 595 }
569 596
570 597
571 // Mozilla-specific extension. Returns the number of milliseconds 598 // Mozilla-specific extension. Returns the number of milliseconds
572 // elapsed since 1 January 1970 00:00:00 UTC. 599 // elapsed since 1 January 1970 00:00:00 UTC.
573 function DateNow() { 600 function DateNow() {
574 return %DateCurrentTime(); 601 return %DateCurrentTime();
575 } 602 }
576 603
577 604
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
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);
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
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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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 %_SetValueOf(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
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();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698