Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qv4dateobject_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4#ifndef QV4DATEOBJECT_P_H
5#define QV4DATEOBJECT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qv4object_p.h"
21#include <QtCore/private/qnumeric_p.h>
22#include <QtCore/qdatetime.h>
23
25
26class QDateTime;
27
28namespace QV4 {
29
30struct Date
31{
32 static constexpr quint64 MaxDateVal = 8.64e15;
33
34 void init() { storage = InvalidDateVal; }
35 void init(Date date) { storage = date.storage; }
36 void init(double value);
37 void init(const QDateTime &dateTime);
38 void init(QDate date);
39 void init(QTime time, ExecutionEngine *engine);
40
41 Date &operator=(double value)
42 {
43 storage = (storage & (HasQDate | HasQTime)) | encode(value);
44 return *this;
45 }
46
47 operator double() const
48 {
49 const quint64 raw = (storage & ~(HasQDate | HasQTime));
50 if (raw == 0)
51 return qt_qnan();
52
53 if (raw > MaxDateVal)
54 return double(raw - MaxDateVal - Extra);
55
56 return double(raw) - double(MaxDateVal) - double(Extra);
57 }
58
59 QDate toQDate() const;
60 QTime toQTime() const;
61 QDateTime toQDateTime() const;
62 QVariant toVariant() const;
63
64 template<typename Function>
65 bool withReadonlyStoragePointer(Function function)
66 {
67 switch (storage & (HasQDate | HasQTime)) {
68 case HasQDate: {
69 QDate date = toQDate();
70 return function(&date);
71 }
72 case HasQTime: {
73 QTime time = toQTime();
74 return function(&time);
75 }
76 case (HasQTime | HasQDate): {
77 QDateTime dateTime = toQDateTime();
78 return function(&dateTime);
79 }
80 default: {
81 double d = operator double();
82 return function(&d);
83 }
84 }
85 }
86
87 template<typename Function>
88 bool withWriteonlyStoragePointer(Function function, ExecutionEngine *engine)
89 {
90 switch (storage & (HasQDate | HasQTime)) {
91 case HasQDate: {
92 QDate date;
93 if (function(&date)) {
94 init(date);
95 return true;
96 }
97 return false;
98 }
99 case HasQTime: {
100 QTime time;
101 if (function(&time)) {
102 init(time, engine);
103 return true;
104 }
105 return false;
106 }
107 case (HasQTime | HasQDate): {
108 QDateTime dateTime;
109 if (function(&dateTime)) {
110 init(dateTime);
111 return true;
112 }
113 return false;
114 }
115 default: {
116 double d;
117 if (function(&d)) {
118 init(d);
119 return true;
120 }
121 return false;
122 }
123 }
124 }
125
126private:
127 static constexpr quint64 InvalidDateVal = 0;
128 static constexpr quint64 Extra = 1;
129 static constexpr quint64 HasQDate = 1ull << 63;
130 static constexpr quint64 HasQTime = 1ull << 62;
131
132 // Make all our dates fit into quint64, leaving space for the flags
133 static_assert(((MaxDateVal * 2 + Extra) & (HasQDate | HasQTime)) == 0ull);
134
135 static quint64 encode(double value);
136 static quint64 encode(const QDateTime &dateTime);
137
138 quint64 storage;
139};
140
141namespace Heap {
142
143#define DateObjectMembers(class, Member)
144DECLARE_HEAP_OBJECT(DateObject, ReferenceObject) {
145 DECLARE_MARKOBJECTS(DateObject);
146
147 void doSetLocation()
148 {
149 if (CppStackFrame *frame = internalClass->engine->currentStackFrame)
150 setLocation(frame->v4Function, frame->statementNumber());
151 }
152
153 void init()
154 {
155 ReferenceObject::init(nullptr, -1, {});
156 m_date.init();
157 }
158
159 void init(Date date)
160 {
161 ReferenceObject::init(nullptr, -1, {});
162 m_date.init(date);
163 }
164
165 void init(double dateTime)
166 {
167 ReferenceObject::init(nullptr, -1, {});
168 m_date.init(dateTime);
169 }
170
171 void init(const QDateTime &dateTime)
172 {
173 ReferenceObject::init(nullptr, -1, {});
174 m_date.init(dateTime);
175 }
176
177 void init(const QDateTime &dateTime, Heap::Object *parent, int property, Flags flags)
178 {
179 ReferenceObject::init(parent, property, flags | EnforcesLocation);
180 doSetLocation();
181 m_date.init(dateTime);
182 };
183
184 void init(QDate date, Heap::Object *parent, int property, Flags flags)
185 {
186 ReferenceObject::init(parent, property, flags | EnforcesLocation);
187 doSetLocation();
188 m_date.init(date);
189 };
190
191 void init(QTime time, Heap::Object *parent, int property, Flags flags)
192 {
193 ReferenceObject::init(parent, property, flags | EnforcesLocation);
194 doSetLocation();
195 m_date.init(time, internalClass->engine);
196 };
197
198 DateObject *detached() const;
199 bool setVariant(const QVariant &variant);
200
201 void setDate(double newDate)
202 {
203 m_date = newDate;
204 if (isAttachedToProperty())
205 writeBack();
206 }
207
208 double date() const
209 {
210 return m_date;
211 }
212
213 QVariant toVariant() const { return m_date.toVariant(); }
214 QDateTime toQDateTime() const { return m_date.toQDateTime(); }
215
216 bool readReference()
217 {
218 if (!object())
219 return false;
220
221 if (!isDirty())
222 return true;
223
224 QV4::Scope scope(internalClass->engine);
225 QV4::ScopedObject o(scope, object());
226
227 if (!isConnected() && QV4::ReferenceObject::shouldConnect(this))
228 QV4::ReferenceObject::connect(this);
229
230 bool wasRead = false;
231 if (isVariant()) {
232 QVariant variant;
233 void *a[] = { &variant };
234 wasRead = o->metacall(QMetaObject::ReadProperty, property(), a)
235 && setVariant(variant);
236 } else {
237 wasRead = m_date.withWriteonlyStoragePointer([&](void *storagePointer) {
238 void *a[] = { storagePointer };
239 return o->metacall(QMetaObject::ReadProperty, property(), a);
240 }, scope.engine);
241 }
242
243 setDirty(!isConnected() || !wasRead);
244 return wasRead;
245 }
246
247 bool writeBack(int internalIndex = QV4::ReferenceObject::AllProperties)
248 {
249 if (!object() || !canWriteBack())
250 return false;
251
252 QV4::Scope scope(internalClass->engine);
253 QV4::ScopedObject o(scope, object());
254
255 int flags = 0;
256 int status = -1;
257 if (isVariant()) {
258 QVariant variant = toVariant();
259 void *a[] = { &variant, nullptr, &status, &flags, &internalIndex };
260 return o->metacall(QMetaObject::WriteProperty, property(), a);
261 }
262
263 return m_date.withReadonlyStoragePointer([&](void *storagePointer) {
264 void *a[] = { storagePointer, nullptr, &status, &flags, &internalIndex };
265 return o->metacall(QMetaObject::WriteProperty, property(), a);
266 });
267 }
268
269private:
270 Date m_date;
271};
272
273
275 void init(QV4::ExecutionEngine *engine);
276};
277
278}
279
281 V4_OBJECT2(DateObject, ReferenceObject)
283 V4_PROTOTYPE(datePrototype)
284
285 void setDate(double date) { d()->setDate(date); }
286 double date() const { return d()->date(); }
287
289 QString toString() const;
290
291 static QString dateTimeToString(const QDateTime &dateTime, ExecutionEngine *engine);
292 static double dateTimeToNumber(const QDateTime &dateTime);
293 static QDate dateTimeToDate(const QDateTime &dateTime);
294 static QDateTime stringToDateTime(const QString &string, ExecutionEngine *engine);
295 static QDateTime timestampToDateTime(double timestamp, QTimeZone zone = QTimeZone::LocalTime);
296 static double componentsToTimestamp(
297 double year, double month, double day,
298 double hours, double mins, double secs, double ms,
299 ExecutionEngine *v4);
300};
301
302template<>
303inline const DateObject *Value::as() const {
304 return isManaged() && m()->internalClass->vtable->type == Managed::Type_DateObject ? static_cast<const DateObject *>(this) : nullptr;
305}
306
308{
309 V4_OBJECT2(DateCtor, FunctionObject)
310
311 static ReturnedValue virtualCallAsConstructor(const FunctionObject *, const Value *argv, int argc, const Value *);
312 static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int);
313};
314
316{
317 V4_PROTOTYPE(objectPrototype)
318
320
321 static double getThisDate(ExecutionEngine *v4, const Value *thisObject);
322
323 static ReturnedValue method_parse(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
324 static ReturnedValue method_UTC(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
325 static ReturnedValue method_now(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
326
327 static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
328 static ReturnedValue method_toDateString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
329 static ReturnedValue method_toTimeString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
330 static ReturnedValue method_toLocaleString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
331 static ReturnedValue method_toLocaleDateString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
332 static ReturnedValue method_toLocaleTimeString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
333 static ReturnedValue method_valueOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
334 static ReturnedValue method_getTime(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
335 static ReturnedValue method_getYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
336 static ReturnedValue method_getFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
337 static ReturnedValue method_getUTCFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
338 static ReturnedValue method_getMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
339 static ReturnedValue method_getUTCMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
340 static ReturnedValue method_getDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
341 static ReturnedValue method_getUTCDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
342 static ReturnedValue method_getDay(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
343 static ReturnedValue method_getUTCDay(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
344 static ReturnedValue method_getHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
345 static ReturnedValue method_getUTCHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
346 static ReturnedValue method_getMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
347 static ReturnedValue method_getUTCMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
348 static ReturnedValue method_getSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
349 static ReturnedValue method_getUTCSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
350 static ReturnedValue method_getMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
351 static ReturnedValue method_getUTCMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
352 static ReturnedValue method_getTimezoneOffset(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
353 static ReturnedValue method_setTime(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
354 static ReturnedValue method_setMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
355 static ReturnedValue method_setUTCMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
356 static ReturnedValue method_setSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
357 static ReturnedValue method_setUTCSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
358 static ReturnedValue method_setMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
359 static ReturnedValue method_setUTCMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
360 static ReturnedValue method_setHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
361 static ReturnedValue method_setUTCHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
362 static ReturnedValue method_setDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
363 static ReturnedValue method_setUTCDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
364 static ReturnedValue method_setMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
365 static ReturnedValue method_setUTCMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
366 static ReturnedValue method_setYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
367 static ReturnedValue method_setFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
368 static ReturnedValue method_setUTCFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
369 static ReturnedValue method_toUTCString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
370 static ReturnedValue method_toISOString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
371 static ReturnedValue method_toJSON(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
372 static ReturnedValue method_symbolToPrimitive(const FunctionObject *f, const Value *thisObject, const Value *, int);
373
374 static void timezoneUpdated(ExecutionEngine *e);
375};
376
377template<>
378inline bool ReferenceObject::readReference<Heap::DateObject>(Heap::DateObject *ref)
379{
380 return ref->readReference();
381}
382
383template<>
384inline bool ReferenceObject::writeBack<Heap::DateObject>(Heap::DateObject *ref, int internalIndex)
385{
386 return ref->writeBack(internalIndex);
387}
388
389}
390
391QT_END_NAMESPACE
392
393#endif // QV4ECMAOBJECTS_P_H
Combined button and popup list for selecting options.
DECLARE_HEAP_OBJECT(DateObject, ReferenceObject)
Definition qjsvalue.h:24
bool ReferenceObject::readReference< Heap::DateObject >(Heap::DateObject *ref)
bool ReferenceObject::writeBack< Heap::DateObject >(Heap::DateObject *ref, int internalIndex)
DEFINE_OBJECT_VTABLE(DateObject)
DEFINE_OBJECT_VTABLE(DateCtor)
static bool InLeapYear(double t)
static const double msPerDay
static double DayFromYear(double y)
static QString ToString(double t, double localTZA)
static double UTC(double t, double localTZA)
static const double msPerSecond
static double ParseString(const QString &s, double localTZA)
static QString ToUTCString(double t)
static int msFromTime(double t)
static double DaysInYear(double y)
static QString ToLocaleTimeString(double t)
static const double msPerHour
static double YearFromTime(double t)
static QDateTime ToDateTime(double t, QTimeZone zone)
static QString ToTimeString(double t)
static double getLocalTZA()
static double TimeWithinDay(double t)
static double TimeFromYear(double y)
static QString ToLocaleDateString(double t)
static double DayFromMonth(double month, double leap)
static double WeekDay(double t)
static const double SecondsPerMinute
static double MakeDate(double day, double time)
static double MakeDay(double year, double month, double day)
static double DaylightSavingTA(double t, double localTZA)
static QString ToLocaleString(double t)
static double DayWithinYear(double t)
static const double HoursPerDay
static void addZeroPrefixedInt(QString &str, int num, int nDigits)
static double MonthFromTime(double t)
static int HourFromTime(double t)
static int SecFromTime(double t)
static double Day(double t)
static double TimeClip(double t)
static int MinFromTime(double t)
static QString ToDateString(double t)
static double MakeTime(double hour, double min, double sec, double ms)
static const double msPerMinute
static double DateFromTime(double t)
static double LocalTime(double t, double localTZA)
static const double MinutesPerHour
static double currentTime()
#define Q_MANAGED_TYPE(type)
#define RETURN_RESULT(r)
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int)
static QDate dateTimeToDate(const QDateTime &dateTime)
static QString dateTimeToString(const QDateTime &dateTime, ExecutionEngine *engine)
static QDateTime timestampToDateTime(double timestamp, QTimeZone zone=QTimeZone::LocalTime)
static QDateTime stringToDateTime(const QString &string, ExecutionEngine *engine)
static double dateTimeToNumber(const QDateTime &dateTime)
QString toString() const
static double componentsToTimestamp(double year, double month, double day, double hours, double mins, double secs, double ms, ExecutionEngine *v4)
static ReturnedValue method_setMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_UTC(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toTimeString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getTimezoneOffset(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleDateString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getDay(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleTimeString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCDay(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setTime(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toISOString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static void timezoneUpdated(ExecutionEngine *e)
static ReturnedValue method_setUTCFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toDateString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_symbolToPrimitive(const FunctionObject *f, const Value *thisObject, const Value *, int)
static ReturnedValue method_getTime(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_valueOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_parse(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toJSON(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toUTCString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_now(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static double getThisDate(ExecutionEngine *v4, const Value *thisObject)
static ReturnedValue method_setSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
QDate toQDate() const
operator double() const
bool withReadonlyStoragePointer(Function function)
QVariant toVariant() const
bool withWriteonlyStoragePointer(Function function, ExecutionEngine *engine)
void init(QTime time, ExecutionEngine *engine)
static constexpr quint64 MaxDateVal
void init(QDate date)
void init(const QDateTime &dateTime)
Date & operator=(double value)
QTime toQTime() const
QDateTime toQDateTime() const
void init(double value)
void init(Date date)
void init(QV4::ExecutionEngine *engine)
An object that keeps track of the provenance of its owned value, allowing to reflect mutations on the...