18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008, 2009 Torch Mobile, Inc. All rights reserved. 56c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Lesser General Public 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Lesser General Public License for more details. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Lesser General Public 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License along with this library; if not, write to the Free Software 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * USA 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DatePrototype.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "DateConversion.h" 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "DateInstance.h" 295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Error.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSString.h" 318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include "JSStringBuilder.h" 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Lookup.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ObjectPrototype.h" 348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if !PLATFORM(MAC) && HAVE(LANGINFO_H) 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <langinfo.h> 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <limits.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <locale.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <math.h> 426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <stdlib.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <time.h> 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Assertions.h> 455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/DateMath.h> 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MathExtras.h> 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/StringExtras.h> 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/UnusedParam.h> 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if HAVE(SYS_PARAM_H) 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <sys/param.h> 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if HAVE(SYS_TIME_H) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <sys/time.h> 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if HAVE(SYS_TIMEB_H) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <sys/timeb.h> 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CoreFoundation/CoreFoundation.h> 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 66d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE) && !PLATFORM(QT) 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochextern "C" size_t strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t); //provided by libce 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectASSERT_CLASS_FITS_IN_CELL(DatePrototype); 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 76545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetDate(ExecState*); 77545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetDay(ExecState*); 78545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetFullYear(ExecState*); 79545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetHours(ExecState*); 80545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetMilliSeconds(ExecState*); 81545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetMinutes(ExecState*); 82545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetMonth(ExecState*); 83545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetSeconds(ExecState*); 84545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetTime(ExecState*); 85545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetTimezoneOffset(ExecState*); 86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCDate(ExecState*); 87545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCDay(ExecState*); 88545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCFullYear(ExecState*); 89545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCHours(ExecState*); 90545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCMilliseconds(ExecState*); 91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCMinutes(ExecState*); 92545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCMonth(ExecState*); 93545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCSeconds(ExecState*); 94545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncGetYear(ExecState*); 95545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetDate(ExecState*); 96545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetFullYear(ExecState*); 97545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetHours(ExecState*); 98545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetMilliSeconds(ExecState*); 99545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetMinutes(ExecState*); 100545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetMonth(ExecState*); 101545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetSeconds(ExecState*); 102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetTime(ExecState*); 103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCDate(ExecState*); 104545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCFullYear(ExecState*); 105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCHours(ExecState*); 106545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCMilliseconds(ExecState*); 107545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCMinutes(ExecState*); 108545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCMonth(ExecState*); 109545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCSeconds(ExecState*); 110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncSetYear(ExecState*); 111545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToDateString(ExecState*); 112545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToGMTString(ExecState*); 113545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToLocaleDateString(ExecState*); 114545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToLocaleString(ExecState*); 115545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToLocaleTimeString(ExecState*); 116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToString(ExecState*); 117545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToTimeString(ExecState*); 118545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToUTCString(ExecState*); 119545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToISOString(ExecState*); 120545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL dateProtoFuncToJSON(ExecState*); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DatePrototype.lut.h" 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectenum LocaleDateTimeFormat { LocaleDateAndTime, LocaleDate, LocaleTime }; 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// FIXME: Since this is superior to the strftime-based version, why limit this to PLATFORM(MAC)? 13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Instead we should consider using this whenever USE(CF) is true. 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CFDateFormatterStyle styleFromArgString(const UString& string, CFDateFormatterStyle defaultStyle) 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (string == "short") 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return kCFDateFormatterShortStyle; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (string == "medium") 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return kCFDateFormatterMediumStyle; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (string == "long") 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return kCFDateFormatterLongStyle; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (string == "full") 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return kCFDateFormatterFullStyle; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return defaultStyle; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic JSCell* formatLocaleDate(ExecState* exec, DateInstance*, double timeInMilliseconds, LocaleDateTimeFormat format) 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFDateFormatterStyle dateStyle = (format != LocaleTime ? kCFDateFormatterLongStyle : kCFDateFormatterNoStyle); 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFDateFormatterStyle timeStyle = (format != LocaleDate ? kCFDateFormatterLongStyle : kCFDateFormatterNoStyle); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool useCustomFormat = false; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UString customFormatString; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke UString arg0String = exec->argument(0).toString(exec); 1575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (arg0String == "custom" && !exec->argument(1).isUndefined()) { 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project useCustomFormat = true; 1595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke customFormatString = exec->argument(1).toString(exec); 1605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } else if (format == LocaleDateAndTime && !exec->argument(1).isUndefined()) { 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dateStyle = styleFromArgString(arg0String, dateStyle); 1625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke timeStyle = styleFromArgString(exec->argument(1).toString(exec), timeStyle); 1635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } else if (format != LocaleTime && !exec->argument(0).isUndefined()) 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dateStyle = styleFromArgString(arg0String, dateStyle); 1655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke else if (format != LocaleDate && !exec->argument(0).isUndefined()) 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project timeStyle = styleFromArgString(arg0String, timeStyle); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFLocaleRef locale = CFLocaleCopyCurrent(); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDateFormatterRef formatter = CFDateFormatterCreate(0, locale, dateStyle, timeStyle); 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(locale); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (useCustomFormat) { 173f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick CFStringRef customFormatCFString = CFStringCreateWithCharacters(0, customFormatString.characters(), customFormatString.length()); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDateFormatterSetFormat(formatter, customFormatCFString); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(customFormatCFString); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFStringRef string = CFDateFormatterCreateStringWithAbsoluteTime(0, formatter, floor(timeInMilliseconds / msPerSecond) - kCFAbsoluteTimeIntervalSince1970); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(formatter); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We truncate the string returned from CFDateFormatter if it's absurdly long (> 200 characters). 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // That's not great error handling, but it just won't happen so it doesn't matter. 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UChar buffer[200]; 185e14391e94c850b8bd03680c23b38978db68687a8John Reck const size_t bufferLength = WTF_ARRAY_LENGTH(buffer); 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size_t length = CFStringGetLength(string); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(length <= bufferLength); 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (length > bufferLength) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project length = bufferLength; 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFStringGetCharacters(string, CFRangeMake(0, length), buffer); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(string); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return jsNontrivialString(exec, UString(buffer, length)); 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else // !PLATFORM(MAC) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic JSCell* formatLocaleDate(ExecState* exec, const GregorianDateTime& gdt, LocaleDateTimeFormat format) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if HAVE(LANGINFO_H) 2028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian static const nl_item formats[] = { D_T_FMT, D_FMT, T_FMT }; 203d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif (OS(WINCE) && !PLATFORM(QT)) || OS(SYMBIAN) 204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // strftime() does not support '#' on WinCE or Symbian 2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const char* const formatStrings[] = { "%c", "%x", "%X" }; 2068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static const char* const formatStrings[] = { "%#c", "%#x", "%X" }; 2088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Offset year if needed 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct tm localTM = gdt; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int year = gdt.year + 1900; 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool yearNeedsOffset = year < 1900 || year > 2038; 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (yearNeedsOffset) 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project localTM.tm_year = equivalentYearForDST(year) - 1900; 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if HAVE(LANGINFO_H) 2188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // We do not allow strftime to generate dates with 2-digits years, 2198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // both to avoid ambiguity, and a crash in strncpy, for years that 2208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // need offset. 2218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian char* formatString = strdup(nl_langinfo(formats[format])); 2228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian char* yPos = strchr(formatString, 'y'); 2238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (yPos) 2248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *yPos = 'Y'; 2258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 2268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do the formatting 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const int bufsize = 128; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char timebuffer[bufsize]; 2308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if HAVE(LANGINFO_H) 2328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian size_t ret = strftime(timebuffer, bufsize, formatString, &localTM); 2338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian free(formatString); 2348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size_t ret = strftime(timebuffer, bufsize, formatStrings[format], &localTM); 2368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ret == 0) 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return jsEmptyString(exec); 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Copy original into the buffer 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (yearNeedsOffset && format != LocaleTime) { 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static const int yearLen = 5; // FIXME will be a problem in the year 10,000 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char yearString[yearLen]; 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project snprintf(yearString, yearLen, "%d", localTM.tm_year + 1900); 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char* yearLocation = strstr(timebuffer, yearString); 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project snprintf(yearString, yearLen, "%d", year); 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project strncpy(yearLocation, yearString, yearLen - 1); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Convert multi-byte result to UNICODE. 2546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // If __STDC_ISO_10646__ is defined, wide character represents 2556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // UTF-16 (or UTF-32) code point. In most modern Unix like system 2566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // (e.g. Linux with glibc 2.2 and above) the macro is defined, 2576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // and wide character represents UTF-32 code point. 2586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Here we static_cast potential UTF-32 to UTF-16, it should be 2596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // safe because date and (or) time related characters in different languages 2606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // should be in UNICODE BMP. If mbstowcs fails, we just fall 2616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // back on using multi-byte result as-is. 2626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#ifdef __STDC_ISO_10646__ 2636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen UChar buffer[bufsize]; 2646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen wchar_t tempbuffer[bufsize]; 2656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen size_t length = mbstowcs(tempbuffer, timebuffer, bufsize - 1); 2666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (length != static_cast<size_t>(-1)) { 2676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen for (size_t i = 0; i < length; ++i) 2686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen buffer[i] = static_cast<UChar>(tempbuffer[i]); 2696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return jsNontrivialString(exec, UString(buffer, length)); 2706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 2716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif 2726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return jsNontrivialString(exec, timebuffer); 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic JSCell* formatLocaleDate(ExecState* exec, DateInstance* dateObject, double, LocaleDateTimeFormat format) 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = dateObject->gregorianDateTime(exec); 279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 280cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return jsNontrivialString(exec, "Invalid Date"); 281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return formatLocaleDate(exec, *gregorianDateTime, format); 282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // !PLATFORM(MAC) 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Converts a list of arguments sent to a Date member function into milliseconds, updating 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ms (representing milliseconds) and t (representing the rest of the date structure) appropriately. 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Format of member function: f([hour,] [min,] [sec,] [ms]) 2905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic bool fillStructuresUsingTimeArgs(ExecState* exec, int maxArgs, double* ms, GregorianDateTime* t) 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double milliseconds = 0; 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok = true; 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int idx = 0; 2955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke int numArgs = exec->argumentCount(); 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // JS allows extra trailing arguments -- ignore them 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (numArgs > maxArgs) 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project numArgs = maxArgs; 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // hours 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (maxArgs >= 4 && idx < numArgs) { 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t->hour = 0; 30468513a70bcd92384395513322f1b801e7bf9c729Steve Block double hours = exec->argument(idx++).toIntegerPreserveNaN(exec); 30568513a70bcd92384395513322f1b801e7bf9c729Steve Block ok = isfinite(hours); 30668513a70bcd92384395513322f1b801e7bf9c729Steve Block milliseconds += hours * msPerHour; 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // minutes 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (maxArgs >= 3 && idx < numArgs && ok) { 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t->minute = 0; 31268513a70bcd92384395513322f1b801e7bf9c729Steve Block double minutes = exec->argument(idx++).toIntegerPreserveNaN(exec); 31368513a70bcd92384395513322f1b801e7bf9c729Steve Block ok = isfinite(minutes); 31468513a70bcd92384395513322f1b801e7bf9c729Steve Block milliseconds += minutes * msPerMinute; 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // seconds 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (maxArgs >= 2 && idx < numArgs && ok) { 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t->second = 0; 32068513a70bcd92384395513322f1b801e7bf9c729Steve Block double seconds = exec->argument(idx++).toIntegerPreserveNaN(exec); 32168513a70bcd92384395513322f1b801e7bf9c729Steve Block ok = isfinite(seconds); 32268513a70bcd92384395513322f1b801e7bf9c729Steve Block milliseconds += seconds * msPerSecond; 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ok) 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // milliseconds 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (idx < numArgs) { 33068513a70bcd92384395513322f1b801e7bf9c729Steve Block double millis = exec->argument(idx).toIntegerPreserveNaN(exec); 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ok = isfinite(millis); 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project milliseconds += millis; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project milliseconds += *ms; 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *ms = milliseconds; 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ok; 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Converts a list of arguments sent to a Date member function into years, months, and milliseconds, updating 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ms (representing milliseconds) and t (representing the rest of the date structure) appropriately. 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Format of member function: f([years,] [months,] [days]) 3445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic bool fillStructuresUsingDateArgs(ExecState *exec, int maxArgs, double *ms, GregorianDateTime *t) 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int idx = 0; 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ok = true; 3485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke int numArgs = exec->argumentCount(); 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // JS allows extra trailing arguments -- ignore them 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (numArgs > maxArgs) 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project numArgs = maxArgs; 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // years 35568513a70bcd92384395513322f1b801e7bf9c729Steve Block if (maxArgs >= 3 && idx < numArgs) { 35668513a70bcd92384395513322f1b801e7bf9c729Steve Block double years = exec->argument(idx++).toIntegerPreserveNaN(exec); 35768513a70bcd92384395513322f1b801e7bf9c729Steve Block ok = isfinite(years); 35868513a70bcd92384395513322f1b801e7bf9c729Steve Block t->year = toInt32(years - 1900); 35968513a70bcd92384395513322f1b801e7bf9c729Steve Block } 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // months 36168513a70bcd92384395513322f1b801e7bf9c729Steve Block if (maxArgs >= 2 && idx < numArgs && ok) { 36268513a70bcd92384395513322f1b801e7bf9c729Steve Block double months = exec->argument(idx++).toIntegerPreserveNaN(exec); 36368513a70bcd92384395513322f1b801e7bf9c729Steve Block ok = isfinite(months); 36468513a70bcd92384395513322f1b801e7bf9c729Steve Block t->month = toInt32(months); 36568513a70bcd92384395513322f1b801e7bf9c729Steve Block } 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // days 36768513a70bcd92384395513322f1b801e7bf9c729Steve Block if (idx < numArgs && ok) { 36868513a70bcd92384395513322f1b801e7bf9c729Steve Block double days = exec->argument(idx++).toIntegerPreserveNaN(exec); 36968513a70bcd92384395513322f1b801e7bf9c729Steve Block ok = isfinite(days); 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t->monthDay = 0; 37168513a70bcd92384395513322f1b801e7bf9c729Steve Block *ms += days * msPerDay; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ok; 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 37781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst ClassInfo DatePrototype::s_info = {"Date", &DateInstance::s_info, 0, ExecState::dateTable}; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* Source for DatePrototype.lut.h 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@begin dateTable 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toString dateProtoFuncToString DontEnum|Function 0 3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch toISOString dateProtoFuncToISOString DontEnum|Function 0 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toUTCString dateProtoFuncToUTCString DontEnum|Function 0 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toDateString dateProtoFuncToDateString DontEnum|Function 0 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toTimeString dateProtoFuncToTimeString DontEnum|Function 0 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toLocaleString dateProtoFuncToLocaleString DontEnum|Function 0 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toLocaleDateString dateProtoFuncToLocaleDateString DontEnum|Function 0 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toLocaleTimeString dateProtoFuncToLocaleTimeString DontEnum|Function 0 389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project valueOf dateProtoFuncGetTime DontEnum|Function 0 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getTime dateProtoFuncGetTime DontEnum|Function 0 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getFullYear dateProtoFuncGetFullYear DontEnum|Function 0 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCFullYear dateProtoFuncGetUTCFullYear DontEnum|Function 0 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project toGMTString dateProtoFuncToGMTString DontEnum|Function 0 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getMonth dateProtoFuncGetMonth DontEnum|Function 0 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCMonth dateProtoFuncGetUTCMonth DontEnum|Function 0 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getDate dateProtoFuncGetDate DontEnum|Function 0 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCDate dateProtoFuncGetUTCDate DontEnum|Function 0 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getDay dateProtoFuncGetDay DontEnum|Function 0 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCDay dateProtoFuncGetUTCDay DontEnum|Function 0 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getHours dateProtoFuncGetHours DontEnum|Function 0 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCHours dateProtoFuncGetUTCHours DontEnum|Function 0 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getMinutes dateProtoFuncGetMinutes DontEnum|Function 0 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCMinutes dateProtoFuncGetUTCMinutes DontEnum|Function 0 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getSeconds dateProtoFuncGetSeconds DontEnum|Function 0 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCSeconds dateProtoFuncGetUTCSeconds DontEnum|Function 0 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getMilliseconds dateProtoFuncGetMilliSeconds DontEnum|Function 0 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getUTCMilliseconds dateProtoFuncGetUTCMilliseconds DontEnum|Function 0 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getTimezoneOffset dateProtoFuncGetTimezoneOffset DontEnum|Function 0 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setTime dateProtoFuncSetTime DontEnum|Function 1 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setMilliseconds dateProtoFuncSetMilliSeconds DontEnum|Function 1 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setUTCMilliseconds dateProtoFuncSetUTCMilliseconds DontEnum|Function 1 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setSeconds dateProtoFuncSetSeconds DontEnum|Function 2 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setUTCSeconds dateProtoFuncSetUTCSeconds DontEnum|Function 2 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setMinutes dateProtoFuncSetMinutes DontEnum|Function 3 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setUTCMinutes dateProtoFuncSetUTCMinutes DontEnum|Function 3 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setHours dateProtoFuncSetHours DontEnum|Function 4 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setUTCHours dateProtoFuncSetUTCHours DontEnum|Function 4 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setDate dateProtoFuncSetDate DontEnum|Function 1 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setUTCDate dateProtoFuncSetUTCDate DontEnum|Function 1 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setMonth dateProtoFuncSetMonth DontEnum|Function 2 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setUTCMonth dateProtoFuncSetUTCMonth DontEnum|Function 2 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setFullYear dateProtoFuncSetFullYear DontEnum|Function 3 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setUTCFullYear dateProtoFuncSetUTCFullYear DontEnum|Function 3 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setYear dateProtoFuncSetYear DontEnum|Function 1 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getYear dateProtoFuncGetYear DontEnum|Function 0 426e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke toJSON dateProtoFuncToJSON DontEnum|Function 1 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 429635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ECMA 15.9.4 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochDatePrototype::DatePrototype(ExecState* exec, JSGlobalObject* globalObject, Structure* structure) 433cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block : DateInstance(exec, structure) 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 43581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(inherits(&s_info)); 43681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The constructor will be added later, after DateConstructor has been built. 4382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block putAnonymousValue(exec->globalData(), 0, globalObject); 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool DatePrototype::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return getStaticFunctionSlot<JSObject>(exec, ExecState::dateTable(exec), this, propertyName, slot); 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 446231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 447231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool DatePrototype::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) 448231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 449231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return getStaticFunctionDescriptor<JSObject>(exec, ExecState::dateTable(exec), this, propertyName, descriptor); 450231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 451231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Functions 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 454545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToString(ExecState* exec) 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 45781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 458545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 464545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, "Invalid Date")); 465d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer date; 466d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer time; 467d0825bca7fe65beaee391d30da42e937db621564Steve Block formatDate(*gregorianDateTime, date); 468d0825bca7fe65beaee391d30da42e937db621564Steve Block formatTime(*gregorianDateTime, time); 469545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsMakeNontrivialString(exec, date, " ", time)); 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 472545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToUTCString(ExecState* exec) 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 47581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 476545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 482545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, "Invalid Date")); 483d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer date; 484d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer time; 485d0825bca7fe65beaee391d30da42e937db621564Steve Block formatDateUTCVariant(*gregorianDateTime, date); 486d0825bca7fe65beaee391d30da42e937db621564Steve Block formatTimeUTC(*gregorianDateTime, time); 487545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsMakeNontrivialString(exec, date, " ", time)); 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 490545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToISOString(ExecState* exec) 4910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 4925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 49381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 494545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 4950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch DateInstance* thisDateObj = asDateInstance(thisValue); 4970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 500545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, "Invalid Date")); 501231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Maximum amount of space we need in buffer: 6 (max. digits in year) + 2 * 5 (2 characters each for month, day, hour, minute, second) + 4 (. + 3 digits for milliseconds) 502231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // 6 for formatting and one for null termination = 27. We add one extra character to allow us to force null termination. 503231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block char buffer[28]; 504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block snprintf(buffer, sizeof(buffer) - 1, "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", 1900 + gregorianDateTime->year, gregorianDateTime->month + 1, gregorianDateTime->monthDay, gregorianDateTime->hour, gregorianDateTime->minute, gregorianDateTime->second, static_cast<int>(fmod(thisDateObj->internalNumber(), 1000))); 5050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch buffer[sizeof(buffer) - 1] = 0; 506545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, buffer)); 5070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 5080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 509545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToDateString(ExecState* exec) 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 51281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 513545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 518643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 519545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, "Invalid Date")); 520d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer date; 521d0825bca7fe65beaee391d30da42e937db621564Steve Block formatDate(*gregorianDateTime, date); 522545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, date)); 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 525545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToTimeString(ExecState* exec) 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 52881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 529545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 533643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 534643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 535545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, "Invalid Date")); 536d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer time; 537d0825bca7fe65beaee391d30da42e937db621564Steve Block formatTime(*gregorianDateTime, time); 538545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, time)); 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 541545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToLocaleString(ExecState* exec) 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 54481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 545545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 548545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(formatLocaleDate(exec, thisDateObj, thisDateObj->internalNumber(), LocaleDateAndTime)); 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 551545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToLocaleDateString(ExecState* exec) 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 55481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 555545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 558545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(formatLocaleDate(exec, thisDateObj, thisDateObj->internalNumber(), LocaleDate)); 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 561545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToLocaleTimeString(ExecState* exec) 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 56481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 565545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 568545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(formatLocaleDate(exec, thisDateObj, thisDateObj->internalNumber(), LocaleTime)); 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 571545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetTime(ExecState* exec) 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 57481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 575545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 577545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(asDateInstance(thisValue)->internalValue()); 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 580545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetFullYear(ExecState* exec) 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 58381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 584545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 588643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 589643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 590e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 591e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(1900 + gregorianDateTime->year)); 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 594545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCFullYear(ExecState* exec) 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 59781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 598545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 602643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 603643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 604e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 605e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(1900 + gregorianDateTime->year)); 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToGMTString(ExecState* exec) 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 61181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 612545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 617643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 618545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNontrivialString(exec, "Invalid Date")); 619d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer date; 620d0825bca7fe65beaee391d30da42e937db621564Steve Block DateConversionBuffer time; 621d0825bca7fe65beaee391d30da42e937db621564Steve Block formatDateUTCVariant(*gregorianDateTime, date); 622d0825bca7fe65beaee391d30da42e937db621564Steve Block formatTimeUTC(*gregorianDateTime, time); 623545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsMakeNontrivialString(exec, date, " ", time)); 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 626545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetMonth(ExecState* exec) 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 62981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 630545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 635643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 636e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 637e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->month)); 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 640545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCMonth(ExecState* exec) 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 64381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 644545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 650e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 651e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->month)); 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 654545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetDate(ExecState* exec) 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 65781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 658545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 662643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 663643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 664e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 665e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->monthDay)); 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCDate(ExecState* exec) 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 67181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 672545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 676643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 678e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 679e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->monthDay)); 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 682545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetDay(ExecState* exec) 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 68581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 686545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 690643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 691643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 692e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 693e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->weekDay)); 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 696545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCDay(ExecState* exec) 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 69981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 700545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 704643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 705643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 706e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 707e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->weekDay)); 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 710545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetHours(ExecState* exec) 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 71381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 714545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 719643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 720e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 721e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->hour)); 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 724545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCHours(ExecState* exec) 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 72781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 728545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 732643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 733643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 734e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 735e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->hour)); 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetMinutes(ExecState* exec) 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 74181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 742545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 746643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 747643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 748e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 749e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->minute)); 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 752545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCMinutes(ExecState* exec) 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 75581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 756545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 760643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 761643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 762e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 763e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->minute)); 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 766545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetSeconds(ExecState* exec) 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 76981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 770545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 774643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 775643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 776e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 777e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->second)); 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 780545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCSeconds(ExecState* exec) 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 78381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 784545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 788643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec); 789643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 790e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 791e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->second)); 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 794545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetMilliSeconds(ExecState* exec) 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 79781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 798545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double milli = thisDateObj->internalNumber(); 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isnan(milli)) 803e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double secs = floor(milli / msPerSecond); 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double ms = milli - secs * msPerSecond; 807e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(ms)); 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 810545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCMilliseconds(ExecState* exec) 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 81381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 814545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double milli = thisDateObj->internalNumber(); 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isnan(milli)) 819e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double secs = floor(milli / msPerSecond); 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double ms = milli - secs * msPerSecond; 823e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(ms)); 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 826545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetTimezoneOffset(ExecState* exec) 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 82981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 830545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 834643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 835643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 836e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 837e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(-gregorianDateTime->utcOffset / minutesPerHour)); 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 840545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetTime(ExecState* exec) 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 84381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 844545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke double milli = timeClip(exec->argument(0).toNumber(exec)); 849e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNumber(milli); 8502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 851545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 854545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue setNewValueFromTimeArgs(ExecState* exec, int numArgsToUse, bool inputIsUTC) 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 85781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 858545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double milli = thisDateObj->internalNumber(); 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!exec->argumentCount() || isnan(milli)) { 864e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNaN(); 8652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 866545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double secs = floor(milli / msPerSecond); 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double ms = milli - secs * msPerSecond; 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 872643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* other = inputIsUTC 873643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ? thisDateObj->gregorianDateTimeUTC(exec) 874643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : thisDateObj->gregorianDateTime(exec); 875643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!other) 876e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GregorianDateTime gregorianDateTime; 879643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gregorianDateTime.copyFrom(*other); 8805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!fillStructuresUsingTimeArgs(exec, numArgsToUse, &ms, &gregorianDateTime)) { 881e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNaN(); 8822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 883545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 886e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNumber(gregorianDateTimeToMS(exec, gregorianDateTime, ms, inputIsUTC)); 8872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 888545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 891545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue setNewValueFromDateArgs(ExecState* exec, int numArgsToUse, bool inputIsUTC) 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 89481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 895545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 8985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!exec->argumentCount()) { 899e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNaN(); 9002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 901545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double milli = thisDateObj->internalNumber(); 905643ca7872b450ea4efacab6188849e5aac2ba161Steve Block double ms = 0; 906643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 907643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GregorianDateTime gregorianDateTime; 908643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (numArgsToUse == 3 && isnan(milli)) 909643ca7872b450ea4efacab6188849e5aac2ba161Steve Block msToGregorianDateTime(exec, 0, true, gregorianDateTime); 910643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 911643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ms = milli - floor(milli / msPerSecond) * msPerSecond; 912643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* other = inputIsUTC 913643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ? thisDateObj->gregorianDateTimeUTC(exec) 914643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : thisDateObj->gregorianDateTime(exec); 915643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!other) 916e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 917643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gregorianDateTime.copyFrom(*other); 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!fillStructuresUsingDateArgs(exec, numArgsToUse, &ms, &gregorianDateTime)) { 921e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNaN(); 9222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 923545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 926e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNumber(gregorianDateTimeToMS(exec, gregorianDateTime, ms, inputIsUTC)); 9272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 928545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 931545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetMilliSeconds(ExecState* exec) 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = false; 9345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 1, inputIsUTC); 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 937545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCMilliseconds(ExecState* exec) 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = true; 9405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 1, inputIsUTC); 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 943545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetSeconds(ExecState* exec) 9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = false; 9465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 2, inputIsUTC); 9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 949545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCSeconds(ExecState* exec) 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = true; 9525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 2, inputIsUTC); 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 955545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetMinutes(ExecState* exec) 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = false; 9585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 3, inputIsUTC); 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 961545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCMinutes(ExecState* exec) 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = true; 9645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 3, inputIsUTC); 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 967545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetHours(ExecState* exec) 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = false; 9705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 4, inputIsUTC); 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 973545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCHours(ExecState* exec) 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = true; 9765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromTimeArgs(exec, 4, inputIsUTC); 9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 979545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetDate(ExecState* exec) 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = false; 9825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromDateArgs(exec, 1, inputIsUTC); 9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 985545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCDate(ExecState* exec) 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = true; 9885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromDateArgs(exec, 1, inputIsUTC); 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 991545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetMonth(ExecState* exec) 9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = false; 9945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromDateArgs(exec, 2, inputIsUTC); 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 997545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCMonth(ExecState* exec) 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = true; 10005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromDateArgs(exec, 2, inputIsUTC); 10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1003545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetFullYear(ExecState* exec) 10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = false; 10065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromDateArgs(exec, 3, inputIsUTC); 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1009545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetUTCFullYear(ExecState* exec) 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const bool inputIsUTC = true; 10125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return setNewValueFromDateArgs(exec, 3, inputIsUTC); 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1015545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncSetYear(ExecState* exec) 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 101881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 1019545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 10225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!exec->argumentCount()) { 1023e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNaN(); 10242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 1025545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double milli = thisDateObj->internalNumber(); 10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double ms = 0; 10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1031643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GregorianDateTime gregorianDateTime; 10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isnan(milli)) 10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Based on ECMA 262 B.2.5 (setYear) 10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the time must be reset to +0 if it is NaN. 1035643ca7872b450ea4efacab6188849e5aac2ba161Steve Block msToGregorianDateTime(exec, 0, true, gregorianDateTime); 10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double secs = floor(milli / msPerSecond); 10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ms = milli - secs * msPerSecond; 1039643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (const GregorianDateTime* other = thisDateObj->gregorianDateTime(exec)) 1040643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gregorianDateTime.copyFrom(*other); 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 104368513a70bcd92384395513322f1b801e7bf9c729Steve Block double year = exec->argument(0).toIntegerPreserveNaN(exec); 104468513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!isfinite(year)) { 1045e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNaN(); 10462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 1047545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 105068513a70bcd92384395513322f1b801e7bf9c729Steve Block gregorianDateTime.year = toInt32((year > 99 || year < 0) ? year - 1900 : year); 1051e14391e94c850b8bd03680c23b38978db68687a8John Reck JSValue result = jsNumber(gregorianDateTimeToMS(exec, gregorianDateTime, ms, false)); 10522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block thisDateObj->setInternalValue(exec->globalData(), result); 1053545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1056545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncGetYear(ExecState* exec) 10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 105981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!thisValue.inherits(&DateInstance::s_info)) 1060545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMTypeError(exec); 10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DateInstance* thisDateObj = asDateInstance(thisValue); 10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1064643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec); 1065643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!gregorianDateTime) 1066e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNaN()); 10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NOTE: IE returns the full year even in getYear. 1069e14391e94c850b8bd03680c23b38978db68687a8John Reck return JSValue::encode(jsNumber(gregorianDateTime->year)); 10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1072545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL dateProtoFuncToJSON(ExecState* exec) 10730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 10745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue thisValue = exec->hostThisValue(); 10750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSObject* object = thisValue.toThisObject(exec); 10760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (exec->hadException()) 1077545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNull()); 10780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSValue toISOValue = object->get(exec, exec->globalData().propertyNames->toISOString); 10800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (exec->hadException()) 1081545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNull()); 10820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CallData callData; 1084545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch CallType callType = getCallData(toISOValue, callData); 10850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (callType == CallTypeNone) 1086545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMError(exec, createTypeError(exec, "toISOString is not a function")); 10870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSValue result = call(exec, asObject(toISOValue), callType, callData, object, exec->emptyList()); 10890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (exec->hadException()) 1090545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(jsNull()); 10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (result.isObject()) 1092545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwVMError(exec, createTypeError(exec, "toISOString did not return a primitive value")); 1093545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 10940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 10950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 1097