| 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 |