Convert Boolean, Number and DateObject
authorLars Knoll <lars.knoll@digia.com>
Sat, 5 Apr 2014 19:03:37 +0000 (21:03 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Tue, 22 Jul 2014 11:48:55 +0000 (13:48 +0200)
Change-Id: I8815578422fe1af87eb5f02899f35131fea70b76
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4booleanobject.cpp
src/qml/jsruntime/qv4dateobject.cpp
src/qml/jsruntime/qv4dateobject_p.h
src/qml/jsruntime/qv4jsonobject.cpp
src/qml/jsruntime/qv4numberobject.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4serialize.cpp

index 662ec64..b2851ab 100644 (file)
@@ -87,7 +87,7 @@ ReturnedValue BooleanPrototype::method_toString(CallContext *ctx)
         Scoped<BooleanObject> thisObject(scope, ctx->callData->thisObject);
         if (!thisObject)
             return ctx->throwTypeError();
-        result = thisObject->value.booleanValue();
+        result = thisObject->value().booleanValue();
     }
 
     return Encode(ctx->engine->newString(QLatin1String(result ? "true" : "false")));
@@ -103,5 +103,5 @@ ReturnedValue BooleanPrototype::method_valueOf(CallContext *ctx)
     if (!thisObject)
         return ctx->throwTypeError();
 
-    return thisObject->value.asReturnedValue();
+    return thisObject->value().asReturnedValue();
 }
index ceef884..5018ddd 100644 (file)
@@ -647,12 +647,12 @@ DateObject::DateObject(ExecutionEngine *engine, const QDateTime &date)
     : Object(engine->dateClass)
 {
     setVTable(staticVTable());
-    value.setDouble(date.isValid() ? date.toMSecsSinceEpoch() : qSNaN());
+    data.value.setDouble(date.isValid() ? date.toMSecsSinceEpoch() : qSNaN());
 }
 
 QDateTime DateObject::toQDateTime() const
 {
-    return ToDateTime(value.asDouble(), Qt::LocalTime);
+    return ToDateTime(date().asDouble(), Qt::LocalTime);
 }
 
 DEFINE_OBJECT_VTABLE(DateCtor);
@@ -674,7 +674,7 @@ ReturnedValue DateCtor::construct(Managed *m, CallData *callData)
         Scope scope(m->engine());
         ScopedValue arg(scope, callData->args[0]);
         if (DateObject *d = arg->asDateObject())
-            arg = d->value;
+            arg = d->date();
         else
             arg = RuntimeHelpers::toPrimitive(arg, PREFERREDTYPE_HINT);
 
