blob: c75d12c651c6d6cb2228ee78e89f70674ee19376 [file] [log] [blame]
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001// Copyright 2006-2008 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28
kasperl@chromium.org41044eb2008-10-06 08:24:46 +000029// This file relies on the fact that the following declarations have been made
30// in v8natives.js:
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +000031// var $isFinite = GlobalIsFinite;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +000032
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000033// -------------------------------------------------------------------
34
35// This file contains date support implemented in JavaScript.
36
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000037// Keep reference to original values of some global properties. This
38// has the added benefit that the code in this file is isolated from
39// changes to these properties.
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +000040var $Date = global.Date;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000041
kasperl@chromium.org2abc4502009-07-02 07:00:29 +000042// Helper function to throw error.
43function ThrowDateTypeError() {
44 throw new $TypeError('this is not a Date object.');
45}
46
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000047
48var timezone_cache_time = $NaN;
49var timezone_cache_timezone;
50
51function LocalTimezone(t) {
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +000052 if (NUMBER_IS_NAN(t)) return "";
ager@chromium.orgeadaf222009-06-16 09:43:10 +000053 if (t == timezone_cache_time) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000054 return timezone_cache_timezone;
55 }
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +000056 var timezone = %DateLocalTimezone(t);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000057 timezone_cache_time = t;
58 timezone_cache_timezone = timezone;
59 return timezone;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +000060}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000061
62
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000063function UTC(time) {
kasperl@chromium.org2abc4502009-07-02 07:00:29 +000064 if (NUMBER_IS_NAN(time)) return time;
whesse@chromium.org421a0f42010-03-30 15:09:23 +000065 // local_time_offset is needed before the call to DaylightSavingsOffset,
66 // so it may be uninitialized.
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +000067 return %DateToUTC(time);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +000068}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000069
70
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000071// ECMA 262 - 15.9.1.11
72function MakeTime(hour, min, sec, ms) {
73 if (!$isFinite(hour)) return $NaN;
74 if (!$isFinite(min)) return $NaN;
75 if (!$isFinite(sec)) return $NaN;
76 if (!$isFinite(ms)) return $NaN;
77 return TO_INTEGER(hour) * msPerHour
78 + TO_INTEGER(min) * msPerMinute
79 + TO_INTEGER(sec) * msPerSecond
80 + TO_INTEGER(ms);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +000081}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000082
83
84// ECMA 262 - 15.9.1.12
85function TimeInYear(year) {
86 return DaysInYear(year) * msPerDay;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +000087}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000088
89
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000090// Compute number of days given a year, month, date.
91// Note that month and date can lie outside the normal range.
92// For example:
93// MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20)
94// MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1)
95// MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11)
96function MakeDay(year, month, date) {
97 if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return $NaN;
98
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +000099 // Convert to integer and map -0 to 0.
100 year = TO_INTEGER_MAP_MINUS_ZERO(year);
101 month = TO_INTEGER_MAP_MINUS_ZERO(month);
102 date = TO_INTEGER_MAP_MINUS_ZERO(date);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000103
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000104 if (year < kMinYear || year > kMaxYear ||
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000105 month < kMinMonth || month > kMaxMonth) {
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000106 return $NaN;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000107 }
108
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000109 // Now we rely on year and month being SMIs.
yangguo@chromium.orgfb377212012-11-16 14:43:43 +0000110 return %DateMakeDay(year | 0, month | 0) + date - 1;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000111}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000112
113
114// ECMA 262 - 15.9.1.13
115function MakeDate(day, time) {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000116 var time = day * msPerDay + time;
117 // Some of our runtime funtions for computing UTC(time) rely on
118 // times not being significantly larger than MAX_TIME_MS. If there
119 // is no way that the time can be within range even after UTC
120 // conversion we return NaN immediately instead of relying on
121 // TimeClip to do it.
122 if ($abs(time) > MAX_TIME_BEFORE_UTC) return $NaN;
123 return time;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000124}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000125
126
127// ECMA 262 - 15.9.1.14
128function TimeClip(time) {
129 if (!$isFinite(time)) return $NaN;
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000130 if ($abs(time) > MAX_TIME_MS) return $NaN;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000131 return TO_INTEGER(time);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000132}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000133
134
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000135// The Date cache is used to limit the cost of parsing the same Date
136// strings over and over again.
137var Date_cache = {
138 // Cached time value.
139 time: $NaN,
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000140 // String input for which the cached time is valid.
141 string: null
142};
143
144
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000145%SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) {
kasperl@chromium.org86f77b72009-07-06 08:21:57 +0000146 if (!%_IsConstructCall()) {
147 // ECMA 262 - 15.9.2
148 return (new $Date()).toString();
149 }
150
151 // ECMA 262 - 15.9.3
152 var argc = %_ArgumentsLength();
153 var value;
154 if (argc == 0) {
155 value = %DateCurrentTime();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000156 SET_UTC_DATE_VALUE(this, value);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +0000157 } else if (argc == 1) {
158 if (IS_NUMBER(year)) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000159 value = year;
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000160 } else if (IS_STRING(year)) {
161 // Probe the Date cache. If we already have a time value for the
162 // given time, we re-use that instead of parsing the string again.
163 var cache = Date_cache;
164 if (cache.string === year) {
165 value = cache.time;
166 } else {
167 value = DateParse(year);
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +0000168 if (!NUMBER_IS_NAN(value)) {
169 cache.time = value;
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +0000170 cache.string = year;
171 }
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000172 }
173
kasperl@chromium.org86f77b72009-07-06 08:21:57 +0000174 } else {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000175 // According to ECMA 262, no hint should be given for this
kasperl@chromium.org86f77b72009-07-06 08:21:57 +0000176 // conversion. However, ToPrimitive defaults to STRING_HINT for
177 // Date objects which will lose precision when the Date
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000178 // constructor is called with another Date object as its
kasperl@chromium.org86f77b72009-07-06 08:21:57 +0000179 // argument. We therefore use NUMBER_HINT for the conversion,
180 // which is the default for everything else than Date objects.
181 // This makes us behave like KJS and SpiderMonkey.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000182 var time = ToPrimitive(year, NUMBER_HINT);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000183 value = IS_STRING(time) ? DateParse(time) : ToNumber(time);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000184 }
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000185 SET_UTC_DATE_VALUE(this, value);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +0000186 } else {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000187 year = ToNumber(year);
188 month = ToNumber(month);
189 date = argc > 2 ? ToNumber(date) : 1;
190 hours = argc > 3 ? ToNumber(hours) : 0;
191 minutes = argc > 4 ? ToNumber(minutes) : 0;
192 seconds = argc > 5 ? ToNumber(seconds) : 0;
193 ms = argc > 6 ? ToNumber(ms) : 0;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +0000194 year = (!NUMBER_IS_NAN(year) &&
195 0 <= TO_INTEGER(year) &&
196 TO_INTEGER(year) <= 99) ? 1900 + TO_INTEGER(year) : year;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000197 var day = MakeDay(year, month, date);
198 var time = MakeTime(hours, minutes, seconds, ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000199 value = MakeDate(day, time);
200 SET_LOCAL_DATE_VALUE(this, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000201 }
202});
203
204
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000205%FunctionSetPrototype($Date, new $Date($NaN));
206
207
208var WeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +0000209var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
210 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000211
212
213function TwoDigitString(value) {
214 return value < 10 ? "0" + value : "" + value;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000215}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000216
217
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000218function DateString(date) {
219 return WeekDays[LOCAL_WEEKDAY(date)] + ' '
220 + Months[LOCAL_MONTH(date)] + ' '
221 + TwoDigitString(LOCAL_DAY(date)) + ' '
222 + LOCAL_YEAR(date);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000223}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000224
225
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +0000226var LongWeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday',
227 'Thursday', 'Friday', 'Saturday'];
228var LongMonths = ['January', 'February', 'March', 'April', 'May', 'June',
229 'July', 'August', 'September', 'October', 'November', 'December'];
kasperl@chromium.org9bbf9682008-10-30 11:53:07 +0000230
231
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000232function LongDateString(date) {
233 return LongWeekDays[LOCAL_WEEKDAY(date)] + ', '
234 + LongMonths[LOCAL_MONTH(date)] + ' '
235 + TwoDigitString(LOCAL_DAY(date)) + ', '
236 + LOCAL_YEAR(date);
kasperl@chromium.org9bbf9682008-10-30 11:53:07 +0000237}
238
239
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000240function TimeString(date) {
241 return TwoDigitString(LOCAL_HOUR(date)) + ':'
242 + TwoDigitString(LOCAL_MIN(date)) + ':'
243 + TwoDigitString(LOCAL_SEC(date));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000244}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000245
246
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000247function TimeStringUTC(date) {
248 return TwoDigitString(UTC_HOUR(date)) + ':'
249 + TwoDigitString(UTC_MIN(date)) + ':'
250 + TwoDigitString(UTC_SEC(date));
251}
lrn@chromium.org25156de2010-04-06 13:10:27 +0000252
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000253
254function LocalTimezoneString(date) {
255 var timezone = LocalTimezone(UTC_DATE_VALUE(date));
256
257 var timezoneOffset = -TIMEZONE_OFFSET(date);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000258 var sign = (timezoneOffset >= 0) ? 1 : -1;
ager@chromium.org7c537e22008-10-16 08:43:32 +0000259 var hours = FLOOR((sign * timezoneOffset)/60);
260 var min = FLOOR((sign * timezoneOffset)%60);
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +0000261 var gmt = ' GMT' + ((sign == 1) ? '+' : '-') +
262 TwoDigitString(hours) + TwoDigitString(min);
lrn@chromium.org25156de2010-04-06 13:10:27 +0000263 return gmt + ' (' + timezone + ')';
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000264}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000265
266
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000267function DatePrintString(date) {
268 return DateString(date) + ' ' + TimeString(date);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000269}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000270
271// -------------------------------------------------------------------
272
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000273// Reused output buffer. Used when parsing date strings.
kmillikin@chromium.org4111b802010-05-03 10:34:42 +0000274var parse_buffer = $Array(8);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000275
276// ECMA 262 - 15.9.4.2
277function DateParse(string) {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000278 var arr = %DateParseString(ToString(string), parse_buffer);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000279 if (IS_NULL(arr)) return $NaN;
280
281 var day = MakeDay(arr[0], arr[1], arr[2]);
kmillikin@chromium.org4111b802010-05-03 10:34:42 +0000282 var time = MakeTime(arr[3], arr[4], arr[5], arr[6]);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000283 var date = MakeDate(day, time);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000284
kmillikin@chromium.org4111b802010-05-03 10:34:42 +0000285 if (IS_NULL(arr[7])) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000286 return TimeClip(UTC(date));
287 } else {
kmillikin@chromium.org4111b802010-05-03 10:34:42 +0000288 return TimeClip(date - arr[7] * 1000);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000289 }
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000290}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000291
292
293// ECMA 262 - 15.9.4.3
294function DateUTC(year, month, date, hours, minutes, seconds, ms) {
295 year = ToNumber(year);
296 month = ToNumber(month);
297 var argc = %_ArgumentsLength();
298 date = argc > 2 ? ToNumber(date) : 1;
299 hours = argc > 3 ? ToNumber(hours) : 0;
300 minutes = argc > 4 ? ToNumber(minutes) : 0;
301 seconds = argc > 5 ? ToNumber(seconds) : 0;
302 ms = argc > 6 ? ToNumber(ms) : 0;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +0000303 year = (!NUMBER_IS_NAN(year) &&
304 0 <= TO_INTEGER(year) &&
305 TO_INTEGER(year) <= 99) ? 1900 + TO_INTEGER(year) : year;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000306 var day = MakeDay(year, month, date);
307 var time = MakeTime(hours, minutes, seconds, ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000308 return TimeClip(MakeDate(day, time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000309}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000310
311
312// Mozilla-specific extension. Returns the number of milliseconds
313// elapsed since 1 January 1970 00:00:00 UTC.
314function DateNow() {
mads.s.ager31e71382008-08-13 09:32:07 +0000315 return %DateCurrentTime();
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000316}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000317
318
319// ECMA 262 - 15.9.5.2
320function DateToString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000321 var t = UTC_DATE_VALUE(this)
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000322 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000323 var time_zone_string = LocalTimezoneString(this)
324 return DatePrintString(this) + time_zone_string;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000325}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000326
327
328// ECMA 262 - 15.9.5.3
329function DateToDateString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000330 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000331 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000332 return DateString(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000333}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000334
335
336// ECMA 262 - 15.9.5.4
337function DateToTimeString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000338 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000339 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000340 var time_zone_string = LocalTimezoneString(this);
341 return TimeString(this) + time_zone_string;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000342}
343
344
345// ECMA 262 - 15.9.5.5
346function DateToLocaleString() {
whesse@chromium.org7a392b32011-01-31 11:30:36 +0000347 return %_CallFunction(this, DateToString);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000348}
349
350
351// ECMA 262 - 15.9.5.6
352function DateToLocaleDateString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000353 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000354 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000355 return LongDateString(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000356}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000357
358
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000359// ECMA 262 - 15.9.5.7
360function DateToLocaleTimeString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000361 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000362 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000363 return TimeString(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000364}
365
366
367// ECMA 262 - 15.9.5.8
368function DateValueOf() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000369 return UTC_DATE_VALUE(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000370}
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000371
372
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000373// ECMA 262 - 15.9.5.9
374function DateGetTime() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000375 return UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000376}
377
378
379// ECMA 262 - 15.9.5.10
380function DateGetFullYear() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000381 return LOCAL_YEAR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000382}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000383
384
385// ECMA 262 - 15.9.5.11
386function DateGetUTCFullYear() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000387 return UTC_YEAR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000388}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000389
390
391// ECMA 262 - 15.9.5.12
392function DateGetMonth() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000393 return LOCAL_MONTH(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000394}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000395
396
397// ECMA 262 - 15.9.5.13
398function DateGetUTCMonth() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000399 return UTC_MONTH(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000400}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000401
402
403// ECMA 262 - 15.9.5.14
404function DateGetDate() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000405 return LOCAL_DAY(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000406}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000407
408
409// ECMA 262 - 15.9.5.15
410function DateGetUTCDate() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000411 return UTC_DAY(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000412}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000413
414
415// ECMA 262 - 15.9.5.16
416function DateGetDay() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000417 return LOCAL_WEEKDAY(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000418}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000419
420
421// ECMA 262 - 15.9.5.17
422function DateGetUTCDay() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000423 return UTC_WEEKDAY(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000424}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000425
426
427// ECMA 262 - 15.9.5.18
428function DateGetHours() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000429 return LOCAL_HOUR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000430}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000431
432
433// ECMA 262 - 15.9.5.19
434function DateGetUTCHours() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000435 return UTC_HOUR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000436}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000437
438
439// ECMA 262 - 15.9.5.20
440function DateGetMinutes() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000441 return LOCAL_MIN(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000442}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000443
444
445// ECMA 262 - 15.9.5.21
446function DateGetUTCMinutes() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000447 return UTC_MIN(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000448}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000449
450
451// ECMA 262 - 15.9.5.22
452function DateGetSeconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000453 return LOCAL_SEC(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000454}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000455
456
457// ECMA 262 - 15.9.5.23
458function DateGetUTCSeconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000459 return UTC_SEC(this)
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000460}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000461
462
463// ECMA 262 - 15.9.5.24
464function DateGetMilliseconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000465 return LOCAL_MS(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000466}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000467
468
469// ECMA 262 - 15.9.5.25
470function DateGetUTCMilliseconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000471 return UTC_MS(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000472}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000473
474
475// ECMA 262 - 15.9.5.26
476function DateGetTimezoneOffset() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000477 return TIMEZONE_OFFSET(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000478}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000479
480
481// ECMA 262 - 15.9.5.27
482function DateSetTime(ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000483 CHECK_DATE(this);
484 SET_UTC_DATE_VALUE(this, ToNumber(ms));
485 return UTC_DATE_VALUE(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000486}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000487
488
489// ECMA 262 - 15.9.5.28
490function DateSetMilliseconds(ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000491 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000492 ms = ToNumber(ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000493 var time = MakeTime(LOCAL_HOUR(this), LOCAL_MIN(this), LOCAL_SEC(this), ms);
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000494 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000495}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000496
497
498// ECMA 262 - 15.9.5.29
499function DateSetUTCMilliseconds(ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000500 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000501 ms = ToNumber(ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000502 var time = MakeTime(UTC_HOUR(this),
503 UTC_MIN(this),
504 UTC_SEC(this),
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +0000505 ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000506 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000507}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000508
509
510// ECMA 262 - 15.9.5.30
511function DateSetSeconds(sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000512 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000513 sec = ToNumber(sec);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000514 ms = %_ArgumentsLength() < 2 ? LOCAL_MS(this) : ToNumber(ms);
515 var time = MakeTime(LOCAL_HOUR(this), LOCAL_MIN(this), sec, ms);
516 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000517}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000518
519
520// ECMA 262 - 15.9.5.31
521function DateSetUTCSeconds(sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000522 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000523 sec = ToNumber(sec);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000524 ms = %_ArgumentsLength() < 2 ? UTC_MS(this) : ToNumber(ms);
525 var time = MakeTime(UTC_HOUR(this), UTC_MIN(this), sec, ms);
526 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000527}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000528
529
530// ECMA 262 - 15.9.5.33
531function DateSetMinutes(min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000532 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000533 min = ToNumber(min);
534 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000535 sec = argc < 2 ? LOCAL_SEC(this) : ToNumber(sec);
536 ms = argc < 3 ? LOCAL_MS(this) : ToNumber(ms);
537 var time = MakeTime(LOCAL_HOUR(this), min, sec, ms);
538 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000539}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000540
541
542// ECMA 262 - 15.9.5.34
543function DateSetUTCMinutes(min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000544 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000545 min = ToNumber(min);
546 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000547 sec = argc < 2 ? UTC_SEC(this) : ToNumber(sec);
548 ms = argc < 3 ? UTC_MS(this) : ToNumber(ms);
549 var time = MakeTime(UTC_HOUR(this), min, sec, ms);
550 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000551}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000552
553
554// ECMA 262 - 15.9.5.35
555function DateSetHours(hour, min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000556 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000557 hour = ToNumber(hour);
558 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000559 min = argc < 2 ? LOCAL_MIN(this) : ToNumber(min);
560 sec = argc < 3 ? LOCAL_SEC(this) : ToNumber(sec);
561 ms = argc < 4 ? LOCAL_MS(this) : ToNumber(ms);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000562 var time = MakeTime(hour, min, sec, ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000563 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000564}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000565
566
567// ECMA 262 - 15.9.5.34
568function DateSetUTCHours(hour, min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000569 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000570 hour = ToNumber(hour);
571 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000572 min = argc < 2 ? UTC_MIN(this) : ToNumber(min);
573 sec = argc < 3 ? UTC_SEC(this) : ToNumber(sec);
574 ms = argc < 4 ? UTC_MS(this) : ToNumber(ms);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000575 var time = MakeTime(hour, min, sec, ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000576 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000577}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000578
579
580// ECMA 262 - 15.9.5.36
581function DateSetDate(date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000582 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000583 date = ToNumber(date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000584 var day = MakeDay(LOCAL_YEAR(this), LOCAL_MONTH(this), date);
585 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, LOCAL_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000586}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000587
588
589// ECMA 262 - 15.9.5.37
590function DateSetUTCDate(date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000591 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000592 date = ToNumber(date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000593 var day = MakeDay(UTC_YEAR(this), UTC_MONTH(this), date);
594 return SET_UTC_DATE_VALUE(this, MakeDate(day, UTC_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000595}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000596
597
598// ECMA 262 - 15.9.5.38
599function DateSetMonth(month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000600 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000601 month = ToNumber(month);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000602 date = %_ArgumentsLength() < 2 ? LOCAL_DAY(this) : ToNumber(date);
603 var day = MakeDay(LOCAL_YEAR(this), month, date);
604 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, LOCAL_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000605}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000606
607
608// ECMA 262 - 15.9.5.39
609function DateSetUTCMonth(month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000610 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000611 month = ToNumber(month);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000612 date = %_ArgumentsLength() < 2 ? UTC_DAY(this) : ToNumber(date);
613 var day = MakeDay(UTC_YEAR(this), month, date);
614 return SET_UTC_DATE_VALUE(this, MakeDate(day, UTC_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000615}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000616
617
618// ECMA 262 - 15.9.5.40
619function DateSetFullYear(year, month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000620 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000621 year = ToNumber(year);
622 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000623 var time ;
624 if (NUMBER_IS_NAN(t)) {
625 month = argc < 2 ? 0 : ToNumber(month);
626 date = argc < 3 ? 1 : ToNumber(date);
627 time = 0;
628 } else {
629 month = argc < 2 ? LOCAL_MONTH(this) : ToNumber(month);
630 date = argc < 3 ? LOCAL_DAY(this) : ToNumber(date);
631 time = LOCAL_TIME_IN_DAY(this);
632 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000633 var day = MakeDay(year, month, date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000634 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000635}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000636
637
638// ECMA 262 - 15.9.5.41
639function DateSetUTCFullYear(year, month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000640 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000641 year = ToNumber(year);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000642 var argc = %_ArgumentsLength();
643 var time ;
644 if (NUMBER_IS_NAN(t)) {
645 month = argc < 2 ? 0 : ToNumber(month);
646 date = argc < 3 ? 1 : ToNumber(date);
647 time = 0;
648 } else {
649 month = argc < 2 ? UTC_MONTH(this) : ToNumber(month);
650 date = argc < 3 ? UTC_DAY(this) : ToNumber(date);
651 time = UTC_TIME_IN_DAY(this);
652 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000653 var day = MakeDay(year, month, date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000654 return SET_UTC_DATE_VALUE(this, MakeDate(day, time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000655}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000656
657
658// ECMA 262 - 15.9.5.42
659function DateToUTCString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000660 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000661 if (NUMBER_IS_NAN(t)) return kInvalidDate;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000662 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000663 return WeekDays[UTC_WEEKDAY(this)] + ', '
664 + TwoDigitString(UTC_DAY(this)) + ' '
665 + Months[UTC_MONTH(this)] + ' '
666 + UTC_YEAR(this) + ' '
667 + TimeStringUTC(this) + ' GMT';
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000668}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000669
670
671// ECMA 262 - B.2.4
672function DateGetYear() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000673 return LOCAL_YEAR(this) - 1900;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000674}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000675
676
677// ECMA 262 - B.2.5
678function DateSetYear(year) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000679 CHECK_DATE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000680 year = ToNumber(year);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000681 if (NUMBER_IS_NAN(year)) return SET_UTC_DATE_VALUE(this, $NaN);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000682 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99)
683 ? 1900 + TO_INTEGER(year) : year;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000684 var t = LOCAL_DATE_VALUE(this);
685 var month, date, time;
686 if (NUMBER_IS_NAN(t)) {
687 month = 0;
688 date = 1;
689 time = 0;
690 } else {
691 month = LOCAL_MONTH(this);
692 date = LOCAL_DAY(this);
693 time = LOCAL_TIME_IN_DAY(this);
694 }
695 var day = MakeDay(year, month, date);
696 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000697}
698
699
700// ECMA 262 - B.2.6
701//
702// Notice that this does not follow ECMA 262 completely. ECMA 262
703// says that toGMTString should be the same Function object as
704// toUTCString. JSC does not do this, so for compatibility we do not
705// do that either. Instead, we create a new function whose name
706// property will return toGMTString.
707function DateToGMTString() {
whesse@chromium.org7a392b32011-01-31 11:30:36 +0000708 return %_CallFunction(this, DateToUTCString);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000709}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000710
711
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000712function PadInt(n, digits) {
713 if (digits == 1) return n;
714 return n < MathPow(10, digits - 1) ? '0' + PadInt(n, digits - 1) : n;
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000715}
716
717
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000718// ECMA 262 - 15.9.5.43
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000719function DateToISOString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000720 var t = UTC_DATE_VALUE(this);
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000721 if (NUMBER_IS_NAN(t)) throw MakeRangeError("invalid_time_value", []);
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000722 var year = this.getUTCFullYear();
723 var year_string;
724 if (year >= 0 && year <= 9999) {
725 year_string = PadInt(year, 4);
726 } else {
727 if (year < 0) {
728 year_string = "-" + PadInt(-year, 6);
729 } else {
730 year_string = "+" + PadInt(year, 6);
731 }
732 }
733 return year_string +
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000734 '-' + PadInt(this.getUTCMonth() + 1, 2) +
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000735 '-' + PadInt(this.getUTCDate(), 2) +
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000736 'T' + PadInt(this.getUTCHours(), 2) +
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000737 ':' + PadInt(this.getUTCMinutes(), 2) +
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000738 ':' + PadInt(this.getUTCSeconds(), 2) +
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000739 '.' + PadInt(this.getUTCMilliseconds(), 3) +
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000740 'Z';
741}
742
743
744function DateToJSON(key) {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000745 var o = ToObject(this);
746 var tv = DefaultNumber(o);
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000747 if (IS_NUMBER(tv) && !NUMBER_IS_FINITE(tv)) {
748 return null;
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000749 }
750 return o.toISOString();
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000751}
752
753
whesse@chromium.org023421e2010-12-21 12:19:12 +0000754function ResetDateCache() {
whesse@chromium.org023421e2010-12-21 12:19:12 +0000755 // Reset the timezone cache:
756 timezone_cache_time = $NaN;
757 timezone_cache_timezone = undefined;
758
whesse@chromium.org023421e2010-12-21 12:19:12 +0000759 // Reset the date cache:
760 cache = Date_cache;
761 cache.time = $NaN;
whesse@chromium.org023421e2010-12-21 12:19:12 +0000762 cache.string = null;
763}
764
765
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000766// -------------------------------------------------------------------
767
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000768function SetUpDate() {
769 %CheckIsBootstrapping();
770 // Set up non-enumerable properties of the Date object itself.
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000771 InstallFunctions($Date, DONT_ENUM, $Array(
772 "UTC", DateUTC,
773 "parse", DateParse,
774 "now", DateNow
775 ));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000776
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000777 // Set up non-enumerable constructor property of the Date prototype object.
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000778 %SetProperty($Date.prototype, "constructor", $Date, DONT_ENUM);
779
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000780 // Set up non-enumerable functions of the Date prototype object and
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000781 // set their names.
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000782 InstallFunctions($Date.prototype, DONT_ENUM, $Array(
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000783 "toString", DateToString,
784 "toDateString", DateToDateString,
785 "toTimeString", DateToTimeString,
786 "toLocaleString", DateToLocaleString,
787 "toLocaleDateString", DateToLocaleDateString,
788 "toLocaleTimeString", DateToLocaleTimeString,
789 "valueOf", DateValueOf,
790 "getTime", DateGetTime,
791 "getFullYear", DateGetFullYear,
792 "getUTCFullYear", DateGetUTCFullYear,
793 "getMonth", DateGetMonth,
794 "getUTCMonth", DateGetUTCMonth,
795 "getDate", DateGetDate,
796 "getUTCDate", DateGetUTCDate,
797 "getDay", DateGetDay,
798 "getUTCDay", DateGetUTCDay,
799 "getHours", DateGetHours,
800 "getUTCHours", DateGetUTCHours,
801 "getMinutes", DateGetMinutes,
802 "getUTCMinutes", DateGetUTCMinutes,
803 "getSeconds", DateGetSeconds,
804 "getUTCSeconds", DateGetUTCSeconds,
805 "getMilliseconds", DateGetMilliseconds,
806 "getUTCMilliseconds", DateGetUTCMilliseconds,
807 "getTimezoneOffset", DateGetTimezoneOffset,
808 "setTime", DateSetTime,
809 "setMilliseconds", DateSetMilliseconds,
810 "setUTCMilliseconds", DateSetUTCMilliseconds,
811 "setSeconds", DateSetSeconds,
812 "setUTCSeconds", DateSetUTCSeconds,
813 "setMinutes", DateSetMinutes,
814 "setUTCMinutes", DateSetUTCMinutes,
815 "setHours", DateSetHours,
816 "setUTCHours", DateSetUTCHours,
817 "setDate", DateSetDate,
818 "setUTCDate", DateSetUTCDate,
819 "setMonth", DateSetMonth,
820 "setUTCMonth", DateSetUTCMonth,
821 "setFullYear", DateSetFullYear,
822 "setUTCFullYear", DateSetUTCFullYear,
823 "toGMTString", DateToGMTString,
824 "toUTCString", DateToUTCString,
825 "getYear", DateGetYear,
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000826 "setYear", DateSetYear,
827 "toISOString", DateToISOString,
828 "toJSON", DateToJSON
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000829 ));
830}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000831
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000832SetUpDate();