| 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 23 matching lines...) Expand all Loading... |
| 34 // ------------------------------------------------------------------- | 34 // ------------------------------------------------------------------- |
| 35 | 35 |
| 36 // This file contains date support implemented in JavaScript. | 36 // This file contains date support implemented in JavaScript. |
| 37 | 37 |
| 38 // Helper function to throw error. | 38 // Helper function to throw error. |
| 39 function ThrowDateTypeError() { | 39 function ThrowDateTypeError() { |
| 40 throw new $TypeError('this is not a Date object.'); | 40 throw new $TypeError('this is not a Date object.'); |
| 41 } | 41 } |
| 42 | 42 |
| 43 | 43 |
| 44 var timezone_cache_time = $NaN; | 44 var timezone_cache_time = NAN; |
| 45 var timezone_cache_timezone; | 45 var timezone_cache_timezone; |
| 46 | 46 |
| 47 function LocalTimezone(t) { | 47 function LocalTimezone(t) { |
| 48 if (NUMBER_IS_NAN(t)) return ""; | 48 if (NUMBER_IS_NAN(t)) return ""; |
| 49 if (t == timezone_cache_time) { | 49 if (t == timezone_cache_time) { |
| 50 return timezone_cache_timezone; | 50 return timezone_cache_timezone; |
| 51 } | 51 } |
| 52 var timezone = %DateLocalTimezone(t); | 52 var timezone = %DateLocalTimezone(t); |
| 53 timezone_cache_time = t; | 53 timezone_cache_time = t; |
| 54 timezone_cache_timezone = timezone; | 54 timezone_cache_timezone = timezone; |
| 55 return timezone; | 55 return timezone; |
| 56 } | 56 } |
| 57 | 57 |
| 58 | 58 |
| 59 function UTC(time) { | 59 function UTC(time) { |
| 60 if (NUMBER_IS_NAN(time)) return time; | 60 if (NUMBER_IS_NAN(time)) return time; |
| 61 // local_time_offset is needed before the call to DaylightSavingsOffset, | 61 // local_time_offset is needed before the call to DaylightSavingsOffset, |
| 62 // so it may be uninitialized. | 62 // so it may be uninitialized. |
| 63 return %DateToUTC(time); | 63 return %DateToUTC(time); |
| 64 } | 64 } |
| 65 | 65 |
| 66 | 66 |
| 67 // ECMA 262 - 15.9.1.11 | 67 // ECMA 262 - 15.9.1.11 |
| 68 function MakeTime(hour, min, sec, ms) { | 68 function MakeTime(hour, min, sec, ms) { |
| 69 if (!$isFinite(hour)) return $NaN; | 69 if (!$isFinite(hour)) return NAN; |
| 70 if (!$isFinite(min)) return $NaN; | 70 if (!$isFinite(min)) return NAN; |
| 71 if (!$isFinite(sec)) return $NaN; | 71 if (!$isFinite(sec)) return NAN; |
| 72 if (!$isFinite(ms)) return $NaN; | 72 if (!$isFinite(ms)) return NAN; |
| 73 return TO_INTEGER(hour) * msPerHour | 73 return TO_INTEGER(hour) * msPerHour |
| 74 + TO_INTEGER(min) * msPerMinute | 74 + TO_INTEGER(min) * msPerMinute |
| 75 + TO_INTEGER(sec) * msPerSecond | 75 + TO_INTEGER(sec) * msPerSecond |
| 76 + TO_INTEGER(ms); | 76 + TO_INTEGER(ms); |
| 77 } | 77 } |
| 78 | 78 |
| 79 | 79 |
| 80 // ECMA 262 - 15.9.1.12 | 80 // ECMA 262 - 15.9.1.12 |
| 81 function TimeInYear(year) { | 81 function TimeInYear(year) { |
| 82 return DaysInYear(year) * msPerDay; | 82 return DaysInYear(year) * msPerDay; |
| 83 } | 83 } |
| 84 | 84 |
| 85 | 85 |
| 86 // Compute number of days given a year, month, date. | 86 // Compute number of days given a year, month, date. |
| 87 // Note that month and date can lie outside the normal range. | 87 // Note that month and date can lie outside the normal range. |
| 88 // For example: | 88 // For example: |
| 89 // MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20) | 89 // MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20) |
| 90 // MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1) | 90 // MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1) |
| 91 // MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11) | 91 // MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11) |
| 92 function MakeDay(year, month, date) { | 92 function MakeDay(year, month, date) { |
| 93 if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return $NaN; | 93 if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return NAN; |
| 94 | 94 |
| 95 // Convert to integer and map -0 to 0. | 95 // Convert to integer and map -0 to 0. |
| 96 year = TO_INTEGER_MAP_MINUS_ZERO(year); | 96 year = TO_INTEGER_MAP_MINUS_ZERO(year); |
| 97 month = TO_INTEGER_MAP_MINUS_ZERO(month); | 97 month = TO_INTEGER_MAP_MINUS_ZERO(month); |
| 98 date = TO_INTEGER_MAP_MINUS_ZERO(date); | 98 date = TO_INTEGER_MAP_MINUS_ZERO(date); |
| 99 | 99 |
| 100 if (year < kMinYear || year > kMaxYear || | 100 if (year < kMinYear || year > kMaxYear || |
| 101 month < kMinMonth || month > kMaxMonth) { | 101 month < kMinMonth || month > kMaxMonth) { |
| 102 return $NaN; | 102 return NAN; |
| 103 } | 103 } |
| 104 | 104 |
| 105 // Now we rely on year and month being SMIs. | 105 // Now we rely on year and month being SMIs. |
| 106 return %DateMakeDay(year | 0, month | 0) + date - 1; | 106 return %DateMakeDay(year | 0, month | 0) + date - 1; |
| 107 } | 107 } |
| 108 | 108 |
| 109 | 109 |
| 110 // ECMA 262 - 15.9.1.13 | 110 // ECMA 262 - 15.9.1.13 |
| 111 function MakeDate(day, time) { | 111 function MakeDate(day, time) { |
| 112 var time = day * msPerDay + time; | 112 var time = day * msPerDay + time; |
| 113 // Some of our runtime funtions for computing UTC(time) rely on | 113 // Some of our runtime funtions for computing UTC(time) rely on |
| 114 // times not being significantly larger than MAX_TIME_MS. If there | 114 // times not being significantly larger than MAX_TIME_MS. If there |
| 115 // is no way that the time can be within range even after UTC | 115 // is no way that the time can be within range even after UTC |
| 116 // conversion we return NaN immediately instead of relying on | 116 // conversion we return NaN immediately instead of relying on |
| 117 // TimeClip to do it. | 117 // TimeClip to do it. |
| 118 if ($abs(time) > MAX_TIME_BEFORE_UTC) return $NaN; | 118 if ($abs(time) > MAX_TIME_BEFORE_UTC) return NAN; |
| 119 return time; | 119 return time; |
| 120 } | 120 } |
| 121 | 121 |
| 122 | 122 |
| 123 // ECMA 262 - 15.9.1.14 | 123 // ECMA 262 - 15.9.1.14 |
| 124 function TimeClip(time) { | 124 function TimeClip(time) { |
| 125 if (!$isFinite(time)) return $NaN; | 125 if (!$isFinite(time)) return NAN; |
| 126 if ($abs(time) > MAX_TIME_MS) return $NaN; | 126 if ($abs(time) > MAX_TIME_MS) return NAN; |
| 127 return TO_INTEGER(time); | 127 return TO_INTEGER(time); |
| 128 } | 128 } |
| 129 | 129 |
| 130 | 130 |
| 131 // The Date cache is used to limit the cost of parsing the same Date | 131 // The Date cache is used to limit the cost of parsing the same Date |
| 132 // strings over and over again. | 132 // strings over and over again. |
| 133 var Date_cache = { | 133 var Date_cache = { |
| 134 // Cached time value. | 134 // Cached time value. |
| 135 time: $NaN, | 135 time: NAN, |
| 136 // String input for which the cached time is valid. | 136 // String input for which the cached time is valid. |
| 137 string: null | 137 string: null |
| 138 }; | 138 }; |
| 139 | 139 |
| 140 | 140 |
| 141 function DateConstructor(year, month, date, hours, minutes, seconds, ms) { | 141 function DateConstructor(year, month, date, hours, minutes, seconds, ms) { |
| 142 if (!%_IsConstructCall()) { | 142 if (!%_IsConstructCall()) { |
| 143 // ECMA 262 - 15.9.2 | 143 // ECMA 262 - 15.9.2 |
| 144 return (new $Date()).toString(); | 144 return (new $Date()).toString(); |
| 145 } | 145 } |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 } | 262 } |
| 263 | 263 |
| 264 // ------------------------------------------------------------------- | 264 // ------------------------------------------------------------------- |
| 265 | 265 |
| 266 // Reused output buffer. Used when parsing date strings. | 266 // Reused output buffer. Used when parsing date strings. |
| 267 var parse_buffer = $Array(8); | 267 var parse_buffer = $Array(8); |
| 268 | 268 |
| 269 // ECMA 262 - 15.9.4.2 | 269 // ECMA 262 - 15.9.4.2 |
| 270 function DateParse(string) { | 270 function DateParse(string) { |
| 271 var arr = %DateParseString(ToString(string), parse_buffer); | 271 var arr = %DateParseString(ToString(string), parse_buffer); |
| 272 if (IS_NULL(arr)) return $NaN; | 272 if (IS_NULL(arr)) return NAN; |
| 273 | 273 |
| 274 var day = MakeDay(arr[0], arr[1], arr[2]); | 274 var day = MakeDay(arr[0], arr[1], arr[2]); |
| 275 var time = MakeTime(arr[3], arr[4], arr[5], arr[6]); | 275 var time = MakeTime(arr[3], arr[4], arr[5], arr[6]); |
| 276 var date = MakeDate(day, time); | 276 var date = MakeDate(day, time); |
| 277 | 277 |
| 278 if (IS_NULL(arr[7])) { | 278 if (IS_NULL(arr[7])) { |
| 279 return TimeClip(UTC(date)); | 279 return TimeClip(UTC(date)); |
| 280 } else { | 280 } else { |
| 281 return TimeClip(date - arr[7] * 1000); | 281 return TimeClip(date - arr[7] * 1000); |
| 282 } | 282 } |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 // ECMA 262 - B.2.4 | 664 // ECMA 262 - B.2.4 |
| 665 function DateGetYear() { | 665 function DateGetYear() { |
| 666 return LOCAL_YEAR(this) - 1900; | 666 return LOCAL_YEAR(this) - 1900; |
| 667 } | 667 } |
| 668 | 668 |
| 669 | 669 |
| 670 // ECMA 262 - B.2.5 | 670 // ECMA 262 - B.2.5 |
| 671 function DateSetYear(year) { | 671 function DateSetYear(year) { |
| 672 CHECK_DATE(this); | 672 CHECK_DATE(this); |
| 673 year = ToNumber(year); | 673 year = ToNumber(year); |
| 674 if (NUMBER_IS_NAN(year)) return SET_UTC_DATE_VALUE(this, $NaN); | 674 if (NUMBER_IS_NAN(year)) return SET_UTC_DATE_VALUE(this, NAN); |
| 675 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) | 675 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) |
| 676 ? 1900 + TO_INTEGER(year) : year; | 676 ? 1900 + TO_INTEGER(year) : year; |
| 677 var t = LOCAL_DATE_VALUE(this); | 677 var t = LOCAL_DATE_VALUE(this); |
| 678 var month, date, time; | 678 var month, date, time; |
| 679 if (NUMBER_IS_NAN(t)) { | 679 if (NUMBER_IS_NAN(t)) { |
| 680 month = 0; | 680 month = 0; |
| 681 date = 1; | 681 date = 1; |
| 682 time = 0; | 682 time = 0; |
| 683 } else { | 683 } else { |
| 684 month = LOCAL_MONTH(this); | 684 month = LOCAL_MONTH(this); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 var tv = DefaultNumber(o); | 739 var tv = DefaultNumber(o); |
| 740 if (IS_NUMBER(tv) && !NUMBER_IS_FINITE(tv)) { | 740 if (IS_NUMBER(tv) && !NUMBER_IS_FINITE(tv)) { |
| 741 return null; | 741 return null; |
| 742 } | 742 } |
| 743 return o.toISOString(); | 743 return o.toISOString(); |
| 744 } | 744 } |
| 745 | 745 |
| 746 | 746 |
| 747 function ResetDateCache() { | 747 function ResetDateCache() { |
| 748 // Reset the timezone cache: | 748 // Reset the timezone cache: |
| 749 timezone_cache_time = $NaN; | 749 timezone_cache_time = NAN; |
| 750 timezone_cache_timezone = undefined; | 750 timezone_cache_timezone = undefined; |
| 751 | 751 |
| 752 // Reset the date cache: | 752 // Reset the date cache: |
| 753 cache = Date_cache; | 753 cache = Date_cache; |
| 754 cache.time = $NaN; | 754 cache.time = NAN; |
| 755 cache.string = null; | 755 cache.string = null; |
| 756 } | 756 } |
| 757 | 757 |
| 758 | 758 |
| 759 // ------------------------------------------------------------------- | 759 // ------------------------------------------------------------------- |
| 760 | 760 |
| 761 function SetUpDate() { | 761 function SetUpDate() { |
| 762 %CheckIsBootstrapping(); | 762 %CheckIsBootstrapping(); |
| 763 | 763 |
| 764 %SetCode($Date, DateConstructor); | 764 %SetCode($Date, DateConstructor); |
| 765 %FunctionSetPrototype($Date, new $Date($NaN)); | 765 %FunctionSetPrototype($Date, new $Date(NAN)); |
| 766 | 766 |
| 767 // Set up non-enumerable properties of the Date object itself. | 767 // Set up non-enumerable properties of the Date object itself. |
| 768 InstallFunctions($Date, DONT_ENUM, $Array( | 768 InstallFunctions($Date, DONT_ENUM, $Array( |
| 769 "UTC", DateUTC, | 769 "UTC", DateUTC, |
| 770 "parse", DateParse, | 770 "parse", DateParse, |
| 771 "now", DateNow | 771 "now", DateNow |
| 772 )); | 772 )); |
| 773 | 773 |
| 774 // Set up non-enumerable constructor property of the Date prototype object. | 774 // Set up non-enumerable constructor property of the Date prototype object. |
| 775 %SetProperty($Date.prototype, "constructor", $Date, DONT_ENUM); | 775 %SetProperty($Date.prototype, "constructor", $Date, DONT_ENUM); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 "toGMTString", DateToGMTString, | 820 "toGMTString", DateToGMTString, |
| 821 "toUTCString", DateToUTCString, | 821 "toUTCString", DateToUTCString, |
| 822 "getYear", DateGetYear, | 822 "getYear", DateGetYear, |
| 823 "setYear", DateSetYear, | 823 "setYear", DateSetYear, |
| 824 "toISOString", DateToISOString, | 824 "toISOString", DateToISOString, |
| 825 "toJSON", DateToJSON | 825 "toJSON", DateToJSON |
| 826 )); | 826 )); |
| 827 } | 827 } |
| 828 | 828 |
| 829 SetUpDate(); | 829 SetUpDate(); |
| OLD | NEW |