blob: d0e24abc503eb21124a430dc981ed17fe767d010 [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.
110 return %DateMakeDay(year, month) + 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 CHECK_DATE(this);
322 var t = UTC_DATE_VALUE(this)
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000323 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000324 var time_zone_string = LocalTimezoneString(this)
325 return DatePrintString(this) + time_zone_string;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000326}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000327
328
329// ECMA 262 - 15.9.5.3
330function DateToDateString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000331 CHECK_DATE(this);
332 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000333 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000334 return DateString(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000335}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000336
337
338// ECMA 262 - 15.9.5.4
339function DateToTimeString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000340 CHECK_DATE(this);
341 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000342 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000343 var time_zone_string = LocalTimezoneString(this);
344 return TimeString(this) + time_zone_string;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000345}
346
347
348// ECMA 262 - 15.9.5.5
349function DateToLocaleString() {
whesse@chromium.org7a392b32011-01-31 11:30:36 +0000350 return %_CallFunction(this, DateToString);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000351}
352
353
354// ECMA 262 - 15.9.5.6
355function DateToLocaleDateString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000356 CHECK_DATE(this);
357 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000358 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000359 return LongDateString(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000360}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000361
362
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000363// ECMA 262 - 15.9.5.7
364function DateToLocaleTimeString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000365 CHECK_DATE(this);
366 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000367 if (NUMBER_IS_NAN(t)) return kInvalidDate;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000368 return TimeString(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000369}
370
371
372// ECMA 262 - 15.9.5.8
373function DateValueOf() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000374 CHECK_DATE(this);
375 return UTC_DATE_VALUE(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000376}
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000377
378
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000379// ECMA 262 - 15.9.5.9
380function DateGetTime() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000381 CHECK_DATE(this);
382 return UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000383}
384
385
386// ECMA 262 - 15.9.5.10
387function DateGetFullYear() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000388 CHECK_DATE(this);
389 return LOCAL_YEAR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000390}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000391
392
393// ECMA 262 - 15.9.5.11
394function DateGetUTCFullYear() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000395 CHECK_DATE(this);
396 return UTC_YEAR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000397}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000398
399
400// ECMA 262 - 15.9.5.12
401function DateGetMonth() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000402 CHECK_DATE(this);
403 return LOCAL_MONTH(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000404}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000405
406
407// ECMA 262 - 15.9.5.13
408function DateGetUTCMonth() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000409 CHECK_DATE(this);
410 return UTC_MONTH(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000411}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000412
413
414// ECMA 262 - 15.9.5.14
415function DateGetDate() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000416 CHECK_DATE(this);
417 return LOCAL_DAY(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.15
422function DateGetUTCDate() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000423 CHECK_DATE(this);
424 return UTC_DAY(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000425}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000426
427
428// ECMA 262 - 15.9.5.16
429function DateGetDay() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000430 CHECK_DATE(this);
431 return LOCAL_WEEKDAY(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000432}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000433
434
435// ECMA 262 - 15.9.5.17
436function DateGetUTCDay() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000437 CHECK_DATE(this);
438 return UTC_WEEKDAY(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000439}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000440
441
442// ECMA 262 - 15.9.5.18
443function DateGetHours() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000444 CHECK_DATE(this);
445 return LOCAL_HOUR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000446}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000447
448
449// ECMA 262 - 15.9.5.19
450function DateGetUTCHours() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000451 CHECK_DATE(this);
452 return UTC_HOUR(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000453}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000454
455
456// ECMA 262 - 15.9.5.20
457function DateGetMinutes() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000458 CHECK_DATE(this);
459 return LOCAL_MIN(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.21
464function DateGetUTCMinutes() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000465 CHECK_DATE(this);
466 return UTC_MIN(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000467}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000468
469
470// ECMA 262 - 15.9.5.22
471function DateGetSeconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000472 CHECK_DATE(this);
473 return LOCAL_SEC(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000474}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000475
476
477// ECMA 262 - 15.9.5.23
478function DateGetUTCSeconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000479 CHECK_DATE(this);
480 return UTC_SEC(this)
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000481}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000482
483
484// ECMA 262 - 15.9.5.24
485function DateGetMilliseconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000486 CHECK_DATE(this);
487 return LOCAL_MS(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000488}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000489
490
491// ECMA 262 - 15.9.5.25
492function DateGetUTCMilliseconds() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000493 CHECK_DATE(this);
494 return UTC_MS(this);
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.26
499function DateGetTimezoneOffset() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000500 CHECK_DATE(this);
501 return TIMEZONE_OFFSET(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000502}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000503
504
505// ECMA 262 - 15.9.5.27
506function DateSetTime(ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000507 CHECK_DATE(this);
508 SET_UTC_DATE_VALUE(this, ToNumber(ms));
509 return UTC_DATE_VALUE(this);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000510}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000511
512
513// ECMA 262 - 15.9.5.28
514function DateSetMilliseconds(ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000515 CHECK_DATE(this);
516 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000517 ms = ToNumber(ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000518 var time = MakeTime(LOCAL_HOUR(this), LOCAL_MIN(this), LOCAL_SEC(this), ms);
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000519 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000520}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000521
522
523// ECMA 262 - 15.9.5.29
524function DateSetUTCMilliseconds(ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000525 CHECK_DATE(this);
526 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000527 ms = ToNumber(ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000528 var time = MakeTime(UTC_HOUR(this),
529 UTC_MIN(this),
530 UTC_SEC(this),
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +0000531 ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000532 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000533}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000534
535
536// ECMA 262 - 15.9.5.30
537function DateSetSeconds(sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000538 CHECK_DATE(this);
539 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000540 sec = ToNumber(sec);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000541 ms = %_ArgumentsLength() < 2 ? LOCAL_MS(this) : ToNumber(ms);
542 var time = MakeTime(LOCAL_HOUR(this), LOCAL_MIN(this), sec, ms);
543 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000544}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000545
546
547// ECMA 262 - 15.9.5.31
548function DateSetUTCSeconds(sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000549 CHECK_DATE(this);
550 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000551 sec = ToNumber(sec);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000552 ms = %_ArgumentsLength() < 2 ? UTC_MS(this) : ToNumber(ms);
553 var time = MakeTime(UTC_HOUR(this), UTC_MIN(this), sec, ms);
554 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000555}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000556
557
558// ECMA 262 - 15.9.5.33
559function DateSetMinutes(min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000560 CHECK_DATE(this);
561 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000562 min = ToNumber(min);
563 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000564 sec = argc < 2 ? LOCAL_SEC(this) : ToNumber(sec);
565 ms = argc < 3 ? LOCAL_MS(this) : ToNumber(ms);
566 var time = MakeTime(LOCAL_HOUR(this), min, sec, ms);
567 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000568}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000569
570
571// ECMA 262 - 15.9.5.34
572function DateSetUTCMinutes(min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000573 CHECK_DATE(this);
574 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000575 min = ToNumber(min);
576 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000577 sec = argc < 2 ? UTC_SEC(this) : ToNumber(sec);
578 ms = argc < 3 ? UTC_MS(this) : ToNumber(ms);
579 var time = MakeTime(UTC_HOUR(this), min, sec, ms);
580 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000581}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000582
583
584// ECMA 262 - 15.9.5.35
585function DateSetHours(hour, min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000586 CHECK_DATE(this);
587 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000588 hour = ToNumber(hour);
589 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000590 min = argc < 2 ? LOCAL_MIN(this) : ToNumber(min);
591 sec = argc < 3 ? LOCAL_SEC(this) : ToNumber(sec);
592 ms = argc < 4 ? LOCAL_MS(this) : ToNumber(ms);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000593 var time = MakeTime(hour, min, sec, ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000594 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time));
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.34
599function DateSetUTCHours(hour, min, sec, ms) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000600 CHECK_DATE(this);
601 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000602 hour = ToNumber(hour);
603 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000604 min = argc < 2 ? UTC_MIN(this) : ToNumber(min);
605 sec = argc < 3 ? UTC_SEC(this) : ToNumber(sec);
606 ms = argc < 4 ? UTC_MS(this) : ToNumber(ms);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000607 var time = MakeTime(hour, min, sec, ms);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000608 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000609}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000610
611
612// ECMA 262 - 15.9.5.36
613function DateSetDate(date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000614 CHECK_DATE(this);
615 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000616 date = ToNumber(date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000617 var day = MakeDay(LOCAL_YEAR(this), LOCAL_MONTH(this), date);
618 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, LOCAL_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000619}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000620
621
622// ECMA 262 - 15.9.5.37
623function DateSetUTCDate(date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000624 CHECK_DATE(this);
625 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000626 date = ToNumber(date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000627 var day = MakeDay(UTC_YEAR(this), UTC_MONTH(this), date);
628 return SET_UTC_DATE_VALUE(this, MakeDate(day, UTC_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000629}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000630
631
632// ECMA 262 - 15.9.5.38
633function DateSetMonth(month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000634 CHECK_DATE(this);
635 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000636 month = ToNumber(month);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000637 date = %_ArgumentsLength() < 2 ? LOCAL_DAY(this) : ToNumber(date);
638 var day = MakeDay(LOCAL_YEAR(this), month, date);
639 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, LOCAL_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000640}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000641
642
643// ECMA 262 - 15.9.5.39
644function DateSetUTCMonth(month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000645 CHECK_DATE(this);
646 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000647 month = ToNumber(month);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000648 date = %_ArgumentsLength() < 2 ? UTC_DAY(this) : ToNumber(date);
649 var day = MakeDay(UTC_YEAR(this), month, date);
650 return SET_UTC_DATE_VALUE(this, MakeDate(day, UTC_TIME_IN_DAY(this)));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000651}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000652
653
654// ECMA 262 - 15.9.5.40
655function DateSetFullYear(year, month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000656 CHECK_DATE(this);
657 var t = LOCAL_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000658 year = ToNumber(year);
659 var argc = %_ArgumentsLength();
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000660 var time ;
661 if (NUMBER_IS_NAN(t)) {
662 month = argc < 2 ? 0 : ToNumber(month);
663 date = argc < 3 ? 1 : ToNumber(date);
664 time = 0;
665 } else {
666 month = argc < 2 ? LOCAL_MONTH(this) : ToNumber(month);
667 date = argc < 3 ? LOCAL_DAY(this) : ToNumber(date);
668 time = LOCAL_TIME_IN_DAY(this);
669 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000670 var day = MakeDay(year, month, date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000671 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000672}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000673
674
675// ECMA 262 - 15.9.5.41
676function DateSetUTCFullYear(year, month, date) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000677 CHECK_DATE(this);
678 var t = UTC_DATE_VALUE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000679 year = ToNumber(year);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000680 var argc = %_ArgumentsLength();
681 var time ;
682 if (NUMBER_IS_NAN(t)) {
683 month = argc < 2 ? 0 : ToNumber(month);
684 date = argc < 3 ? 1 : ToNumber(date);
685 time = 0;
686 } else {
687 month = argc < 2 ? UTC_MONTH(this) : ToNumber(month);
688 date = argc < 3 ? UTC_DAY(this) : ToNumber(date);
689 time = UTC_TIME_IN_DAY(this);
690 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000691 var day = MakeDay(year, month, date);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000692 return SET_UTC_DATE_VALUE(this, MakeDate(day, time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000693}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000694
695
696// ECMA 262 - 15.9.5.42
697function DateToUTCString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000698 CHECK_DATE(this);
699 var t = UTC_DATE_VALUE(this);
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000700 if (NUMBER_IS_NAN(t)) return kInvalidDate;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000701 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000702 return WeekDays[UTC_WEEKDAY(this)] + ', '
703 + TwoDigitString(UTC_DAY(this)) + ' '
704 + Months[UTC_MONTH(this)] + ' '
705 + UTC_YEAR(this) + ' '
706 + TimeStringUTC(this) + ' GMT';
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000707}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000708
709
710// ECMA 262 - B.2.4
711function DateGetYear() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000712 CHECK_DATE(this);
713 return LOCAL_YEAR(this) - 1900;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000714}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000715
716
717// ECMA 262 - B.2.5
718function DateSetYear(year) {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000719 CHECK_DATE(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000720 year = ToNumber(year);
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000721 if (NUMBER_IS_NAN(year)) return SET_UTC_DATE_VALUE(this, $NaN);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000722 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99)
723 ? 1900 + TO_INTEGER(year) : year;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000724 var t = LOCAL_DATE_VALUE(this);
725 var month, date, time;
726 if (NUMBER_IS_NAN(t)) {
727 month = 0;
728 date = 1;
729 time = 0;
730 } else {
731 month = LOCAL_MONTH(this);
732 date = LOCAL_DAY(this);
733 time = LOCAL_TIME_IN_DAY(this);
734 }
735 var day = MakeDay(year, month, date);
736 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, time));
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000737}
738
739
740// ECMA 262 - B.2.6
741//
742// Notice that this does not follow ECMA 262 completely. ECMA 262
743// says that toGMTString should be the same Function object as
744// toUTCString. JSC does not do this, so for compatibility we do not
745// do that either. Instead, we create a new function whose name
746// property will return toGMTString.
747function DateToGMTString() {
whesse@chromium.org7a392b32011-01-31 11:30:36 +0000748 return %_CallFunction(this, DateToUTCString);
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000749}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000750
751
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000752function PadInt(n, digits) {
753 if (digits == 1) return n;
754 return n < MathPow(10, digits - 1) ? '0' + PadInt(n, digits - 1) : n;
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000755}
756
757
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000758// ECMA 262 - 15.9.5.43
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000759function DateToISOString() {
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000760 CHECK_DATE(this);
761 var t = UTC_DATE_VALUE(this);
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000762 if (NUMBER_IS_NAN(t)) throw MakeRangeError("invalid_time_value", []);
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000763 var year = this.getUTCFullYear();
764 var year_string;
765 if (year >= 0 && year <= 9999) {
766 year_string = PadInt(year, 4);
767 } else {
768 if (year < 0) {
769 year_string = "-" + PadInt(-year, 6);
770 } else {
771 year_string = "+" + PadInt(year, 6);
772 }
773 }
774 return year_string +
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000775 '-' + PadInt(this.getUTCMonth() + 1, 2) +
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000776 '-' + PadInt(this.getUTCDate(), 2) +
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000777 'T' + PadInt(this.getUTCHours(), 2) +
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000778 ':' + PadInt(this.getUTCMinutes(), 2) +
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000779 ':' + PadInt(this.getUTCSeconds(), 2) +
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000780 '.' + PadInt(this.getUTCMilliseconds(), 3) +
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000781 'Z';
782}
783
784
785function DateToJSON(key) {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000786 var o = ToObject(this);
787 var tv = DefaultNumber(o);
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000788 if (IS_NUMBER(tv) && !NUMBER_IS_FINITE(tv)) {
789 return null;
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000790 }
791 return o.toISOString();
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000792}
793
794
whesse@chromium.org023421e2010-12-21 12:19:12 +0000795function ResetDateCache() {
whesse@chromium.org023421e2010-12-21 12:19:12 +0000796 // Reset the timezone cache:
797 timezone_cache_time = $NaN;
798 timezone_cache_timezone = undefined;
799
whesse@chromium.org023421e2010-12-21 12:19:12 +0000800 // Reset the date cache:
801 cache = Date_cache;
802 cache.time = $NaN;
whesse@chromium.org023421e2010-12-21 12:19:12 +0000803 cache.string = null;
804}
805
806
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000807// -------------------------------------------------------------------
808
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000809function SetUpDate() {
810 %CheckIsBootstrapping();
811 // Set up non-enumerable properties of the Date object itself.
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000812 InstallFunctions($Date, DONT_ENUM, $Array(
813 "UTC", DateUTC,
814 "parse", DateParse,
815 "now", DateNow
816 ));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000817
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000818 // Set up non-enumerable constructor property of the Date prototype object.
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000819 %SetProperty($Date.prototype, "constructor", $Date, DONT_ENUM);
820
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000821 // Set up non-enumerable functions of the Date prototype object and
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000822 // set their names.
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000823 InstallFunctions($Date.prototype, DONT_ENUM, $Array(
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000824 "toString", DateToString,
825 "toDateString", DateToDateString,
826 "toTimeString", DateToTimeString,
827 "toLocaleString", DateToLocaleString,
828 "toLocaleDateString", DateToLocaleDateString,
829 "toLocaleTimeString", DateToLocaleTimeString,
830 "valueOf", DateValueOf,
831 "getTime", DateGetTime,
832 "getFullYear", DateGetFullYear,
833 "getUTCFullYear", DateGetUTCFullYear,
834 "getMonth", DateGetMonth,
835 "getUTCMonth", DateGetUTCMonth,
836 "getDate", DateGetDate,
837 "getUTCDate", DateGetUTCDate,
838 "getDay", DateGetDay,
839 "getUTCDay", DateGetUTCDay,
840 "getHours", DateGetHours,
841 "getUTCHours", DateGetUTCHours,
842 "getMinutes", DateGetMinutes,
843 "getUTCMinutes", DateGetUTCMinutes,
844 "getSeconds", DateGetSeconds,
845 "getUTCSeconds", DateGetUTCSeconds,
846 "getMilliseconds", DateGetMilliseconds,
847 "getUTCMilliseconds", DateGetUTCMilliseconds,
848 "getTimezoneOffset", DateGetTimezoneOffset,
849 "setTime", DateSetTime,
850 "setMilliseconds", DateSetMilliseconds,
851 "setUTCMilliseconds", DateSetUTCMilliseconds,
852 "setSeconds", DateSetSeconds,
853 "setUTCSeconds", DateSetUTCSeconds,
854 "setMinutes", DateSetMinutes,
855 "setUTCMinutes", DateSetUTCMinutes,
856 "setHours", DateSetHours,
857 "setUTCHours", DateSetUTCHours,
858 "setDate", DateSetDate,
859 "setUTCDate", DateSetUTCDate,
860 "setMonth", DateSetMonth,
861 "setUTCMonth", DateSetUTCMonth,
862 "setFullYear", DateSetFullYear,
863 "setUTCFullYear", DateSetUTCFullYear,
864 "toGMTString", DateToGMTString,
865 "toUTCString", DateToUTCString,
866 "getYear", DateGetYear,
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000867 "setYear", DateSetYear,
868 "toISOString", DateToISOString,
869 "toJSON", DateToJSON
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000870 ));
871}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000872
fschneider@chromium.org1805e212011-09-05 10:49:12 +0000873SetUpDate();