| OLD | NEW |
| (Empty) |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // ------------------------------------------------------------------- | |
| 6 | |
| 7 (function(global, utils) { | |
| 8 | |
| 9 "use strict"; | |
| 10 | |
| 11 %CheckIsBootstrapping(); | |
| 12 | |
| 13 // ------------------------------------------------------------------- | |
| 14 // Imports | |
| 15 | |
| 16 var GlobalDate = global.Date; | |
| 17 var GlobalObject = global.Object; | |
| 18 var InternalArray = utils.InternalArray; | |
| 19 var IsFinite; | |
| 20 var MakeRangeError; | |
| 21 var MathAbs; | |
| 22 var MathFloor; | |
| 23 var NaN = %GetRootNaN(); | |
| 24 | |
| 25 utils.Import(function(from) { | |
| 26 IsFinite = from.IsFinite; | |
| 27 MakeRangeError = from.MakeRangeError; | |
| 28 MathAbs = from.MathAbs; | |
| 29 MathFloor = from.MathFloor; | |
| 30 }); | |
| 31 | |
| 32 // ------------------------------------------------------------------- | |
| 33 | |
| 34 // This file contains date support implemented in JavaScript. | |
| 35 | |
| 36 var timezone_cache_time = NaN; | |
| 37 var timezone_cache_timezone; | |
| 38 | |
| 39 function LocalTimezone(t) { | |
| 40 if (NUMBER_IS_NAN(t)) return ""; | |
| 41 CheckDateCacheCurrent(); | |
| 42 if (t == timezone_cache_time) { | |
| 43 return timezone_cache_timezone; | |
| 44 } | |
| 45 var timezone = %DateLocalTimezone(t); | |
| 46 timezone_cache_time = t; | |
| 47 timezone_cache_timezone = timezone; | |
| 48 return timezone; | |
| 49 } | |
| 50 | |
| 51 | |
| 52 // ECMA 262 - 15.9.1.11 | |
| 53 function MakeTime(hour, min, sec, ms) { | |
| 54 if (!IsFinite(hour)) return NaN; | |
| 55 if (!IsFinite(min)) return NaN; | |
| 56 if (!IsFinite(sec)) return NaN; | |
| 57 if (!IsFinite(ms)) return NaN; | |
| 58 return TO_INTEGER(hour) * msPerHour | |
| 59 + TO_INTEGER(min) * msPerMinute | |
| 60 + TO_INTEGER(sec) * msPerSecond | |
| 61 + TO_INTEGER(ms); | |
| 62 } | |
| 63 | |
| 64 | |
| 65 // Compute number of days given a year, month, date. | |
| 66 // Note that month and date can lie outside the normal range. | |
| 67 // For example: | |
| 68 // MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20) | |
| 69 // MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1) | |
| 70 // MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11) | |
| 71 function MakeDay(year, month, date) { | |
| 72 if (!IsFinite(year) || !IsFinite(month) || !IsFinite(date)) return NaN; | |
| 73 | |
| 74 // Convert to integer and map -0 to 0. | |
| 75 year = TO_INTEGER_MAP_MINUS_ZERO(year); | |
| 76 month = TO_INTEGER_MAP_MINUS_ZERO(month); | |
| 77 date = TO_INTEGER_MAP_MINUS_ZERO(date); | |
| 78 | |
| 79 if (year < kMinYear || year > kMaxYear || | |
| 80 month < kMinMonth || month > kMaxMonth) { | |
| 81 return NaN; | |
| 82 } | |
| 83 | |
| 84 // Now we rely on year and month being SMIs. | |
| 85 return %DateMakeDay(year | 0, month | 0) + date - 1; | |
| 86 } | |
| 87 | |
| 88 | |
| 89 // ECMA 262 - 15.9.1.13 | |
| 90 function MakeDate(day, time) { | |
| 91 var time = day * msPerDay + time; | |
| 92 // Some of our runtime funtions for computing UTC(time) rely on | |
| 93 // times not being significantly larger than MAX_TIME_MS. If there | |
| 94 // is no way that the time can be within range even after UTC | |
| 95 // conversion we return NaN immediately instead of relying on | |
| 96 // TimeClip to do it. | |
| 97 if (MathAbs(time) > MAX_TIME_BEFORE_UTC) return NaN; | |
| 98 return time; | |
| 99 } | |
| 100 | |
| 101 | |
| 102 // ECMA 262 - 15.9.1.14 | |
| 103 function TimeClip(time) { | |
| 104 if (!IsFinite(time)) return NaN; | |
| 105 if (MathAbs(time) > MAX_TIME_MS) return NaN; | |
| 106 return TO_INTEGER(time) + 0; | |
| 107 } | |
| 108 | |
| 109 | |
| 110 var WeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; | |
| 111 var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', | |
| 112 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; | |
| 113 | |
| 114 | |
| 115 function TwoDigitString(value) { | |
| 116 return value < 10 ? "0" + value : "" + value; | |
| 117 } | |
| 118 | |
| 119 | |
| 120 function DateString(date) { | |
| 121 CHECK_DATE(date); | |
| 122 return WeekDays[LOCAL_WEEKDAY(date)] + ' ' | |
| 123 + Months[LOCAL_MONTH(date)] + ' ' | |
| 124 + TwoDigitString(LOCAL_DAY(date)) + ' ' | |
| 125 + LOCAL_YEAR(date); | |
| 126 } | |
| 127 | |
| 128 | |
| 129 var LongWeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', | |
| 130 'Thursday', 'Friday', 'Saturday']; | |
| 131 var LongMonths = ['January', 'February', 'March', 'April', 'May', 'June', | |
| 132 'July', 'August', 'September', 'October', 'November', 'December']; | |
| 133 | |
| 134 | |
| 135 function LongDateString(date) { | |
| 136 CHECK_DATE(date); | |
| 137 return LongWeekDays[LOCAL_WEEKDAY(date)] + ', ' | |
| 138 + LongMonths[LOCAL_MONTH(date)] + ' ' | |
| 139 + TwoDigitString(LOCAL_DAY(date)) + ', ' | |
| 140 + LOCAL_YEAR(date); | |
| 141 } | |
| 142 | |
| 143 | |
| 144 function TimeString(date) { | |
| 145 CHECK_DATE(date); | |
| 146 return TwoDigitString(LOCAL_HOUR(date)) + ':' | |
| 147 + TwoDigitString(LOCAL_MIN(date)) + ':' | |
| 148 + TwoDigitString(LOCAL_SEC(date)); | |
| 149 } | |
| 150 | |
| 151 | |
| 152 function TimeStringUTC(date) { | |
| 153 CHECK_DATE(date); | |
| 154 return TwoDigitString(UTC_HOUR(date)) + ':' | |
| 155 + TwoDigitString(UTC_MIN(date)) + ':' | |
| 156 + TwoDigitString(UTC_SEC(date)); | |
| 157 } | |
| 158 | |
| 159 | |
| 160 function LocalTimezoneString(date) { | |
| 161 CHECK_DATE(date); | |
| 162 var timezone = LocalTimezone(UTC_DATE_VALUE(date)); | |
| 163 | |
| 164 var timezoneOffset = -TIMEZONE_OFFSET(date); | |
| 165 var sign = (timezoneOffset >= 0) ? 1 : -1; | |
| 166 var hours = MathFloor((sign * timezoneOffset)/60); | |
| 167 var min = MathFloor((sign * timezoneOffset)%60); | |
| 168 var gmt = ' GMT' + ((sign == 1) ? '+' : '-') + | |
| 169 TwoDigitString(hours) + TwoDigitString(min); | |
| 170 return gmt + ' (' + timezone + ')'; | |
| 171 } | |
| 172 | |
| 173 | |
| 174 function DatePrintString(date) { | |
| 175 CHECK_DATE(date); | |
| 176 return DateString(date) + ' ' + TimeString(date); | |
| 177 } | |
| 178 | |
| 179 // ------------------------------------------------------------------- | |
| 180 | |
| 181 // ECMA 262 - 15.9.5.2 | |
| 182 function DateToString() { | |
| 183 CHECK_DATE(this); | |
| 184 var t = UTC_DATE_VALUE(this) | |
| 185 if (NUMBER_IS_NAN(t)) return kInvalidDate; | |
| 186 var time_zone_string = LocalTimezoneString(this) | |
| 187 return DatePrintString(this) + time_zone_string; | |
| 188 } | |
| 189 | |
| 190 | |
| 191 // ECMA 262 - 15.9.5.3 | |
| 192 function DateToDateString() { | |
| 193 CHECK_DATE(this); | |
| 194 var t = UTC_DATE_VALUE(this); | |
| 195 if (NUMBER_IS_NAN(t)) return kInvalidDate; | |
| 196 return DateString(this); | |
| 197 } | |
| 198 | |
| 199 | |
| 200 // ECMA 262 - 15.9.5.4 | |
| 201 function DateToTimeString() { | |
| 202 CHECK_DATE(this); | |
| 203 var t = UTC_DATE_VALUE(this); | |
| 204 if (NUMBER_IS_NAN(t)) return kInvalidDate; | |
| 205 var time_zone_string = LocalTimezoneString(this); | |
| 206 return TimeString(this) + time_zone_string; | |
| 207 } | |
| 208 | |
| 209 | |
| 210 // ECMA 262 - 15.9.5.5 | |
| 211 function DateToLocaleString() { | |
| 212 CHECK_DATE(this); | |
| 213 return %_Call(DateToString, this); | |
| 214 } | |
| 215 | |
| 216 | |
| 217 // ECMA 262 - 15.9.5.6 | |
| 218 function DateToLocaleDateString() { | |
| 219 CHECK_DATE(this); | |
| 220 var t = UTC_DATE_VALUE(this); | |
| 221 if (NUMBER_IS_NAN(t)) return kInvalidDate; | |
| 222 return LongDateString(this); | |
| 223 } | |
| 224 | |
| 225 | |
| 226 // ECMA 262 - 15.9.5.7 | |
| 227 function DateToLocaleTimeString() { | |
| 228 CHECK_DATE(this); | |
| 229 var t = UTC_DATE_VALUE(this); | |
| 230 if (NUMBER_IS_NAN(t)) return kInvalidDate; | |
| 231 return TimeString(this); | |
| 232 } | |
| 233 | |
| 234 | |
| 235 // ECMA 262 - 15.9.5.27 | |
| 236 function DateSetTime(ms) { | |
| 237 CHECK_DATE(this); | |
| 238 SET_UTC_DATE_VALUE(this, TO_NUMBER(ms)); | |
| 239 return UTC_DATE_VALUE(this); | |
| 240 } | |
| 241 | |
| 242 | |
| 243 // ECMA 262 - 15.9.5.28 | |
| 244 function DateSetMilliseconds(ms) { | |
| 245 CHECK_DATE(this); | |
| 246 var t = LOCAL_DATE_VALUE(this); | |
| 247 ms = TO_NUMBER(ms); | |
| 248 var time = MakeTime(LOCAL_HOUR(this), LOCAL_MIN(this), LOCAL_SEC(this), ms); | |
| 249 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time)); | |
| 250 } | |
| 251 | |
| 252 | |
| 253 // ECMA 262 - 15.9.5.29 | |
| 254 function DateSetUTCMilliseconds(ms) { | |
| 255 CHECK_DATE(this); | |
| 256 var t = UTC_DATE_VALUE(this); | |
| 257 ms = TO_NUMBER(ms); | |
| 258 var time = MakeTime(UTC_HOUR(this), | |
| 259 UTC_MIN(this), | |
| 260 UTC_SEC(this), | |
| 261 ms); | |
| 262 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time)); | |
| 263 } | |
| 264 | |
| 265 | |
| 266 // ECMA 262 - 15.9.5.30 | |
| 267 function DateSetSeconds(sec, ms) { | |
| 268 CHECK_DATE(this); | |
| 269 var t = LOCAL_DATE_VALUE(this); | |
| 270 sec = TO_NUMBER(sec); | |
| 271 ms = %_ArgumentsLength() < 2 ? LOCAL_MS(this) : TO_NUMBER(ms); | |
| 272 var time = MakeTime(LOCAL_HOUR(this), LOCAL_MIN(this), sec, ms); | |
| 273 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time)); | |
| 274 } | |
| 275 | |
| 276 | |
| 277 // ECMA 262 - 15.9.5.31 | |
| 278 function DateSetUTCSeconds(sec, ms) { | |
| 279 CHECK_DATE(this); | |
| 280 var t = UTC_DATE_VALUE(this); | |
| 281 sec = TO_NUMBER(sec); | |
| 282 ms = %_ArgumentsLength() < 2 ? UTC_MS(this) : TO_NUMBER(ms); | |
| 283 var time = MakeTime(UTC_HOUR(this), UTC_MIN(this), sec, ms); | |
| 284 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time)); | |
| 285 } | |
| 286 | |
| 287 | |
| 288 // ECMA 262 - 15.9.5.33 | |
| 289 function DateSetMinutes(min, sec, ms) { | |
| 290 CHECK_DATE(this); | |
| 291 var t = LOCAL_DATE_VALUE(this); | |
| 292 min = TO_NUMBER(min); | |
| 293 var argc = %_ArgumentsLength(); | |
| 294 sec = argc < 2 ? LOCAL_SEC(this) : TO_NUMBER(sec); | |
| 295 ms = argc < 3 ? LOCAL_MS(this) : TO_NUMBER(ms); | |
| 296 var time = MakeTime(LOCAL_HOUR(this), min, sec, ms); | |
| 297 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time)); | |
| 298 } | |
| 299 | |
| 300 | |
| 301 // ECMA 262 - 15.9.5.34 | |
| 302 function DateSetUTCMinutes(min, sec, ms) { | |
| 303 CHECK_DATE(this); | |
| 304 var t = UTC_DATE_VALUE(this); | |
| 305 min = TO_NUMBER(min); | |
| 306 var argc = %_ArgumentsLength(); | |
| 307 sec = argc < 2 ? UTC_SEC(this) : TO_NUMBER(sec); | |
| 308 ms = argc < 3 ? UTC_MS(this) : TO_NUMBER(ms); | |
| 309 var time = MakeTime(UTC_HOUR(this), min, sec, ms); | |
| 310 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time)); | |
| 311 } | |
| 312 | |
| 313 | |
| 314 // ECMA 262 - 15.9.5.35 | |
| 315 function DateSetHours(hour, min, sec, ms) { | |
| 316 CHECK_DATE(this); | |
| 317 var t = LOCAL_DATE_VALUE(this); | |
| 318 hour = TO_NUMBER(hour); | |
| 319 var argc = %_ArgumentsLength(); | |
| 320 min = argc < 2 ? LOCAL_MIN(this) : TO_NUMBER(min); | |
| 321 sec = argc < 3 ? LOCAL_SEC(this) : TO_NUMBER(sec); | |
| 322 ms = argc < 4 ? LOCAL_MS(this) : TO_NUMBER(ms); | |
| 323 var time = MakeTime(hour, min, sec, ms); | |
| 324 return SET_LOCAL_DATE_VALUE(this, MakeDate(LOCAL_DAYS(this), time)); | |
| 325 } | |
| 326 | |
| 327 | |
| 328 // ECMA 262 - 15.9.5.34 | |
| 329 function DateSetUTCHours(hour, min, sec, ms) { | |
| 330 CHECK_DATE(this); | |
| 331 var t = UTC_DATE_VALUE(this); | |
| 332 hour = TO_NUMBER(hour); | |
| 333 var argc = %_ArgumentsLength(); | |
| 334 min = argc < 2 ? UTC_MIN(this) : TO_NUMBER(min); | |
| 335 sec = argc < 3 ? UTC_SEC(this) : TO_NUMBER(sec); | |
| 336 ms = argc < 4 ? UTC_MS(this) : TO_NUMBER(ms); | |
| 337 var time = MakeTime(hour, min, sec, ms); | |
| 338 return SET_UTC_DATE_VALUE(this, MakeDate(UTC_DAYS(this), time)); | |
| 339 } | |
| 340 | |
| 341 | |
| 342 // ECMA 262 - 15.9.5.36 | |
| 343 function DateSetDate(date) { | |
| 344 CHECK_DATE(this); | |
| 345 var t = LOCAL_DATE_VALUE(this); | |
| 346 date = TO_NUMBER(date); | |
| 347 var day = MakeDay(LOCAL_YEAR(this), LOCAL_MONTH(this), date); | |
| 348 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, LOCAL_TIME_IN_DAY(this))); | |
| 349 } | |
| 350 | |
| 351 | |
| 352 // ECMA 262 - 15.9.5.37 | |
| 353 function DateSetUTCDate(date) { | |
| 354 CHECK_DATE(this); | |
| 355 var t = UTC_DATE_VALUE(this); | |
| 356 date = TO_NUMBER(date); | |
| 357 var day = MakeDay(UTC_YEAR(this), UTC_MONTH(this), date); | |
| 358 return SET_UTC_DATE_VALUE(this, MakeDate(day, UTC_TIME_IN_DAY(this))); | |
| 359 } | |
| 360 | |
| 361 | |
| 362 // ECMA 262 - 15.9.5.38 | |
| 363 function DateSetMonth(month, date) { | |
| 364 CHECK_DATE(this); | |
| 365 var t = LOCAL_DATE_VALUE(this); | |
| 366 month = TO_NUMBER(month); | |
| 367 date = %_ArgumentsLength() < 2 ? LOCAL_DAY(this) : TO_NUMBER(date); | |
| 368 var day = MakeDay(LOCAL_YEAR(this), month, date); | |
| 369 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, LOCAL_TIME_IN_DAY(this))); | |
| 370 } | |
| 371 | |
| 372 | |
| 373 // ECMA 262 - 15.9.5.39 | |
| 374 function DateSetUTCMonth(month, date) { | |
| 375 CHECK_DATE(this); | |
| 376 var t = UTC_DATE_VALUE(this); | |
| 377 month = TO_NUMBER(month); | |
| 378 date = %_ArgumentsLength() < 2 ? UTC_DAY(this) : TO_NUMBER(date); | |
| 379 var day = MakeDay(UTC_YEAR(this), month, date); | |
| 380 return SET_UTC_DATE_VALUE(this, MakeDate(day, UTC_TIME_IN_DAY(this))); | |
| 381 } | |
| 382 | |
| 383 | |
| 384 // ECMA 262 - 15.9.5.40 | |
| 385 function DateSetFullYear(year, month, date) { | |
| 386 CHECK_DATE(this); | |
| 387 var t = LOCAL_DATE_VALUE(this); | |
| 388 year = TO_NUMBER(year); | |
| 389 var argc = %_ArgumentsLength(); | |
| 390 var time ; | |
| 391 if (NUMBER_IS_NAN(t)) { | |
| 392 month = argc < 2 ? 0 : TO_NUMBER(month); | |
| 393 date = argc < 3 ? 1 : TO_NUMBER(date); | |
| 394 time = 0; | |
| 395 } else { | |
| 396 month = argc < 2 ? LOCAL_MONTH(this) : TO_NUMBER(month); | |
| 397 date = argc < 3 ? LOCAL_DAY(this) : TO_NUMBER(date); | |
| 398 time = LOCAL_TIME_IN_DAY(this); | |
| 399 } | |
| 400 var day = MakeDay(year, month, date); | |
| 401 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, time)); | |
| 402 } | |
| 403 | |
| 404 | |
| 405 // ECMA 262 - 15.9.5.41 | |
| 406 function DateSetUTCFullYear(year, month, date) { | |
| 407 CHECK_DATE(this); | |
| 408 var t = UTC_DATE_VALUE(this); | |
| 409 year = TO_NUMBER(year); | |
| 410 var argc = %_ArgumentsLength(); | |
| 411 var time ; | |
| 412 if (NUMBER_IS_NAN(t)) { | |
| 413 month = argc < 2 ? 0 : TO_NUMBER(month); | |
| 414 date = argc < 3 ? 1 : TO_NUMBER(date); | |
| 415 time = 0; | |
| 416 } else { | |
| 417 month = argc < 2 ? UTC_MONTH(this) : TO_NUMBER(month); | |
| 418 date = argc < 3 ? UTC_DAY(this) : TO_NUMBER(date); | |
| 419 time = UTC_TIME_IN_DAY(this); | |
| 420 } | |
| 421 var day = MakeDay(year, month, date); | |
| 422 return SET_UTC_DATE_VALUE(this, MakeDate(day, time)); | |
| 423 } | |
| 424 | |
| 425 | |
| 426 // ECMA 262 - 15.9.5.42 | |
| 427 function DateToUTCString() { | |
| 428 CHECK_DATE(this); | |
| 429 var t = UTC_DATE_VALUE(this); | |
| 430 if (NUMBER_IS_NAN(t)) return kInvalidDate; | |
| 431 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT | |
| 432 return WeekDays[UTC_WEEKDAY(this)] + ', ' | |
| 433 + TwoDigitString(UTC_DAY(this)) + ' ' | |
| 434 + Months[UTC_MONTH(this)] + ' ' | |
| 435 + UTC_YEAR(this) + ' ' | |
| 436 + TimeStringUTC(this) + ' GMT'; | |
| 437 } | |
| 438 | |
| 439 | |
| 440 // ECMA 262 - B.2.4 | |
| 441 function DateGetYear() { | |
| 442 CHECK_DATE(this); | |
| 443 return LOCAL_YEAR(this) - 1900; | |
| 444 } | |
| 445 | |
| 446 | |
| 447 // ECMA 262 - B.2.5 | |
| 448 function DateSetYear(year) { | |
| 449 CHECK_DATE(this); | |
| 450 year = TO_NUMBER(year); | |
| 451 if (NUMBER_IS_NAN(year)) return SET_UTC_DATE_VALUE(this, NaN); | |
| 452 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) | |
| 453 ? 1900 + TO_INTEGER(year) : year; | |
| 454 var t = LOCAL_DATE_VALUE(this); | |
| 455 var month, date, time; | |
| 456 if (NUMBER_IS_NAN(t)) { | |
| 457 month = 0; | |
| 458 date = 1; | |
| 459 time = 0; | |
| 460 } else { | |
| 461 month = LOCAL_MONTH(this); | |
| 462 date = LOCAL_DAY(this); | |
| 463 time = LOCAL_TIME_IN_DAY(this); | |
| 464 } | |
| 465 var day = MakeDay(year, month, date); | |
| 466 return SET_LOCAL_DATE_VALUE(this, MakeDate(day, time)); | |
| 467 } | |
| 468 | |
| 469 | |
| 470 // ECMA 262 - B.2.6 | |
| 471 // | |
| 472 // Notice that this does not follow ECMA 262 completely. ECMA 262 | |
| 473 // says that toGMTString should be the same Function object as | |
| 474 // toUTCString. JSC does not do this, so for compatibility we do not | |
| 475 // do that either. Instead, we create a new function whose name | |
| 476 // property will return toGMTString. | |
| 477 function DateToGMTString() { | |
| 478 return %_Call(DateToUTCString, this); | |
| 479 } | |
| 480 | |
| 481 | |
| 482 // 20.3.4.37 Date.prototype.toJSON ( key ) | |
| 483 function DateToJSON(key) { | |
| 484 var o = TO_OBJECT(this); | |
| 485 var tv = TO_PRIMITIVE_NUMBER(o); | |
| 486 if (IS_NUMBER(tv) && !NUMBER_IS_FINITE(tv)) { | |
| 487 return null; | |
| 488 } | |
| 489 return o.toISOString(); | |
| 490 } | |
| 491 | |
| 492 | |
| 493 var date_cache_version_holder; | |
| 494 var date_cache_version = NaN; | |
| 495 | |
| 496 | |
| 497 function CheckDateCacheCurrent() { | |
| 498 if (!date_cache_version_holder) { | |
| 499 date_cache_version_holder = %DateCacheVersion(); | |
| 500 if (!date_cache_version_holder) return; | |
| 501 } | |
| 502 if (date_cache_version_holder[0] == date_cache_version) { | |
| 503 return; | |
| 504 } | |
| 505 date_cache_version = date_cache_version_holder[0]; | |
| 506 | |
| 507 // Reset the timezone cache: | |
| 508 timezone_cache_time = NaN; | |
| 509 timezone_cache_timezone = UNDEFINED; | |
| 510 } | |
| 511 | |
| 512 // ------------------------------------------------------------------- | |
| 513 | |
| 514 %FunctionSetPrototype(GlobalDate, new GlobalObject()); | |
| 515 | |
| 516 // Set up non-enumerable functions of the Date prototype object and | |
| 517 // set their names. | |
| 518 utils.InstallFunctions(GlobalDate.prototype, DONT_ENUM, [ | |
| 519 "toString", DateToString, | |
| 520 "toDateString", DateToDateString, | |
| 521 "toTimeString", DateToTimeString, | |
| 522 "toLocaleString", DateToLocaleString, | |
| 523 "toLocaleDateString", DateToLocaleDateString, | |
| 524 "toLocaleTimeString", DateToLocaleTimeString, | |
| 525 "setTime", DateSetTime, | |
| 526 "setMilliseconds", DateSetMilliseconds, | |
| 527 "setUTCMilliseconds", DateSetUTCMilliseconds, | |
| 528 "setSeconds", DateSetSeconds, | |
| 529 "setUTCSeconds", DateSetUTCSeconds, | |
| 530 "setMinutes", DateSetMinutes, | |
| 531 "setUTCMinutes", DateSetUTCMinutes, | |
| 532 "setHours", DateSetHours, | |
| 533 "setUTCHours", DateSetUTCHours, | |
| 534 "setDate", DateSetDate, | |
| 535 "setUTCDate", DateSetUTCDate, | |
| 536 "setMonth", DateSetMonth, | |
| 537 "setUTCMonth", DateSetUTCMonth, | |
| 538 "setFullYear", DateSetFullYear, | |
| 539 "setUTCFullYear", DateSetUTCFullYear, | |
| 540 "toGMTString", DateToGMTString, | |
| 541 "toUTCString", DateToUTCString, | |
| 542 "getYear", DateGetYear, | |
| 543 "setYear", DateSetYear, | |
| 544 "toJSON", DateToJSON | |
| 545 ]); | |
| 546 | |
| 547 }) | |
| OLD | NEW |