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