Store a double in NumberObject
authorLars Knoll <lars.knoll@theqtcompany.com>
Fri, 16 Jan 2015 11:44:51 +0000 (12:44 +0100)
committerLars Knoll <lars.knoll@digia.com>
Fri, 23 Jan 2015 11:30:41 +0000 (12:30 +0100)
Makes more sense than storing a Value in there.

Change-Id: I2e6ca71477100c1e1639bb89cced4f4049b5e5c2
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4engine.cpp
src/qml/jsruntime/qv4engine_p.h
src/qml/jsruntime/qv4jsonobject.cpp
src/qml/jsruntime/qv4numberobject.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4runtime.cpp

index 9579f3d..e7ad99b 100644 (file)
@@ -540,7 +540,7 @@ Heap::Object *ExecutionEngine::newStringObject(const Value &value)
     return object->d();
 }
 
-Heap::Object *ExecutionEngine::newNumberObject(const Value &value)
+Heap::Object *ExecutionEngine::newNumberObject(double value)
 {
     Scope scope(this);
     Scoped<NumberObject> object(scope, memoryManager->alloc<NumberObject>(this, value));
index 124f4e8..5709ca9 100644 (file)
@@ -261,7 +261,7 @@ public:
     Heap::String *newIdentifier(const QString &text);
 
     Heap::Object *newStringObject(const Value &value);
-    Heap::Object *newNumberObject(const Value &value);
+    Heap::Object *newNumberObject(double value);
     Heap::Object *newBooleanObject(bool b);
 
     Heap::ArrayObject *newArrayObject(int count = 0);
index 724a2e0..c8582f1 100644 (file)
@@ -729,11 +729,11 @@ QString Stringify::Str(const QString &key, const Value &v)
     o = value->asReturnedValue();
     if (o) {
         if (NumberObject *n = o->asNumberObject())
-            value = n->value();
+            value = Encode(n->value());
         else if (StringObject *so = o->asStringObject())
             value = so->d()->value;
         else if (BooleanObject *b =o->asBooleanObject())
-            value = b->value();
+            value = Encode(b->value());
     }
 
     if (value->isNull())
@@ -934,7 +934,7 @@ ReturnedValue JsonObject::method_stringify(CallContext *ctx)
 
     ScopedValue s(scope, ctx->argument(2));
     if (NumberObject *n = s->asNumberObject())
-        s = n->value();
+        s = Encode(n->value());
     else if (StringObject *so = s->asStringObject())
         s = so->d()->value;
 
index bbe6bb9..acabe34 100644 (file)
@@ -54,8 +54,7 @@ ReturnedValue NumberCtor::construct(Managed *m, CallData *callData)
 {
     Scope scope(m->cast<NumberCtor>()->engine());
     double dbl = callData->argc ? callData->args[0].toNumber() : 0.;
-    ScopedValue d(scope, QV4::Primitive::fromDouble(dbl));
-    return Encode(scope.engine->newNumberObject(d));
+    return Encode(scope.engine->newNumberObject(dbl));
 }
 
 ReturnedValue NumberCtor::call(Managed *, CallData *callData)
@@ -101,7 +100,7 @@ inline ReturnedValue thisNumberValue(ExecutionContext *ctx)
     NumberObject *n = ctx->thisObject().asNumberObject();
     if (!n)
         return ctx->engine()->throwTypeError();
-    return n->value().asReturnedValue();
+    return Encode(n->value());
 }
 
 inline double thisNumber(ExecutionContext *ctx)
@@ -111,7 +110,7 @@ inline double thisNumber(ExecutionContext *ctx)
     NumberObject *n = ctx->thisObject().asNumberObject();
     if (!n)
         return ctx->engine()->throwTypeError();
-    return n->value().asDouble();
+    return n->value();
 }
 
 ReturnedValue NumberPrototype::method_toString(CallContext *ctx)
index 4e88cd7..6dc58a6 100644 (file)
@@ -348,17 +348,17 @@ struct BooleanObject : Object {
 
 struct NumberObject : Object {
     NumberObject(InternalClass *ic, QV4::Object *prototype)
-        : Object(ic, prototype)
+        : Object(ic, prototype),
+          value(0)
     {
-        value = Encode((int)0);
     }
 
-    NumberObject(ExecutionEngine *engine, const Value &val)
-        : Object(engine->emptyClass, engine->numberPrototype.asObject())
+    NumberObject(ExecutionEngine *engine, double val)
+        : Object(engine->emptyClass, engine->numberPrototype.asObject()),
+          value(val)
     {
-        value = val;
     }
-    Value value;
+    double value;
 };
 
 struct ArrayObject : Object {
@@ -391,7 +391,7 @@ struct NumberObject: Object {
     V4_OBJECT2(NumberObject, Object)
     Q_MANAGED_TYPE(NumberObject)
 
-    Value value() const { return d()->value; }
+    double value() const { return d()->value; }
 };
 
 struct ArrayObject: Object {
index 4167823..28f2a59 100644 (file)
@@ -441,7 +441,7 @@ Heap::Object *RuntimeHelpers::convertToObject(ExecutionEngine *engine, const Val
         return engine->newStringObject(value);
     case Value::Integer_Type:
     default: // double
-        return engine->newNumberObject(value);
+        return engine->newNumberObject(value.asDouble());
     }
 }