Smaller cleanups
authorLars Knoll <lars.knoll@digia.com>
Thu, 10 Oct 2013 14:17:28 +0000 (16:17 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 11 Oct 2013 06:56:26 +0000 (08:56 +0200)
Change-Id: I0a7eee96ef7c92ad4a3c5963010e3ac66fe6ed3a
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
13 files changed:
src/qml/jsruntime/qv4argumentsobject.cpp
src/qml/jsruntime/qv4booleanobject.cpp
src/qml/jsruntime/qv4errorobject.cpp
src/qml/jsruntime/qv4function.cpp
src/qml/jsruntime/qv4functionobject.cpp
src/qml/jsruntime/qv4mm.cpp
src/qml/jsruntime/qv4numberobject.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4qobjectwrapper.cpp
src/qml/jsruntime/qv4value.cpp
src/qml/jsruntime/qv4value_def_p.h
src/qml/jsruntime/qv4value_p.h
src/qml/qml/v8/qv8engine.cpp

index 70adb1f..39d6954 100644 (file)
@@ -178,10 +178,8 @@ void ArgumentsObject::markObjects(Managed *that)
 {
     ArgumentsObject *o = static_cast<ArgumentsObject *>(that);
     o->context->mark();
-    for (int i = 0; i < o->mappedArguments.size(); ++i) {
-        Managed *m = o->mappedArguments.at(i).asManaged();
-        if (m)
-            m->mark();
-    }
+    for (int i = 0; i < o->mappedArguments.size(); ++i)
+        o->mappedArguments.at(i).mark();
+
     Object::markObjects(that);
 }
index 341e300..d4d6201 100644 (file)
@@ -44,6 +44,7 @@
 using namespace QV4;
 
 DEFINE_MANAGED_VTABLE(BooleanCtor);
+DEFINE_MANAGED_VTABLE(BooleanObject);
 
 BooleanCtor::BooleanCtor(ExecutionContext *scope)
     : FunctionObject(scope, QStringLiteral("Boolean"))
@@ -82,7 +83,8 @@ ReturnedValue BooleanPrototype::method_toString(SimpleCallContext *ctx)
     if (ctx->callData->thisObject.isBoolean()) {
         result = ctx->callData->thisObject.booleanValue();
     } else {
-        BooleanObject *thisObject = ctx->callData->thisObject.asBooleanObject();
+        Scope scope(ctx);
+        Scoped<BooleanObject> thisObject(scope, ctx->callData->thisObject);
         if (!thisObject)
             ctx->throwTypeError();
         result = thisObject->value.booleanValue();
@@ -93,7 +95,9 @@ ReturnedValue BooleanPrototype::method_toString(SimpleCallContext *ctx)
 
 ReturnedValue BooleanPrototype::method_valueOf(SimpleCallContext *ctx)
 {
-    BooleanObject *thisObject = ctx->callData->thisObject.asBooleanObject();
+    // ### Shouldn't this work for a boolean thisObject?
+    Scope scope(ctx);
+    Scoped<BooleanObject> thisObject(scope, ctx->callData->thisObject);
     if (!thisObject)
         ctx->throwTypeError();
 
index 58375ea..ef9dc47 100644 (file)
@@ -169,7 +169,8 @@ ErrorObject::ErrorObject(InternalClass *ic, const QString &message, const QStrin
 
 ReturnedValue ErrorObject::method_get_stack(SimpleCallContext *ctx)
 {
-    ErrorObject *This = ctx->callData->thisObject.asErrorObject();
+    Scope scope(ctx);
+    Scoped<ErrorObject> This(scope, ctx->callData->thisObject);
     if (!This)
         ctx->throwTypeError();
     if (!This->stack) {
index dc2643b..65fec54 100644 (file)
@@ -82,8 +82,7 @@ Function::~Function()
 
 void Function::mark()
 {
-    if (name.asManaged())
-        name.asManaged()->mark();
+    name.mark();
     for (int i = 0; i < formals.size(); ++i)
         formals.at(i)->mark();
     for (int i = 0; i < locals.size(); ++i)
index 058c71f..e67b3ef 100644 (file)
@@ -719,10 +719,8 @@ void BoundFunction::markObjects(Managed *that)
 {
     BoundFunction *o = static_cast<BoundFunction *>(that);
     o->target->mark();
-    if (Managed *m = o->boundThis.asManaged())
-        m->mark();
+    o->boundThis.mark();
     for (int i = 0; i < o->boundArgs.size(); ++i)
-        if (Managed *m = o->boundArgs.at(i).asManaged())
-            m->mark();
+        o->boundArgs.at(i).mark();
     FunctionObject::markObjects(that);
 }
index 59dd4e8..81b9e1a 100644 (file)
@@ -332,8 +332,7 @@ void MemoryManager::mark()
             persistent = n;
             continue;
         }
-        if (Managed *m = persistent->value.asManaged())
-            m->mark();
+        persistent->value.mark();
         persistent = persistent->next;
     }
 
@@ -668,8 +667,8 @@ void MemoryManager::collectFromStack() const
 
 void MemoryManager::collectFromJSStack() const
 {
-    Value *v = engine()->jsStackBase;
-    Value *top = engine()->jsStackTop;
+    SafeValue *v = engine()->jsStackBase;
+    SafeValue *top = engine()->jsStackTop;
     while (v < top) {
         Managed *m = v->asManaged();
         if (m && m->inUse)
index 3ff4b79..8a09de5 100644 (file)
@@ -49,6 +49,7 @@
 using namespace QV4;
 
 DEFINE_MANAGED_VTABLE(NumberCtor);
+DEFINE_MANAGED_VTABLE(NumberObject);
 
 NumberCtor::NumberCtor(ExecutionContext *scope)
     : FunctionObject(scope, QStringLiteral("Number"))
index 77f8d11..032aadd 100644 (file)
@@ -329,9 +329,11 @@ private:
 };
 
 struct BooleanObject: Object {
+    Q_MANAGED
     SafeValue value;
     BooleanObject(ExecutionEngine *engine, const ValueRef val)
         : Object(engine->booleanClass) {
+        vtbl = &static_vtbl;
         type = Type_BooleanObject;
         value = val;
     }
@@ -344,9 +346,11 @@ protected:
 };
 
 struct NumberObject: Object {
+    Q_MANAGED
     SafeValue value;
     NumberObject(ExecutionEngine *engine, const ValueRef val)
         : Object(engine->numberClass) {
+        vtbl = &static_vtbl;
         type = Type_NumberObject;
         value = val;
     }
index 6e474ec..d42d842 100644 (file)
@@ -1486,7 +1486,11 @@ void CallArgument::initAsType(int callType)
 
 void CallArgument::fromValue(int callType, QV8Engine *engine, const QV4::ValueRef value)
 {
-    if (type != 0) { cleanup(); type = 0; }
+    if (type != 0) {
+        cleanup();
+        type = 0;
+    }
+
     QV4::Scope scope(QV8Engine::getV4(engine));
 
     if (callType == qMetaTypeId<QJSValue>()) {
@@ -1524,7 +1528,8 @@ void CallArgument::fromValue(int callType, QV8Engine *engine, const QV4::ValueRe
         type = callType;
     } else if (callType == qMetaTypeId<QList<QObject*> >()) {
         qlistPtr = new (&allocData) QList<QObject *>();
-        if (QV4::ArrayObject *array = value->asArrayObject()) {
+        QV4::ScopedArrayObject array(scope, value);
+        if (array) {
             Scoped<QV4::QObjectWrapper> qobjectWrapper(scope);
 
             uint32_t length = array->arrayLength();
index 318fb48..ebd1894 100644 (file)
@@ -402,10 +402,7 @@ void WeakValue::markOnce()
 {
     if (!d)
         return;
-    Managed *m = d->value.asManaged();
-    if (!m)
-        return;
-    m->mark();
+    d->value.mark();
 }
 
 PersistentValuePrivate::PersistentValuePrivate(ReturnedValue v, ExecutionEngine *e, bool weak)
index 24d62cf..c8d03cf 100644 (file)
@@ -312,7 +312,6 @@ struct Q_QML_EXPORT Value
     Managed *asManaged() const;
     Object *asObject() const;
     FunctionObject *asFunctionObject() const;
-    BooleanObject *asBooleanObject() const;
     NumberObject *asNumberObject() const;
     StringObject *asStringObject() const;
     DateObject *asDateObject() const;
@@ -444,6 +443,8 @@ struct Safe : public SafeValue
     const T *operator->() const { return static_cast<T *>(managed()); }
     T *getPointer() const { return static_cast<T *>(managed()); }
     Returned<T> *ret() const;
+
+    void mark() { if (managed()) managed()->mark(); }
 };
 typedef Safe<String> SafeString;
 typedef Safe<Object> SafeObject;
index 7345098..362f41a 100644 (file)
@@ -247,11 +247,6 @@ inline FunctionObject *Value::asFunctionObject() const
     return isObject() ? managed()->asFunctionObject() : 0;
 }
 
-inline BooleanObject *Value::asBooleanObject() const
-{
-    return isObject() ? managed()->asBooleanObject() : 0;
-}
-
 inline NumberObject *Value::asNumberObject() const
 {
     return isObject() ? managed()->asNumberObject() : 0;
index 149896b..4e8738b 100644 (file)
@@ -790,23 +790,30 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data)
             return true;
         } break;
     }
-    case QMetaType::QStringList:
-        if (QV4::ArrayObject *a = value->asArrayObject()) {
+    case QMetaType::QStringList: {
+        QV4::ScopedArrayObject a(scope, value);
+        if (a) {
             *reinterpret_cast<QStringList *>(data) = a->toQStringList();
             return true;
-        } break;
-    case QMetaType::QVariantList:
-        if (value->asArrayObject()) {
-            QV4::ScopedArrayObject a(scope, value);
+        }
+        break;
+    }
+    case QMetaType::QVariantList: {
+        QV4::ScopedArrayObject a(scope, value);
+        if (a) {
             *reinterpret_cast<QVariantList *>(data) = variantListFromJS(a);
             return true;
-        } break;
-    case QMetaType::QVariantMap:
-        if (value->asObject()) {
-            QV4::ScopedObject o(scope, value);
+        }
+        break;
+    }
+    case QMetaType::QVariantMap: {
+        QV4::ScopedObject o(scope, value);
+        if (o) {
             *reinterpret_cast<QVariantMap *>(data) = variantMapFromJS(o);
             return true;
-        } break;
+        }
+        break;
+    }
     case QMetaType::QVariant:
         *reinterpret_cast<QVariant*>(data) = variantFromJS(value);
         return true;
@@ -820,8 +827,11 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data)
     }
     case QMetaType::QJsonArray: {
         QV4::ScopedArrayObject a(scope, value);
-        *reinterpret_cast<QJsonArray *>(data) = QV4::JsonObject::toJsonArray(a);
-        return true;
+        if (a) {
+            *reinterpret_cast<QJsonArray *>(data) = QV4::JsonObject::toJsonArray(a);
+            return true;
+        }
+        break;
     }
     default:
     ;
@@ -927,8 +937,10 @@ QVariant QV8Engine::variantFromJS(const QV4::ValueRef value,
         return value->asDouble();
     if (value->isString())
         return value->stringValue()->toQString();
+
     Q_ASSERT(value->isObject());
     QV4::Scope scope(value->engine());
+
     if (value->asArrayObject()) {
         QV4::ScopedArrayObject a(scope, value);
         return variantListFromJS(a, visitedObjects);