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