@@ -771,7 +771,7 @@ void DatePrototype::init(ExecutionEngine *engine, ObjectRef ctor)
 double DatePrototype::getThisDate(ExecutionContext *ctx)
 {
     if (DateObject *thisObject = ctx->callData->thisObject.asDateObject())
-        return thisObject->value.asDouble();
+        return thisObject->date().asDouble();
     else {
         ctx->throwTypeError();
         return 0;
@@ -1012,8 +1012,8 @@ ReturnedValue DatePrototype::method_setTime(CallContext *ctx)
         return ctx->throwTypeError();
 
     double t = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
-    self->value.setDouble(TimeClip(t));
-    return self->value.asReturnedValue();
+    self->date().setDouble(TimeClip(t));
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setMilliseconds(CallContext *ctx)
@@ -1023,10 +1023,10 @@ ReturnedValue DatePrototype::method_setMilliseconds(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = LocalTime(self->value.asDouble());
+    double t = LocalTime(self->date().asDouble());
     double ms = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
-    self->value.setDouble(TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)))));
-    return self->value.asReturnedValue();
+    self->date().setDouble(TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)))));
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setUTCMilliseconds(CallContext *ctx)
@@ -1035,10 +1035,10 @@ ReturnedValue DatePrototype::method_setUTCMilliseconds(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     double ms = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
-    self->value.setDouble(TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)))));
-    return self->value.asReturnedValue();
+    self->date().setDouble(TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)))));
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setSeconds(CallContext *ctx)
@@ -1047,12 +1047,12 @@ ReturnedValue DatePrototype::method_setSeconds(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = LocalTime(self->value.asDouble());
+    double t = LocalTime(self->date().asDouble());
     double sec = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double ms = (ctx->callData->argc < 2) ? msFromTime(t) : ctx->callData->args[1].toNumber();
     t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setUTCSeconds(CallContext *ctx)
@@ -1061,12 +1061,12 @@ ReturnedValue DatePrototype::method_setUTCSeconds(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     double sec = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double ms = (ctx->callData->argc < 2) ? msFromTime(t) : ctx->callData->args[1].toNumber();
     t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setMinutes(CallContext *ctx)
@@ -1075,13 +1075,13 @@ ReturnedValue DatePrototype::method_setMinutes(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = LocalTime(self->value.asDouble());
+    double t = LocalTime(self->date().asDouble());
     double min = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double sec = (ctx->callData->argc < 2) ? SecFromTime(t) : ctx->callData->args[1].toNumber();
     double ms = (ctx->callData->argc < 3) ? msFromTime(t) : ctx->callData->args[2].toNumber();
     t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setUTCMinutes(CallContext *ctx)
@@ -1090,13 +1090,13 @@ ReturnedValue DatePrototype::method_setUTCMinutes(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     double min = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double sec = (ctx->callData->argc < 2) ? SecFromTime(t) : ctx->callData->args[1].toNumber();
     double ms = (ctx->callData->argc < 3) ? msFromTime(t) : ctx->callData->args[2].toNumber();
     t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setHours(CallContext *ctx)
@@ -1105,14 +1105,14 @@ ReturnedValue DatePrototype::method_setHours(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = LocalTime(self->value.asDouble());
+    double t = LocalTime(self->date().asDouble());
     double hour = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double min = (ctx->callData->argc < 2) ? MinFromTime(t) : ctx->callData->args[1].toNumber();
     double sec = (ctx->callData->argc < 3) ? SecFromTime(t) : ctx->callData->args[2].toNumber();
     double ms = (ctx->callData->argc < 4) ? msFromTime(t) : ctx->callData->args[3].toNumber();
     t = TimeClip(UTC(MakeDate(Day(t), MakeTime(hour, min, sec, ms))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setUTCHours(CallContext *ctx)
@@ -1121,14 +1121,14 @@ ReturnedValue DatePrototype::method_setUTCHours(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     double hour = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double min = (ctx->callData->argc < 2) ? MinFromTime(t) : ctx->callData->args[1].toNumber();
     double sec = (ctx->callData->argc < 3) ? SecFromTime(t) : ctx->callData->args[2].toNumber();
     double ms = (ctx->callData->argc < 4) ? msFromTime(t) : ctx->callData->args[3].toNumber();
     t = TimeClip(UTC(MakeDate(Day(t), MakeTime(hour, min, sec, ms))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setDate(CallContext *ctx)
@@ -1137,11 +1137,11 @@ ReturnedValue DatePrototype::method_setDate(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = LocalTime(self->value.asDouble());
+    double t = LocalTime(self->date().asDouble());
     double date = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setUTCDate(CallContext *ctx)
@@ -1150,11 +1150,11 @@ ReturnedValue DatePrototype::method_setUTCDate(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     double date = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setMonth(CallContext *ctx)
@@ -1163,12 +1163,12 @@ ReturnedValue DatePrototype::method_setMonth(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = LocalTime(self->value.asDouble());
+    double t = LocalTime(self->date().asDouble());
     double month = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double date = (ctx->callData->argc < 2) ? DateFromTime(t) : ctx->callData->args[1].toNumber();
     t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setUTCMonth(CallContext *ctx)
@@ -1177,12 +1177,12 @@ ReturnedValue DatePrototype::method_setUTCMonth(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     double month = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double date = (ctx->callData->argc < 2) ? DateFromTime(t) : ctx->callData->args[1].toNumber();
     t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setYear(CallContext *ctx)
@@ -1191,7 +1191,7 @@ ReturnedValue DatePrototype::method_setYear(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     if (std::isnan(t))
         t = 0;
     else
@@ -1207,8 +1207,8 @@ ReturnedValue DatePrototype::method_setYear(CallContext *ctx)
         r = UTC(MakeDate(r, TimeWithinDay(t)));
         r = TimeClip(r);
     }
-    self->value.setDouble(r);
-    return self->value.asReturnedValue();
+    self->date().setDouble(r);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setUTCFullYear(CallContext *ctx)
@@ -1217,13 +1217,13 @@ ReturnedValue DatePrototype::method_setUTCFullYear(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     double year = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double month = (ctx->callData->argc < 2) ? MonthFromTime(t) : ctx->callData->args[1].toNumber();
     double date = (ctx->callData->argc < 3) ? DateFromTime(t) : ctx->callData->args[2].toNumber();
     t = TimeClip(UTC(MakeDate(MakeDay(year, month, date), TimeWithinDay(t))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_setFullYear(CallContext *ctx)
@@ -1232,15 +1232,15 @@ ReturnedValue DatePrototype::method_setFullYear(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = LocalTime(self->value.asDouble());
+    double t = LocalTime(self->date().asDouble());
     if (std::isnan(t))
         t = 0;
     double year = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN();
     double month = (ctx->callData->argc < 2) ? MonthFromTime(t) : ctx->callData->args[1].toNumber();
     double date = (ctx->callData->argc < 3) ? DateFromTime(t) : ctx->callData->args[2].toNumber();
     t = TimeClip(UTC(MakeDate(MakeDay(year, month, date), TimeWithinDay(t))));
-    self->value.setDouble(t);
-    return self->value.asReturnedValue();
+    self->date().setDouble(t);
+    return self->date().asReturnedValue();
 }
 
 ReturnedValue DatePrototype::method_toUTCString(CallContext *ctx)
@@ -1249,7 +1249,7 @@ ReturnedValue DatePrototype::method_toUTCString(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     return ctx->engine->newString(ToUTCString(t))->asReturnedValue();
 }
 
@@ -1272,7 +1272,7 @@ ReturnedValue DatePrototype::method_toISOString(CallContext *ctx)
     if (!self)
         return ctx->throwTypeError();
 
-    double t = self->value.asDouble();
+    double t = self->date().asDouble();
     if (!std::isfinite(t))
         return ctx->throwRangeError(ctx->callData->thisObject);
 
index 7619d55..01d4ba8 100644 (file)
@@ -54,18 +54,29 @@ namespace QV4 {
 struct DateObject: Object {
     V4_OBJECT
     Q_MANAGED_TYPE(DateObject)
-    Value value;
-    DateObject(ExecutionEngine *engine, const ValueRef date): Object(engine->dateClass) {
-        value = date;
+
+    struct Data {
+        Value value;
+    };
+    Data data;
+
+    Value date() const { return data.value; }
+    Value &date() { return data.value; }
+    void setDate(const ValueRef d) { data.value = d; }
+
+    DateObject(ExecutionEngine *engine, const ValueRef date)
+        : Object(engine->dateClass)
+    {
+        setDate(date);
     }
-    DateObject(ExecutionEngine *engine, const QDateTime &value);
+    DateObject(ExecutionEngine *engine, const QDateTime &date);
 
     QDateTime toQDateTime() const;
 
 protected:
     DateObject(InternalClass *ic): Object(ic) {
         Q_ASSERT(internalClass()->vtable == staticVTable());
-        value = Primitive::fromDouble(qSNaN());
+        data.value = Primitive::fromDouble(qSNaN());
     }
 };
 
index ca82af1..c94fb93 100644 (file)
@@ -733,11 +733,11 @@ QString Stringify::Str(const QString &key, ValueRef v)
     o = value.asReturnedValue();
     if (o) {
         if (NumberObject *n = o->asNumberObject())
-            value = n->value;
+            value = n->value();
         else if (StringObject *so = o->asStringObject())
             value = so->value;
         else if (BooleanObject *b =o->asBooleanObject())
-            value = b->value;
+            value = b->value();
     }
 
     if (value->isNull())
@@ -939,7 +939,7 @@ ReturnedValue JsonObject::method_stringify(CallContext *ctx)
 
     ScopedValue s(scope, ctx->argument(2));
     if (NumberObject *n = s->asNumberObject())
-        s = n->value;
+        s = n->value();
     else if (StringObject *so = s->asStringObject())
         s = so->value;
 
index c97e86f..1a41150 100644 (file)
@@ -108,7 +108,7 @@ inline ReturnedValue thisNumberValue(ExecutionContext *ctx)
     NumberObject *n = ctx->callData->thisObject.asNumberObject();
     if (!n)
         return ctx->throwTypeError();
-    return n->value.asReturnedValue();
+    return n->value().asReturnedValue();
 }
 
 inline double thisNumber(ExecutionContext *ctx)
@@ -118,7 +118,7 @@ inline double thisNumber(ExecutionContext *ctx)
     NumberObject *n = ctx->callData->thisObject.asNumberObject();
     if (!n)
         return ctx->throwTypeError();
-    return n->value.asDouble();
+    return n->value().asDouble();
 }
 
 ReturnedValue NumberPrototype::method_toString(CallContext *ctx)
index 4fe3a77..a3689d0 100644 (file)
@@ -317,32 +317,48 @@ private:
 struct BooleanObject: Object {
     V4_OBJECT
     Q_MANAGED_TYPE(BooleanObject)
-    Value value;
+
+    struct Data {
+        Value value;
+    };
+    Data data;
+
+    Value value() const { return data.value; }
+
     BooleanObject(ExecutionEngine *engine, const ValueRef val)
-        : Object(engine->booleanClass) {
-        value = val;
+        : Object(engine->booleanClass)
+    {
+        data.value = val;
     }
 protected:
     BooleanObject(InternalClass *ic)
-        : Object(ic) {
+        : Object(ic)
+    {
         Q_ASSERT(internalClass()->vtable == staticVTable());
-        value = Encode(false);
+        data.value = Encode(false);
     }
 };
 
 struct NumberObject: Object {
     V4_OBJECT
     Q_MANAGED_TYPE(NumberObject)
-    Value value;
+
+    struct Data {
+        Value value;
+    };
+    Data data;
+
+    Value value() const { return data.value; }
+
     NumberObject(ExecutionEngine *engine, const ValueRef val)
         : Object(engine->numberClass) {
-        value = val;
+        data.value = val;
     }
 protected:
     NumberObject(InternalClass *ic)
         : Object(ic) {
         Q_ASSERT(internalClass()->vtable == staticVTable());
-        value = Encode((int)0);
+        data.value = Encode((int)0);
     }
 };
 
index 3d75438..244ca73 100644 (file)
@@ -208,7 +208,7 @@ void Serialize::serialize(QByteArray &data, const QV4::ValueRef v, QV8Engine *en
     } else if (QV4::DateObject *d = v->asDateObject()) {
         reserve(data, sizeof(quint32) + sizeof(double));
         push(data, valueheader(WorkerDate));
-        push(data, d->value.asDouble());
+        push(data, d->date().asDouble());
     } else if (v->as<RegExpObject>()) {
         Scoped<RegExpObject> re(scope, v);
         quint32 flags = re->flags();