1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the Qt Solutions component.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 **   * Redistributions of source code must retain the above copyright
15 **     notice, this list of conditions and the following disclaimer.
16 **   * Redistributions in binary form must reproduce the above copyright
17 **     notice, this list of conditions and the following disclaimer in
18 **     the documentation and/or other materials provided with the
19 **     distribution.
20 **   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
21 **     of its contributors may be used to endorse or promote products derived
22 **     from this software without specific prior written permission.
23 **
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 
42 #include "qscriptecmadate_p.h"
43 
44 
45 #include "qscriptengine_p.h"
46 #include "qscriptvalueimpl_p.h"
47 #include "qscriptcontext_p.h"
48 #include "qscriptmember_p.h"
49 #include "qscriptobject_p.h"
50 
51 #include <QDateTime>
52 #include <QRegExp>
53 #include <QtDebug>
54 #include <QLocale>
55 #include <qnumeric.h>
56 
57 #include <math.h>
58 
59 #ifndef Q_OS_WIN
60 #  include <time.h>
61 #  ifndef Q_OS_VXWORKS
62 #    include <sys/time.h>
63 #  else
64 #    include "qplatformdefs.h"
65 #  endif
66 #else
67 #  include <windows.h>
68 #endif
69 
70 QT_BEGIN_NAMESPACE
71 
72 namespace QScript {
73 
74 static const qsreal HoursPerDay = 24.0;
75 static const qsreal MinutesPerHour = 60.0;
76 static const qsreal SecondsPerMinute = 60.0;
77 static const qsreal msPerSecond = 1000.0;
78 static const qsreal msPerMinute = 60000.0;
79 static const qsreal msPerHour = 3600000.0;
80 static const qsreal msPerDay = 86400000.0;
81 
82 static qsreal LocalTZA = 0.0; // initialized at startup
83 
TimeWithinDay(qsreal t)84 static inline qsreal TimeWithinDay(qsreal t)
85 {
86     qsreal r = ::fmod(t, msPerDay);
87     return (r >= 0) ? r : r + msPerDay;
88 }
89 
HourFromTime(qsreal t)90 static inline int HourFromTime(qsreal t)
91 {
92     int r = int(::fmod(::floor(t / msPerHour), HoursPerDay));
93     return (r >= 0) ? r : r + int(HoursPerDay);
94 }
95 
MinFromTime(qsreal t)96 static inline int MinFromTime(qsreal t)
97 {
98     int r = int(::fmod(::floor(t / msPerMinute), MinutesPerHour));
99     return (r >= 0) ? r : r + int(MinutesPerHour);
100 }
101 
SecFromTime(qsreal t)102 static inline int SecFromTime(qsreal t)
103 {
104     int r = int(::fmod(::floor(t / msPerSecond), SecondsPerMinute));
105     return (r >= 0) ? r : r + int(SecondsPerMinute);
106 }
107 
msFromTime(qsreal t)108 static inline int msFromTime(qsreal t)
109 {
110     int r = int(::fmod(t, msPerSecond));
111     return (r >= 0) ? r : r + int(msPerSecond);
112 }
113 
Day(qsreal t)114 static inline qsreal Day(qsreal t)
115 {
116     return ::floor(t / msPerDay);
117 }
118 
DaysInYear(qsreal y)119 static inline qsreal DaysInYear(qsreal y)
120 {
121     if (::fmod(y, 4))
122         return 365;
123 
124     else if (::fmod(y, 100))
125         return 366;
126 
127     else if (::fmod(y, 400))
128         return 365;
129 
130     return 366;
131 }
132 
DayFromYear(qsreal y)133 static inline qsreal DayFromYear(qsreal y)
134 {
135     return 365 * (y - 1970)
136         + ::floor((y - 1969) / 4)
137         - ::floor((y - 1901) / 100)
138         + ::floor((y - 1601) / 400);
139 }
140 
TimeFromYear(qsreal y)141 static inline qsreal TimeFromYear(qsreal y)
142 {
143     return msPerDay * DayFromYear(y);
144 }
145 
YearFromTime(qsreal t)146 static inline qsreal YearFromTime(qsreal t)
147 {
148     int y = 1970;
149     y += (int) ::floor(t / (msPerDay * 365.2425));
150 
151     qsreal t2 = TimeFromYear(y);
152     return (t2 > t) ? y - 1 : ((t2 + msPerDay * DaysInYear(y)) <= t) ? y + 1 : y;
153 }
154 
InLeapYear(qsreal t)155 static inline bool InLeapYear(qsreal t)
156 {
157     qsreal x = DaysInYear(YearFromTime(t));
158     if (x == 365)
159         return 0;
160 
161     Q_ASSERT (x == 366);
162     return 1;
163 }
164 
DayWithinYear(qsreal t)165 static inline qsreal DayWithinYear(qsreal t)
166 {
167     return Day(t) - DayFromYear(YearFromTime(t));
168 }
169 
MonthFromTime(qsreal t)170 static inline qsreal MonthFromTime(qsreal t)
171 {
172     qsreal d = DayWithinYear(t);
173     qsreal l = InLeapYear(t);
174 
175     if (d < 31.0)
176         return 0;
177 
178     else if (d < 59.0 + l)
179         return 1;
180 
181     else if (d < 90.0 + l)
182         return 2;
183 
184     else if (d < 120.0 + l)
185         return 3;
186 
187     else if (d < 151.0 + l)
188         return 4;
189 
190     else if (d < 181.0 + l)
191         return 5;
192 
193     else if (d < 212.0 + l)
194         return 6;
195 
196     else if (d < 243.0 + l)
197         return 7;
198 
199     else if (d < 273.0 + l)
200         return 8;
201 
202     else if (d < 304.0 + l)
203         return 9;
204 
205     else if (d < 334.0 + l)
206         return 10;
207 
208     else if (d < 365.0 + l)
209         return 11;
210 
211     return qSNaN(); // ### assert?
212 }
213 
DateFromTime(qsreal t)214 static inline qsreal DateFromTime(qsreal t)
215 {
216     int m = (int) QScriptEnginePrivate::toInteger(MonthFromTime(t));
217     qsreal d = DayWithinYear(t);
218     qsreal l = InLeapYear(t);
219 
220     switch (m) {
221     case 0: return d + 1.0;
222     case 1: return d - 30.0;
223     case 2: return d - 58.0 - l;
224     case 3: return d - 89.0 - l;
225     case 4: return d - 119.0 - l;
226     case 5: return d - 150.0 - l;
227     case 6: return d - 180.0 - l;
228     case 7: return d - 211.0 - l;
229     case 8: return d - 242.0 - l;
230     case 9: return d - 272.0 - l;
231     case 10: return d - 303.0 - l;
232     case 11: return d - 333.0 - l;
233     }
234 
235     return qSNaN(); // ### assert
236 }
237 
WeekDay(qsreal t)238 static inline qsreal WeekDay(qsreal t)
239 {
240     qsreal r = ::fmod (Day(t) + 4.0, 7.0);
241     return (r >= 0) ? r : r + 7.0;
242 }
243 
244 
MakeTime(qsreal hour,qsreal min,qsreal sec,qsreal ms)245 static inline qsreal MakeTime(qsreal hour, qsreal min, qsreal sec, qsreal ms)
246 {
247     return ((hour * MinutesPerHour + min) * SecondsPerMinute + sec) * msPerSecond + ms;
248 }
249 
DayFromMonth(qsreal month,qsreal leap)250 static inline qsreal DayFromMonth(qsreal month, qsreal leap)
251 {
252     switch ((int) month) {
253     case 0: return 0;
254     case 1: return 31.0;
255     case 2: return 59.0 + leap;
256     case 3: return 90.0 + leap;
257     case 4: return 120.0 + leap;
258     case 5: return 151.0 + leap;
259     case 6: return 181.0 + leap;
260     case 7: return 212.0 + leap;
261     case 8: return 243.0 + leap;
262     case 9: return 273.0 + leap;
263     case 10: return 304.0 + leap;
264     case 11: return 334.0 + leap;
265     }
266 
267     return qSNaN(); // ### assert?
268 }
269 
MakeDay(qsreal year,qsreal month,qsreal day)270 static qsreal MakeDay(qsreal year, qsreal month, qsreal day)
271 {
272     year += ::floor(month / 12.0);
273 
274     month = ::fmod(month, 12.0);
275     if (month < 0)
276         month += 12.0;
277 
278     qsreal t = TimeFromYear(year);
279     qsreal leap = InLeapYear(t);
280 
281     day += ::floor(t / msPerDay);
282     day += DayFromMonth(month, leap);
283 
284     return day - 1;
285 }
286 
MakeDate(qsreal day,qsreal time)287 static inline qsreal MakeDate(qsreal day, qsreal time)
288 {
289     return day * msPerDay + time;
290 }
291 
DaylightSavingTA(double t)292 static inline qsreal DaylightSavingTA(double t)
293 {
294 #ifndef Q_OS_WIN
295     long int tt = (long int)(t / msPerSecond);
296     struct tm *tmtm = localtime((const time_t*)&tt);
297     if (! tmtm)
298         return 0;
299     return (tmtm->tm_isdst > 0) ? msPerHour : 0;
300 #else
301     Q_UNUSED(t);
302     /// ### implement me
303     return 0;
304 #endif
305 }
306 
LocalTime(qsreal t)307 static inline qsreal LocalTime(qsreal t)
308 {
309     return t + LocalTZA + DaylightSavingTA(t);
310 }
311 
UTC(qsreal t)312 static inline qsreal UTC(qsreal t)
313 {
314     return t - LocalTZA - DaylightSavingTA(t - LocalTZA);
315 }
316 
currentTime()317 static inline qsreal currentTime()
318 {
319 #ifndef Q_OS_WIN
320     struct timeval tv;
321 
322     gettimeofday(&tv, 0);
323     return ::floor(tv.tv_sec * msPerSecond + (tv.tv_usec / 1000.0));
324 #else
325     SYSTEMTIME st;
326     GetSystemTime(&st);
327     FILETIME ft;
328     SystemTimeToFileTime(&st, &ft);
329     LARGE_INTEGER li;
330     li.LowPart = ft.dwLowDateTime;
331     li.HighPart = ft.dwHighDateTime;
332     return double(li.QuadPart - Q_INT64_C(116444736000000000)) / 10000.0;
333 #endif
334 }
335 
TimeClip(qsreal t)336 static inline qsreal TimeClip(qsreal t)
337 {
338     if (! qIsFinite(t) || fabs(t) > 8.64e15)
339         return qSNaN();
340     return QScriptEnginePrivate::toInteger(t);
341 }
342 
FromDateTime(const QDateTime & dt)343 static inline qsreal FromDateTime(const QDateTime &dt)
344 {
345     if (!dt.isValid())
346         return qSNaN();
347     QDate date = dt.date();
348     QTime taim = dt.time();
349     int year = date.year();
350     int month = date.month() - 1;
351     int day = date.day();
352     int hours = taim.hour();
353     int mins = taim.minute();
354     int secs = taim.second();
355     int ms = taim.msec();
356     double t = MakeDate(MakeDay(year, month, day),
357                         MakeTime(hours, mins, secs, ms));
358     if (dt.timeSpec() == Qt::LocalTime)
359         t = UTC(t);
360     return TimeClip(t);
361 }
362 
ParseString(const QString & s)363 static inline qsreal ParseString(const QString &s)
364 {
365     QDateTime dt = QDateTime::fromString(s, Qt::TextDate);
366     if (!dt.isValid())
367         dt = QDateTime::fromString(s, Qt::ISODate);
368     if (!dt.isValid()) {
369         QStringList formats;
370         formats << QLatin1String("M/d/yyyy")
371                 << QLatin1String("M/d/yyyy hh:mm")
372                 << QLatin1String("M/d/yyyy hh:mm A")
373 
374                 << QLatin1String("M/d/yyyy, hh:mm")
375                 << QLatin1String("M/d/yyyy, hh:mm A")
376 
377                 << QLatin1String("MMM d yyyy")
378                 << QLatin1String("MMM d yyyy hh:mm")
379                 << QLatin1String("MMM d yyyy hh:mm:ss")
380                 << QLatin1String("MMM d yyyy, hh:mm")
381                 << QLatin1String("MMM d yyyy, hh:mm:ss")
382 
383                 << QLatin1String("MMMM d yyyy")
384                 << QLatin1String("MMMM d yyyy hh:mm")
385                 << QLatin1String("MMMM d yyyy hh:mm:ss")
386                 << QLatin1String("MMMM d yyyy, hh:mm")
387                 << QLatin1String("MMMM d yyyy, hh:mm:ss")
388 
389                 << QLatin1String("MMM d, yyyy")
390                 << QLatin1String("MMM d, yyyy hh:mm")
391                 << QLatin1String("MMM d, yyyy hh:mm:ss")
392 
393                 << QLatin1String("MMMM d, yyyy")
394                 << QLatin1String("MMMM d, yyyy hh:mm")
395                 << QLatin1String("MMMM d, yyyy hh:mm:ss")
396 
397                 << QLatin1String("d MMM yyyy")
398                 << QLatin1String("d MMM yyyy hh:mm")
399                 << QLatin1String("d MMM yyyy hh:mm:ss")
400                 << QLatin1String("d MMM yyyy, hh:mm")
401                 << QLatin1String("d MMM yyyy, hh:mm:ss")
402 
403                 << QLatin1String("d MMMM yyyy")
404                 << QLatin1String("d MMMM yyyy hh:mm")
405                 << QLatin1String("d MMMM yyyy hh:mm:ss")
406                 << QLatin1String("d MMMM yyyy, hh:mm")
407                 << QLatin1String("d MMMM yyyy, hh:mm:ss")
408 
409                 << QLatin1String("d MMM, yyyy")
410                 << QLatin1String("d MMM, yyyy hh:mm")
411                 << QLatin1String("d MMM, yyyy hh:mm:ss")
412 
413                 << QLatin1String("d MMMM, yyyy")
414                 << QLatin1String("d MMMM, yyyy hh:mm")
415                 << QLatin1String("d MMMM, yyyy hh:mm:ss");
416 
417         for (int i = 0; i < formats.size(); ++i) {
418             dt = QDateTime::fromString(s, formats.at(i));
419             if (dt.isValid())
420                 break;
421         }
422     }
423     return FromDateTime(dt);
424 }
425 
426 /*!
427   \internal
428 
429   Converts the ECMA Date value \tt (in UTC form) to QDateTime
430   according to \a spec.
431 */
ToDateTime(qsreal t,Qt::TimeSpec spec)432 static inline QDateTime ToDateTime(qsreal t, Qt::TimeSpec spec)
433 {
434     if (qIsNaN(t))
435         return QDateTime();
436     if (spec == Qt::LocalTime)
437         t = LocalTime(t);
438     int year = int(YearFromTime(t));
439     int month = int(MonthFromTime(t) + 1);
440     int day = int(DateFromTime(t));
441     int hours = HourFromTime(t);
442     int mins = MinFromTime(t);
443     int secs = SecFromTime(t);
444     int ms = msFromTime(t);
445     return QDateTime(QDate(year, month, day), QTime(hours, mins, secs, ms), spec);
446 }
447 
ToString(qsreal t)448 static inline QString ToString(qsreal t)
449 {
450     if (qIsNaN(t))
451         return QLatin1String("Invalid Date");
452     QString str = ToDateTime(t, Qt::LocalTime).toString() + QLatin1String(" GMT");
453     qsreal tzoffset = LocalTZA + DaylightSavingTA(t);
454     if (tzoffset) {
455         int hours = static_cast<int>(::fabs(tzoffset) / 1000 / 60 / 60);
456         int mins = int(::fabs(tzoffset) / 1000 / 60) % 60;
457         str.append(QLatin1Char((tzoffset > 0) ?  '+' : '-'));
458         if (hours < 10)
459             str.append(QLatin1Char('0'));
460         str.append(QString::number(hours));
461         if (mins < 10)
462             str.append(QLatin1Char('0'));
463         str.append(QString::number(mins));
464     }
465     return str;
466 }
467 
ToUTCString(qsreal t)468 static inline QString ToUTCString(qsreal t)
469 {
470     if (qIsNaN(t))
471         return QLatin1String("Invalid Date");
472     return ToDateTime(t, Qt::UTC).toString() + QLatin1String(" GMT");
473 }
474 
ToDateString(qsreal t)475 static inline QString ToDateString(qsreal t)
476 {
477     return ToDateTime(t, Qt::LocalTime).date().toString();
478 }
479 
ToTimeString(qsreal t)480 static inline QString ToTimeString(qsreal t)
481 {
482     return ToDateTime(t, Qt::LocalTime).time().toString();
483 }
484 
ToLocaleString(qsreal t)485 static inline QString ToLocaleString(qsreal t)
486 {
487     return ToDateTime(t, Qt::LocalTime).toString(Qt::LocaleDate);
488 }
489 
ToLocaleDateString(qsreal t)490 static inline QString ToLocaleDateString(qsreal t)
491 {
492     return ToDateTime(t, Qt::LocalTime).date().toString(Qt::LocaleDate);
493 }
494 
ToLocaleTimeString(qsreal t)495 static inline QString ToLocaleTimeString(qsreal t)
496 {
497     return ToDateTime(t, Qt::LocalTime).time().toString(Qt::LocaleDate);
498 }
499 
getLocalTZA()500 static qsreal getLocalTZA()
501 {
502 #ifndef Q_OS_WIN
503     struct tm* t;
504     time_t curr;
505     time(&curr);
506     t = localtime(&curr);
507     time_t locl = mktime(t);
508     t = gmtime(&curr);
509     time_t globl = mktime(t);
510     return double(locl - globl) * 1000.0;
511 #else
512     TIME_ZONE_INFORMATION tzInfo;
513     GetTimeZoneInformation(&tzInfo);
514     return -tzInfo.Bias * 60.0 * 1000.0;
515 #endif
516 }
517 
518 namespace Ecma {
519 
Date(QScriptEnginePrivate * eng)520 Date::Date(QScriptEnginePrivate *eng):
521     Core(eng, QLatin1String("Date"), QScriptClassInfo::DateType)
522 {
523     LocalTZA = getLocalTZA();
524 
525     newDate(&publicPrototype, qSNaN());
526 
527     eng->newConstructor(&ctor, this, publicPrototype);
528     addConstructorFunction(QLatin1String("parse"), method_parse, 1);
529     addConstructorFunction(QLatin1String("UTC"), method_UTC, 7);
530 
531     addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
532     addPrototypeFunction(QLatin1String("toDateString"), method_toDateString, 0);
533     addPrototypeFunction(QLatin1String("toTimeString"), method_toTimeString, 0);
534     addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0);
535     addPrototypeFunction(QLatin1String("toLocaleDateString"), method_toLocaleDateString, 0);
536     addPrototypeFunction(QLatin1String("toLocaleTimeString"), method_toLocaleTimeString, 0);
537     addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
538     addPrototypeFunction(QLatin1String("getTime"), method_getTime, 0);
539     addPrototypeFunction(QLatin1String("getYear"), method_getYear, 0);
540     addPrototypeFunction(QLatin1String("getFullYear"), method_getFullYear, 0);
541     addPrototypeFunction(QLatin1String("getUTCFullYear"), method_getUTCFullYear, 0);
542     addPrototypeFunction(QLatin1String("getMonth"), method_getMonth, 0);
543     addPrototypeFunction(QLatin1String("getUTCMonth"), method_getUTCMonth, 0);
544     addPrototypeFunction(QLatin1String("getDate"), method_getDate, 0);
545     addPrototypeFunction(QLatin1String("getUTCDate"), method_getUTCDate, 0);
546     addPrototypeFunction(QLatin1String("getDay"), method_getDay, 0);
547     addPrototypeFunction(QLatin1String("getUTCDay"), method_getUTCDay, 0);
548     addPrototypeFunction(QLatin1String("getHours"), method_getHours, 0);
549     addPrototypeFunction(QLatin1String("getUTCHours"), method_getUTCHours, 0);
550     addPrototypeFunction(QLatin1String("getMinutes"), method_getMinutes, 0);
551     addPrototypeFunction(QLatin1String("getUTCMinutes"), method_getUTCMinutes, 0);
552     addPrototypeFunction(QLatin1String("getSeconds"), method_getSeconds, 0);
553     addPrototypeFunction(QLatin1String("getUTCSeconds"), method_getUTCSeconds, 0);
554     addPrototypeFunction(QLatin1String("getMilliseconds"), method_getMilliseconds, 0);
555     addPrototypeFunction(QLatin1String("getUTCMilliseconds"), method_getUTCMilliseconds, 0);
556     addPrototypeFunction(QLatin1String("getTimezoneOffset"), method_getTimezoneOffset, 0);
557     addPrototypeFunction(QLatin1String("setTime"), method_setTime, 1);
558     addPrototypeFunction(QLatin1String("setMilliseconds"), method_setMilliseconds, 1);
559     addPrototypeFunction(QLatin1String("setUTCMilliseconds"), method_setUTCMilliseconds, 1);
560     addPrototypeFunction(QLatin1String("setSeconds"), method_setSeconds, 2);
561     addPrototypeFunction(QLatin1String("setUTCSeconds"), method_setUTCSeconds, 2);
562     addPrototypeFunction(QLatin1String("setMinutes"), method_setMinutes, 3);
563     addPrototypeFunction(QLatin1String("setUTCMinutes"), method_setUTCMinutes, 3);
564     addPrototypeFunction(QLatin1String("setHours"), method_setHours, 4);
565     addPrototypeFunction(QLatin1String("setUTCHours"), method_setUTCHours, 4);
566     addPrototypeFunction(QLatin1String("setDate"), method_setDate, 1);
567     addPrototypeFunction(QLatin1String("setUTCDate"), method_setUTCDate, 1);
568     addPrototypeFunction(QLatin1String("setMonth"), method_setMonth, 2);
569     addPrototypeFunction(QLatin1String("setUTCMonth"), method_setUTCMonth, 2);
570     addPrototypeFunction(QLatin1String("setYear"), method_setYear, 1);
571     addPrototypeFunction(QLatin1String("setFullYear"), method_setFullYear, 3);
572     addPrototypeFunction(QLatin1String("setUTCFullYear"), method_setUTCFullYear, 3);
573     addPrototypeFunction(QLatin1String("toUTCString"), method_toUTCString, 0);
574     addPrototypeFunction(QLatin1String("toGMTString"), method_toUTCString, 0);
575 }
576 
~Date()577 Date::~Date()
578 {
579 }
580 
execute(QScriptContextPrivate * context)581 void Date::execute(QScriptContextPrivate *context)
582 {
583 #ifndef Q_SCRIPT_NO_EVENT_NOTIFY
584     engine()->notifyFunctionEntry(context);
585 #endif
586     if (!context->isCalledAsConstructor()) {
587         double t = currentTime();
588         context->setReturnValue(QScriptValueImpl(engine(), ToString(t)));
589     } else {
590         // called as constructor
591         qsreal t;
592 
593         if (context->argumentCount() == 0)
594             t = currentTime();
595 
596         else if (context->argumentCount() == 1) {
597             QScriptValueImpl arg = context->argument(0);
598             if (arg.isDate())
599                 arg = arg.internalValue();
600             else
601                 arg = engine()->toPrimitive(arg);
602             if (arg.isString())
603                 t = ParseString(arg.toString());
604             else
605                 t = TimeClip(arg.toNumber());
606         }
607 
608         else { // context->argumentCount() > 1
609             qsreal year  = context->argument(0).toNumber();
610             qsreal month = context->argument(1).toNumber();
611             qsreal day  = context->argumentCount() >= 3 ? context->argument(2).toNumber() : 1;
612             qsreal hours = context->argumentCount() >= 4 ? context->argument(3).toNumber() : 0;
613             qsreal mins = context->argumentCount() >= 5 ? context->argument(4).toNumber() : 0;
614             qsreal secs = context->argumentCount() >= 6 ? context->argument(5).toNumber() : 0;
615             qsreal ms    = context->argumentCount() >= 7 ? context->argument(6).toNumber() : 0;
616             if (year >= 0 && year <= 99)
617                 year += 1900;
618             t = MakeDate(MakeDay(year, month, day), MakeTime(hours, mins, secs, ms));
619             t = TimeClip(UTC(t));
620         }
621 
622         QScriptValueImpl &obj = context->m_thisObject;
623         obj.setClassInfo(classInfo());
624         obj.setInternalValue(QScriptValueImpl(t));
625         obj.setPrototype(publicPrototype);
626         context->setReturnValue(obj);
627     }
628 #ifndef Q_SCRIPT_NO_EVENT_NOTIFY
629     engine()->notifyFunctionExit(context);
630 #endif
631 }
632 
newDate(QScriptValueImpl * result,qsreal t)633 void Date::newDate(QScriptValueImpl *result, qsreal t)
634 {
635     engine()->newObject(result, publicPrototype, classInfo());
636     result->setInternalValue(QScriptValueImpl(t));
637 }
638 
newDate(QScriptValueImpl * result,const QDateTime & dt)639 void Date::newDate(QScriptValueImpl *result, const QDateTime &dt)
640 {
641     newDate(result, FromDateTime(dt));
642 }
643 
newDate(QScriptValueImpl * result,const QDate & d)644 void Date::newDate(QScriptValueImpl *result, const QDate &d)
645 {
646     newDate(result, QDateTime(d));
647 }
648 
toDateTime(const QScriptValueImpl & date) const649 QDateTime Date::toDateTime(const QScriptValueImpl &date) const
650 {
651     Q_ASSERT(date.classInfo() == classInfo());
652     qsreal t = date.internalValue().toNumber();
653     return ToDateTime(t, Qt::LocalTime);
654 }
655 
method_parse(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo *)656 QScriptValueImpl Date::method_parse(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
657 {
658     return QScriptValueImpl(ParseString(context->argument(0).toString()));
659 }
660 
method_UTC(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo *)661 QScriptValueImpl Date::method_UTC(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
662 {
663     const int numArgs = context->argumentCount();
664     if (numArgs >= 2) {
665         qsreal year  = context->argument(0).toNumber();
666         qsreal month = context->argument(1).toNumber();
667         qsreal day   = numArgs >= 3 ? context->argument(2).toNumber() : 1;
668         qsreal hours = numArgs >= 4 ? context->argument(3).toNumber() : 0;
669         qsreal mins  = numArgs >= 5 ? context->argument(4).toNumber() : 0;
670         qsreal secs  = numArgs >= 6 ? context->argument(5).toNumber() : 0;
671         qsreal ms    = numArgs >= 7 ? context->argument(6).toNumber() : 0;
672         if (year >= 0 && year <= 99)
673             year += 1900;
674         qsreal t = MakeDate(MakeDay(year, month, day),
675                             MakeTime(hours, mins, secs, ms));
676         return QScriptValueImpl(TimeClip(t));
677     }
678     return (eng->undefinedValue());
679 }
680 
method_toString(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)681 QScriptValueImpl Date::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
682 {
683     QScriptValueImpl self = context->thisObject();
684     if (self.classInfo() == classInfo) {
685         qsreal t = self.internalValue().toNumber();
686         return QScriptValueImpl(eng, ToString(t));
687     }
688     return throwThisObjectTypeError(
689         context, QLatin1String("Date.prototype.toString"));
690 }
691 
method_toDateString(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)692 QScriptValueImpl Date::method_toDateString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
693 {
694     QScriptValueImpl self = context->thisObject();
695     if (self.classInfo() == classInfo) {
696         qsreal t = self.internalValue().toNumber();
697         return QScriptValueImpl(eng, ToDateString(t));
698     }
699     return throwThisObjectTypeError(
700         context, QLatin1String("Date.prototype.toDateString"));
701 }
702 
method_toTimeString(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)703 QScriptValueImpl Date::method_toTimeString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
704 {
705     QScriptValueImpl self = context->thisObject();
706     if (self.classInfo() == classInfo) {
707         qsreal t = self.internalValue().toNumber();
708         return QScriptValueImpl(eng, ToTimeString(t));
709     }
710     return throwThisObjectTypeError(
711         context, QLatin1String("Date.prototype.toTimeString"));
712 }
713 
method_toLocaleString(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)714 QScriptValueImpl Date::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
715 {
716     QScriptValueImpl self = context->thisObject();
717     if (self.classInfo() == classInfo) {
718         qsreal t = self.internalValue().toNumber();
719         return QScriptValueImpl(eng, ToLocaleString(t));
720     }
721     return throwThisObjectTypeError(
722         context, QLatin1String("Date.prototype.toLocaleString"));
723 }
724 
method_toLocaleDateString(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)725 QScriptValueImpl Date::method_toLocaleDateString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
726 {
727     QScriptValueImpl self = context->thisObject();
728     if (self.classInfo() == classInfo) {
729         qsreal t = self.internalValue().toNumber();
730         return QScriptValueImpl(eng, ToLocaleDateString(t));
731     }
732     return throwThisObjectTypeError(
733         context, QLatin1String("Date.prototype.toLocaleDateString"));
734 }
735 
method_toLocaleTimeString(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)736 QScriptValueImpl Date::method_toLocaleTimeString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
737 {
738     QScriptValueImpl self = context->thisObject();
739     if (self.classInfo() == classInfo) {
740         qsreal t = self.internalValue().toNumber();
741         return QScriptValueImpl(eng, ToLocaleTimeString(t));
742     }
743     return throwThisObjectTypeError(
744         context, QLatin1String("Date.prototype.toLocaleTimeString"));
745 }
746 
method_valueOf(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)747 QScriptValueImpl Date::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
748 {
749     QScriptValueImpl self = context->thisObject();
750     if (self.classInfo() == classInfo)
751         return QScriptValueImpl(self.internalValue().toNumber());
752     return throwThisObjectTypeError(
753         context, QLatin1String("Date.prototype.valueOf"));
754 }
755 
method_getTime(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)756 QScriptValueImpl Date::method_getTime(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
757 {
758     QScriptValueImpl self = context->thisObject();
759     if (self.classInfo() == classInfo)
760         return QScriptValueImpl(self.internalValue().toNumber());
761     return throwThisObjectTypeError(
762         context, QLatin1String("Date.prototype.getTime"));
763 }
764 
method_getYear(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)765 QScriptValueImpl Date::method_getYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
766 {
767     QScriptValueImpl self = context->thisObject();
768     if (self.classInfo() == classInfo) {
769         qsreal t = self.internalValue().toNumber();
770         if (! qIsNaN(t))
771             t = YearFromTime(LocalTime(t)) - 1900;
772         return QScriptValueImpl(t);
773     }
774     return throwThisObjectTypeError(
775         context, QLatin1String("Date.prototype.getYear"));
776 }
777 
method_getFullYear(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)778 QScriptValueImpl Date::method_getFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
779 {
780     QScriptValueImpl self = context->thisObject();
781     if (self.classInfo() == classInfo) {
782         qsreal t = self.internalValue().toNumber();
783         if (! qIsNaN(t))
784             t = YearFromTime(LocalTime(t));
785         return QScriptValueImpl(t);
786     }
787     return throwThisObjectTypeError(
788         context, QLatin1String("Date.prototype.getFullYear"));
789 }
790 
method_getUTCFullYear(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)791 QScriptValueImpl Date::method_getUTCFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
792 {
793     QScriptValueImpl self = context->thisObject();
794     if (self.classInfo() == classInfo) {
795         qsreal t = self.internalValue().toNumber();
796         if (! qIsNaN(t))
797             t = YearFromTime(t);
798         return QScriptValueImpl(t);
799     }
800     return throwThisObjectTypeError(
801         context, QLatin1String("Date.prototype.getUTCFullYear"));
802 }
803 
method_getMonth(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)804 QScriptValueImpl Date::method_getMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
805 {
806     QScriptValueImpl self = context->thisObject();
807     if (self.classInfo() == classInfo) {
808         qsreal t = self.internalValue().toNumber();
809         if (! qIsNaN(t))
810             t = MonthFromTime(LocalTime(t));
811         return QScriptValueImpl(t);
812     }
813     return throwThisObjectTypeError(
814         context, QLatin1String("Date.prototype.getMonth"));
815 }
816 
method_getUTCMonth(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)817 QScriptValueImpl Date::method_getUTCMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
818 {
819     QScriptValueImpl self = context->thisObject();
820     if (self.classInfo() == classInfo) {
821         qsreal t = self.internalValue().toNumber();
822         if (! qIsNaN(t))
823             t = MonthFromTime(t);
824         return QScriptValueImpl(t);
825     }
826     return throwThisObjectTypeError(
827         context, QLatin1String("Date.prototype.getUTCMonth"));
828 }
829 
method_getDate(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)830 QScriptValueImpl Date::method_getDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
831 {
832     QScriptValueImpl self = context->thisObject();
833     if (self.classInfo() == classInfo) {
834         qsreal t = self.internalValue().toNumber();
835         if (! qIsNaN(t))
836             t = DateFromTime(LocalTime(t));
837         return QScriptValueImpl(t);
838     }
839     return throwThisObjectTypeError(
840         context, QLatin1String("Date.prototype.getDate"));
841 }
842 
method_getUTCDate(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)843 QScriptValueImpl Date::method_getUTCDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
844 {
845     QScriptValueImpl self = context->thisObject();
846     if (self.classInfo() == classInfo) {
847         qsreal t = self.internalValue().toNumber();
848         if (! qIsNaN(t))
849             t = DateFromTime(t);
850         return QScriptValueImpl(t);
851     }
852     return throwThisObjectTypeError(
853         context, QLatin1String("Date.prototype.getUTCDate"));
854 }
855 
method_getDay(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)856 QScriptValueImpl Date::method_getDay(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
857 {
858     QScriptValueImpl self = context->thisObject();
859     if (self.classInfo() == classInfo) {
860         qsreal t = self.internalValue().toNumber();
861         if (! qIsNaN(t))
862             t = WeekDay(LocalTime(t));
863         return QScriptValueImpl(t);
864     }
865     return throwThisObjectTypeError(
866         context, QLatin1String("Date.prototype.getDay"));
867 }
868 
method_getUTCDay(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)869 QScriptValueImpl Date::method_getUTCDay(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
870 {
871     QScriptValueImpl self = context->thisObject();
872     if (self.classInfo() == classInfo) {
873         qsreal t = self.internalValue().toNumber();
874         if (! qIsNaN(t))
875             t = WeekDay(t);
876         return QScriptValueImpl(t);
877     }
878     return throwThisObjectTypeError(
879         context, QLatin1String("Date.prototype.getUTCDay"));
880 }
881 
method_getHours(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)882 QScriptValueImpl Date::method_getHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
883 {
884     QScriptValueImpl self = context->thisObject();
885     if (self.classInfo() == classInfo) {
886         qsreal t = self.internalValue().toNumber();
887         if (! qIsNaN(t))
888             t = HourFromTime(LocalTime(t));
889         return QScriptValueImpl(t);
890     }
891     return throwThisObjectTypeError(
892         context, QLatin1String("Date.prototype.getHours"));
893 }
894 
method_getUTCHours(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)895 QScriptValueImpl Date::method_getUTCHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
896 {
897     QScriptValueImpl self = context->thisObject();
898     if (self.classInfo() == classInfo) {
899         qsreal t = self.internalValue().toNumber();
900         if (! qIsNaN(t))
901             t = HourFromTime(t);
902         return QScriptValueImpl(t);
903     }
904     return throwThisObjectTypeError(
905         context, QLatin1String("Date.prototype.getUTCHours"));
906 }
907 
method_getMinutes(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)908 QScriptValueImpl Date::method_getMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
909 {
910     QScriptValueImpl self = context->thisObject();
911     if (self.classInfo() == classInfo) {
912         qsreal t = self.internalValue().toNumber();
913         if (! qIsNaN(t))
914             t = MinFromTime(LocalTime(t));
915         return QScriptValueImpl(t);
916     }
917     return throwThisObjectTypeError(
918         context, QLatin1String("Date.prototype.getMinutes"));
919 }
920 
method_getUTCMinutes(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)921 QScriptValueImpl Date::method_getUTCMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
922 {
923     QScriptValueImpl self = context->thisObject();
924     if (self.classInfo() == classInfo) {
925         qsreal t = self.internalValue().toNumber();
926         if (! qIsNaN(t))
927             t = MinFromTime(t);
928         return QScriptValueImpl(t);
929     }
930     return throwThisObjectTypeError(
931         context, QLatin1String("Date.prototype.getUTCMinutes"));
932 }
933 
method_getSeconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)934 QScriptValueImpl Date::method_getSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
935 {
936     QScriptValueImpl self = context->thisObject();
937     if (self.classInfo() == classInfo) {
938         qsreal t = self.internalValue().toNumber();
939         if (! qIsNaN(t))
940             t = SecFromTime(LocalTime(t));
941         return QScriptValueImpl(t);
942     }
943     return throwThisObjectTypeError(
944         context, QLatin1String("Date.prototype.getSeconds"));
945 }
946 
method_getUTCSeconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)947 QScriptValueImpl Date::method_getUTCSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
948 {
949     QScriptValueImpl self = context->thisObject();
950     if (self.classInfo() == classInfo) {
951         qsreal t = self.internalValue().toNumber();
952         if (! qIsNaN(t))
953             t = SecFromTime(t);
954         return QScriptValueImpl(t);
955     }
956     return throwThisObjectTypeError(
957         context, QLatin1String("Date.prototype.getUTCSeconds"));
958 }
959 
method_getMilliseconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)960 QScriptValueImpl Date::method_getMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
961 {
962     QScriptValueImpl self = context->thisObject();
963     if (self.classInfo() == classInfo) {
964         qsreal t = self.internalValue().toNumber();
965         if (! qIsNaN(t))
966             t = msFromTime(LocalTime(t));
967         return QScriptValueImpl(t);
968     }
969     return throwThisObjectTypeError(
970         context, QLatin1String("Date.prototype.getMilliseconds"));
971 }
972 
method_getUTCMilliseconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)973 QScriptValueImpl Date::method_getUTCMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
974 {
975     QScriptValueImpl self = context->thisObject();
976     if (self.classInfo() == classInfo) {
977         qsreal t = self.internalValue().toNumber();
978         if (! qIsNaN(t))
979             t = msFromTime(t);
980         return QScriptValueImpl(t);
981     }
982     return throwThisObjectTypeError(
983         context, QLatin1String("Date.prototype.getUTCMilliseconds"));
984 }
985 
method_getTimezoneOffset(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)986 QScriptValueImpl Date::method_getTimezoneOffset(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
987 {
988     QScriptValueImpl self = context->thisObject();
989     if (self.classInfo() == classInfo) {
990         qsreal t = self.internalValue().toNumber();
991         if (! qIsNaN(t))
992             t = (t - LocalTime(t)) / msPerMinute;
993         return QScriptValueImpl(t);
994     }
995     return throwThisObjectTypeError(
996         context, QLatin1String("Date.prototype.getTimezoneOffset"));
997 }
998 
method_setTime(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)999 QScriptValueImpl Date::method_setTime(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1000 {
1001     QScriptValueImpl self = context->thisObject();
1002     if (self.classInfo() == classInfo) {
1003         qsreal t = TimeClip(context->argument(0).toNumber());
1004         QScriptValueImpl r(t);
1005         self.setInternalValue(r);
1006         return r;
1007     }
1008     return throwThisObjectTypeError(
1009         context, QLatin1String("Date.prototype.setTime"));
1010 }
1011 
method_setMilliseconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1012 QScriptValueImpl Date::method_setMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1013 {
1014     QScriptValueImpl self = context->thisObject();
1015     if (self.classInfo() == classInfo) {
1016         qsreal t = LocalTime(self.internalValue().toNumber());
1017         qsreal ms = context->argument(0).toNumber();
1018         t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms))));
1019         QScriptValueImpl r(t);
1020         self.setInternalValue(r);
1021         return r;
1022     }
1023     return throwThisObjectTypeError(
1024         context, QLatin1String("Date.prototype.setMilliseconds"));
1025 }
1026 
method_setUTCMilliseconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1027 QScriptValueImpl Date::method_setUTCMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1028 {
1029     QScriptValueImpl self = context->thisObject();
1030     if (self.classInfo() == classInfo) {
1031         qsreal t = self.internalValue().toNumber();
1032         qsreal ms = context->argument(0).toNumber();
1033         t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)));
1034         QScriptValueImpl r(t);
1035         self.setInternalValue(r);
1036         return r;
1037     }
1038     return throwThisObjectTypeError(
1039         context, QLatin1String("Date.prototype.setUTCMilliseconds"));
1040 }
1041 
method_setSeconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1042 QScriptValueImpl Date::method_setSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1043 {
1044     QScriptValueImpl self = context->thisObject();
1045     if (self.classInfo() == classInfo) {
1046         qsreal t = LocalTime(self.internalValue().toNumber());
1047         qsreal sec = context->argument(0).toNumber();
1048         qsreal ms = (context->argumentCount() < 2) ? msFromTime(t) : context->argument(1).toNumber();
1049         t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms))));
1050         QScriptValueImpl r(t);
1051         self.setInternalValue(r);
1052         return r;
1053     }
1054     return throwThisObjectTypeError(
1055         context, QLatin1String("Date.prototype.setSeconds"));
1056 }
1057 
method_setUTCSeconds(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1058 QScriptValueImpl Date::method_setUTCSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1059 {
1060     QScriptValueImpl self = context->thisObject();
1061     if (self.classInfo() == classInfo) {
1062         qsreal t = self.internalValue().toNumber();
1063         qsreal sec = context->argument(0).toNumber();
1064         qsreal ms = (context->argumentCount() < 2) ? msFromTime(t) : context->argument(1).toNumber();
1065         t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms)));
1066         QScriptValueImpl r(t);
1067         self.setInternalValue(r);
1068         return r;
1069     }
1070     return throwThisObjectTypeError(
1071         context, QLatin1String("Date.prototype.setUTCSeconds"));
1072 }
1073 
method_setMinutes(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1074 QScriptValueImpl Date::method_setMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1075 {
1076     QScriptValueImpl self = context->thisObject();
1077     if (self.classInfo() == classInfo) {
1078         qsreal t = LocalTime(self.internalValue().toNumber());
1079         qsreal min = context->argument(0).toNumber();
1080         qsreal sec = (context->argumentCount() < 2) ? SecFromTime(t) : context->argument(1).toNumber();
1081         qsreal ms = (context->argumentCount() < 3) ? msFromTime(t) : context->argument(2).toNumber();
1082         t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms))));
1083         QScriptValueImpl r(t);
1084         self.setInternalValue(r);
1085         return r;
1086     }
1087     return throwThisObjectTypeError(
1088         context, QLatin1String("Date.prototype.setMinutes"));
1089 }
1090 
method_setUTCMinutes(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1091 QScriptValueImpl Date::method_setUTCMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1092 {
1093     QScriptValueImpl self = context->thisObject();
1094     if (self.classInfo() == classInfo) {
1095         qsreal t = self.internalValue().toNumber();
1096         qsreal min = context->argument(0).toNumber();
1097         qsreal sec = (context->argumentCount() < 2) ? SecFromTime(t) : context->argument(1).toNumber();
1098         qsreal ms = (context->argumentCount() < 3) ? msFromTime(t) : context->argument(2).toNumber();
1099         t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms)));
1100         QScriptValueImpl r(t);
1101         self.setInternalValue(r);
1102         return r;
1103     }
1104     return throwThisObjectTypeError(
1105         context, QLatin1String("Date.prototype.setUTCMinutes"));
1106 }
1107 
method_setHours(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1108 QScriptValueImpl Date::method_setHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1109 {
1110     QScriptValueImpl self = context->thisObject();
1111     if (self.classInfo() == classInfo) {
1112         qsreal t = LocalTime(self.internalValue().toNumber());
1113         qsreal hour = context->argument(0).toNumber();
1114         qsreal min = (context->argumentCount() < 2) ? MinFromTime(t) : context->argument(1).toNumber();
1115         qsreal sec = (context->argumentCount() < 3) ? SecFromTime(t) : context->argument(2).toNumber();
1116         qsreal ms = (context->argumentCount() < 4) ? msFromTime(t) : context->argument(3).toNumber();
1117         t = TimeClip(UTC(MakeDate(Day(t), MakeTime(hour, min, sec, ms))));
1118         QScriptValueImpl r(t);
1119         self.setInternalValue(r);
1120         return r;
1121     }
1122     return throwThisObjectTypeError(
1123         context, QLatin1String("Date.prototype.setHours"));
1124 }
1125 
method_setUTCHours(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1126 QScriptValueImpl Date::method_setUTCHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1127 {
1128     QScriptValueImpl self = context->thisObject();
1129     if (self.classInfo() == classInfo) {
1130         qsreal t = self.internalValue().toNumber();
1131         qsreal hour = context->argument(0).toNumber();
1132         qsreal min = (context->argumentCount() < 2) ? MinFromTime(t) : context->argument(1).toNumber();
1133         qsreal sec = (context->argumentCount() < 3) ? SecFromTime(t) : context->argument(2).toNumber();
1134         qsreal ms = (context->argumentCount() < 4) ? msFromTime(t) : context->argument(3).toNumber();
1135         t = TimeClip(MakeDate(Day(t), MakeTime(hour, min, sec, ms)));
1136         QScriptValueImpl r(t);
1137         self.setInternalValue(r);
1138         return r;
1139     }
1140     return throwThisObjectTypeError(
1141         context, QLatin1String("Date.prototype.setUTCHours"));
1142 }
1143 
method_setDate(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1144 QScriptValueImpl Date::method_setDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1145 {
1146     QScriptValueImpl self = context->thisObject();
1147     if (self.classInfo() == classInfo) {
1148         qsreal t = LocalTime(self.internalValue().toNumber());
1149         qsreal date = context->argument(0).toNumber();
1150         t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t))));
1151         QScriptValueImpl r(t);
1152         self.setInternalValue(r);
1153         return r;
1154     }
1155     return throwThisObjectTypeError(
1156         context, QLatin1String("Date.prototype.setDate"));
1157 }
1158 
method_setUTCDate(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1159 QScriptValueImpl Date::method_setUTCDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1160 {
1161     QScriptValueImpl self = context->thisObject();
1162     if (self.classInfo() == classInfo) {
1163         qsreal t = self.internalValue().toNumber();
1164         qsreal date = context->argument(0).toNumber();
1165         t = TimeClip(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t)));
1166         QScriptValueImpl r(t);
1167         self.setInternalValue(r);
1168         return r;
1169     }
1170     return throwThisObjectTypeError(
1171         context, QLatin1String("Date.prototype.setUTCDate"));
1172 }
1173 
method_setMonth(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1174 QScriptValueImpl Date::method_setMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1175 {
1176     QScriptValueImpl self = context->thisObject();
1177     if (self.classInfo() == classInfo) {
1178         qsreal t = LocalTime(self.internalValue().toNumber());
1179         qsreal month = context->argument(0).toNumber();
1180         qsreal date = (context->argumentCount() < 2) ? DateFromTime(t) : context->argument(1).toNumber();
1181         t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t))));
1182         QScriptValueImpl r(t);
1183         self.setInternalValue(r);
1184         return r;
1185     }
1186     return throwThisObjectTypeError(
1187         context, QLatin1String("Date.prototype.setMonth"));
1188 }
1189 
method_setUTCMonth(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1190 QScriptValueImpl Date::method_setUTCMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1191 {
1192     QScriptValueImpl self = context->thisObject();
1193     if (self.classInfo() == classInfo) {
1194         qsreal t = self.internalValue().toNumber();
1195         qsreal month = context->argument(0).toNumber();
1196         qsreal date = (context->argumentCount() < 2) ? DateFromTime(t) : context->argument(1).toNumber();
1197         t = TimeClip(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t)));
1198         QScriptValueImpl r(t);
1199         self.setInternalValue(r);
1200         return r;
1201     }
1202     return throwThisObjectTypeError(
1203         context, QLatin1String("Date.prototype.setUTCMonth"));
1204 }
1205 
method_setFullYear(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1206 QScriptValueImpl Date::method_setFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1207 {
1208     QScriptValueImpl self = context->thisObject();
1209     if (self.classInfo() == classInfo) {
1210         qsreal t = LocalTime(self.internalValue().toNumber());
1211         qsreal year = context->argument(0).toNumber();
1212         qsreal month = (context->argumentCount() < 2) ? MonthFromTime(t) : context->argument(1).toNumber();
1213         qsreal date = (context->argumentCount() < 3) ? DateFromTime(t) : context->argument(2).toNumber();
1214         t = TimeClip(UTC(MakeDate(MakeDay(year, month, date), TimeWithinDay(t))));
1215         QScriptValueImpl r(t);
1216         self.setInternalValue(r);
1217         return r;
1218     }
1219     return throwThisObjectTypeError(
1220         context, QLatin1String("Date.prototype.setFullYear"));
1221 }
1222 
method_setUTCFullYear(QScriptContextPrivate * context,QScriptEnginePrivate *,QScriptClassInfo * classInfo)1223 QScriptValueImpl Date::method_setUTCFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
1224 {
1225     QScriptValueImpl self = context->thisObject();
1226     if (self.classInfo() == classInfo) {
1227         qsreal t = self.internalValue().toNumber();
1228         qsreal year = context->argument(0).toNumber();
1229         qsreal month = (context->argumentCount() < 2) ? MonthFromTime(t) : context->argument(1).toNumber();
1230         qsreal date = (context->argumentCount() < 3) ? DateFromTime(t) : context->argument(2).toNumber();
1231         t = TimeClip(MakeDate(MakeDay(year, month, date), TimeWithinDay(t)));
1232         QScriptValueImpl r(t);
1233         self.setInternalValue(r);
1234         return r;
1235     }
1236     return throwThisObjectTypeError(
1237         context, QLatin1String("Date.prototype.setUTCFullYear"));
1238 }
1239 
method_setYear(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)1240 QScriptValueImpl Date::method_setYear(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
1241 {
1242     Q_UNUSED(eng);
1243     QScriptValueImpl self = context->thisObject();
1244     if (self.classInfo() == classInfo) {
1245         qsreal t = self.internalValue().toNumber();
1246         if (qIsNaN(t))
1247             t = 0;
1248         else
1249             t = LocalTime(t);
1250         qsreal year = context->argument(0).toNumber();
1251         qsreal r;
1252         if (qIsNaN(year)) {
1253             r = qSNaN();
1254         } else {
1255             if ((eng->toInteger(year) >= 0) && (eng->toInteger(year) <= 99))
1256                 year += 1900;
1257             r = MakeDay(year, MonthFromTime(t), DateFromTime(t));
1258             r = UTC(MakeDate(r, TimeWithinDay(t)));
1259             r = TimeClip(r);
1260         }
1261         QScriptValueImpl v = QScriptValueImpl(r);
1262         self.setInternalValue(v);
1263         return v;
1264     }
1265     return throwThisObjectTypeError(
1266         context, QLatin1String("Date.prototype.setYear"));
1267 }
1268 
method_toUTCString(QScriptContextPrivate * context,QScriptEnginePrivate * eng,QScriptClassInfo * classInfo)1269 QScriptValueImpl Date::method_toUTCString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
1270 {
1271     QScriptValueImpl self = context->thisObject();
1272     if (self.classInfo() == classInfo) {
1273         qsreal t = self.internalValue().toNumber();
1274         return QScriptValueImpl(eng, ToUTCString(t));
1275     }
1276     return throwThisObjectTypeError(
1277         context, QLatin1String("Date.prototype.toUTCString"));
1278 }
1279 
1280 } } // namespace QScript::Ecma
1281 
1282 QT_END_NAMESPACE
1283 
1284