Convert the last Managed types to the new constructor syntax
authorLars Knoll <lars.knoll@digia.com>
Fri, 9 May 2014 13:23:18 +0000 (15:23 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Tue, 22 Jul 2014 11:49:19 +0000 (13:49 +0200)
Change-Id: I11701c586d4715c08feba4650e12904c3fa7ca27
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4argumentsobject.cpp
src/qml/jsruntime/qv4argumentsobject_p.h
src/qml/jsruntime/qv4engine.cpp
src/qml/jsruntime/qv4object.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4objectiterator_p.h
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4sequenceobject.cpp

index 11e15d8..edd7f3a 100644 (file)
@@ -46,38 +46,37 @@ using namespace QV4;
 
 DEFINE_OBJECT_VTABLE(ArgumentsObject);
 
-ArgumentsObject::ArgumentsObject(CallContext *context)
-    : Object(context->d()->strictMode ? context->d()->engine->strictArgumentsObjectClass : context->d()->engine->argumentsObjectClass)
+ArgumentsObject::Data::Data(CallContext *context)
+    : Object::Data(context->d()->strictMode ? context->d()->engine->strictArgumentsObjectClass : context->d()->engine->argumentsObjectClass)
+    , context(context)
+    , fullyCreated(false)
 {
-    d()->context = context;
-    d()->fullyCreated = false;
+    Q_ASSERT(internalClass->vtable == staticVTable());
 
     ExecutionEngine *v4 = context->d()->engine;
     Scope scope(v4);
-    ScopedObject protectThis(scope, this);
+    Scoped<ArgumentsObject> args(scope, this);
 
-    setArrayType(ArrayData::Complex);
+    args->setArrayType(ArrayData::Complex);
 
     if (context->d()->strictMode) {
-        Q_ASSERT(CalleePropertyIndex == internalClass()->find(context->d()->engine->id_callee));
-        Q_ASSERT(CallerPropertyIndex == internalClass()->find(context->d()->engine->id_caller));
-        propertyAt(CalleePropertyIndex)->value = v4->thrower;
-        propertyAt(CalleePropertyIndex)->set = v4->thrower;
-        propertyAt(CallerPropertyIndex)->value = v4->thrower;
-        propertyAt(CallerPropertyIndex)->set = v4->thrower;
-
-        arrayReserve(context->d()->callData->argc);
-        arrayPut(0, context->d()->callData->args, context->d()->callData->argc);
-        d()->fullyCreated = true;
+        Q_ASSERT(CalleePropertyIndex == args->internalClass()->find(context->d()->engine->id_callee));
+        Q_ASSERT(CallerPropertyIndex == args->internalClass()->find(context->d()->engine->id_caller));
+        args->propertyAt(CalleePropertyIndex)->value = v4->thrower;
+        args->propertyAt(CalleePropertyIndex)->set = v4->thrower;
+        args->propertyAt(CallerPropertyIndex)->value = v4->thrower;
+        args->propertyAt(CallerPropertyIndex)->set = v4->thrower;
+
+        args->arrayReserve(context->d()->callData->argc);
+        args->arrayPut(0, context->d()->callData->args, context->d()->callData->argc);
+        args->d()->fullyCreated = true;
     } else {
-        setHasAccessorProperty();
-        Q_ASSERT(CalleePropertyIndex == internalClass()->find(context->d()->engine->id_callee));
-        memberData()[CalleePropertyIndex] = context->function->asReturnedValue();
+        args->setHasAccessorProperty();
+        Q_ASSERT(CalleePropertyIndex == args->internalClass()->find(context->d()->engine->id_callee));
+        args->memberData()[CalleePropertyIndex] = context->function->asReturnedValue();
     }
-    Q_ASSERT(LengthPropertyIndex == internalClass()->find(context->d()->engine->id_length));
-    memberData()[LengthPropertyIndex] = Primitive::fromInt32(context->realArgumentCount);
-
-    Q_ASSERT(internalClass()->vtable == staticVTable());
+    Q_ASSERT(LengthPropertyIndex == args->internalClass()->find(context->d()->engine->id_length));
+    args->memberData()[LengthPropertyIndex] = Primitive::fromInt32(context->realArgumentCount);
 }
 
 void ArgumentsObject::fullyCreate()
index 3b03008..c56effe 100644 (file)
@@ -93,6 +93,7 @@ struct ArgumentsSetterFunction: FunctionObject
 
 struct ArgumentsObject: Object {
     struct Data : Object::Data {
+        Data(CallContext *context);
         CallContext *context;
         bool fullyCreated;
         Members mappedArguments;
@@ -109,8 +110,6 @@ struct ArgumentsObject: Object {
     bool fullyCreated() const { return d()->fullyCreated; }
     Members &mappedArguments() { return d()->mappedArguments; }
 
-    ArgumentsObject(CallContext *context);
-
     static bool isNonStrictArgumentsObject(Managed *m) {
         return m->internalClass()->vtable->type == Type_ArgumentsObject &&
                 !static_cast<ArgumentsObject *>(m)->context()->d()->strictMode;
index a9cbdae..58520ad 100644 (file)
@@ -485,13 +485,15 @@ ExecutionContext *ExecutionEngine::pushGlobalContext()
 
 Returned<Object> *ExecutionEngine::newObject()
 {
-    Object *object = new (memoryManager) Object(this);
+    Scope scope(this);
+    ScopedObject object(scope, new (this) Object::Data(this));
     return object->asReturned<Object>();
 }
 
 Returned<Object> *ExecutionEngine::newObject(InternalClass *internalClass)
 {
-    Object *object = new (memoryManager) Object(internalClass);
+    Scope scope(this);
+    ScopedObject object(scope, new (this) Object::Data(internalClass));
     return object->asReturned<Object>();
 }
 
@@ -666,7 +668,8 @@ Returned<Object> *ExecutionEngine::newVariantObject(const QVariant &v)
 
 Returned<Object> *ExecutionEngine::newForEachIteratorObject(ExecutionContext *ctx, Object *o)
 {
-    Object *obj = new (memoryManager) ForEachIteratorObject(ctx, o);
+    Scope scope(this);
+    ScopedObject obj(scope, new (this) ForEachIteratorObject::Data(ctx, o));
     return obj->asReturned<Object>();
 }
 
index d857075..e0f05a6 100644 (file)
@@ -80,23 +80,6 @@ Object::Data::Data(InternalClass *internalClass)
     }
 }
 
-Object::Object(ExecutionEngine *engine)
-    : Managed(engine->objectClass)
-{
-}
-
-Object::Object(InternalClass *ic)
-    : Managed(ic)
-{
-    Q_ASSERT(internalClass()->vtable != &Managed::static_vtbl);
-
-    if (internalClass()->size) {
-        Scope scope(engine());
-        ScopedObject protectThis(scope, this);
-        memberData().ensureIndex(engine(), internalClass()->size);
-    }
-}
-
 bool Object::setPrototype(Object *proto)
 {
     Object *pp = proto;
index a1b107d..3497f58 100644 (file)
@@ -132,9 +132,6 @@ struct Q_QML_EXPORT Object: Managed {
 
     Property *propertyAt(uint index) const { return reinterpret_cast<Property *>(memberData().data() + index); }
 
-    Object(ExecutionEngine *engine);
-    Object(InternalClass *internalClass);
-
     const ObjectVTable *vtable() const { return reinterpret_cast<const ObjectVTable *>(internalClass()->vtable); }
     Object *prototype() const { return internalClass()->prototype; }
     bool setPrototype(Object *proto);
index 6a84319..fa2b2b7 100644 (file)
@@ -84,8 +84,11 @@ struct Q_QML_EXPORT ObjectIterator
 
 struct ForEachIteratorObject: Object {
     struct Data : Object::Data {
-        Data(Object *o, uint flags)
-            : it(workArea, workArea + 1, o, flags) {}
+        Data(ExecutionContext *ctx, Object *o)
+            : Object::Data(ctx->engine())
+            , it(workArea, workArea + 1, o, ObjectIterator::EnumerableOnly|ObjectIterator::WithProtoChain) {
+            setVTable(staticVTable());
+        }
         ObjectIterator it;
         Value workArea[2];
     };
@@ -98,12 +101,6 @@ struct ForEachIteratorObject: Object {
     V4_OBJECT
     Q_MANAGED_TYPE(ForeachIteratorObject)
 
-    ForEachIteratorObject(ExecutionContext *ctx, Object *o)
-        : Object(ctx->d()->engine)
-        , __data(o, ObjectIterator::EnumerableOnly|ObjectIterator::WithProtoChain) {
-        setVTable(staticVTable());
-    }
-
     ReturnedValue nextPropertyName() { return d()->it.nextPropertyNameAsString(); }
 
 protected:
index e84e85c..6dc3b1c 100644 (file)
@@ -1192,7 +1192,7 @@ QV4::ReturnedValue Runtime::setupArgumentsObject(ExecutionContext *ctx)
 {
     Q_ASSERT(ctx->d()->type >= ExecutionContext::Type_CallContext);
     CallContext *c = static_cast<CallContext *>(ctx);
-    return (new (c->engine()->memoryManager) ArgumentsObject(c))->asReturnedValue();
+    return (new (c->engine()) ArgumentsObject::Data(c))->asReturnedValue();
 }
 
 #endif // V4_BOOTSTRAP
index 9995bcc..ed6e490 100644 (file)
@@ -163,9 +163,33 @@ template <> bool convertValueToElement(const ValueRef value)
 }
 
 template <typename Container>
-class QQmlSequence : public QV4::Object
+struct QQmlSequence : public QV4::Object
 {
-    struct Data : QV4::Object::Data {
+    struct Data : Object::Data {
+        Data(QV4::ExecutionEngine *engine, const Container &container)
+            : Object::Data(InternalClass::create(engine, staticVTable(), engine->sequencePrototype.asObject()))
+            , container(container)
+            , propertyIndex(-1)
+            , isReference(false)
+        {
+            QV4::Scope scope(engine);
+            QV4::Scoped<QQmlSequence<Container> > o(scope, this);
+            o->setArrayType(ArrayData::Custom);
+            o->init();
+        }
+
+        Data(QV4::ExecutionEngine *engine, QObject *object, int propertyIndex)
+            : Object::Data(InternalClass::create(engine, staticVTable(), engine->sequencePrototype.asObject()))
+            , object(object)
+            , propertyIndex(propertyIndex)
+            , isReference(true)
+        {
+            QV4::Scope scope(engine);
+            QV4::Scoped<QQmlSequence<Container> > o(scope, this);
+            o->setArrayType(ArrayData::Custom);
+            o->loadReference();
+            o->init();
+        }
         mutable Container container;
         QPointer<QObject> object;
         int propertyIndex;
@@ -181,34 +205,6 @@ class QQmlSequence : public QV4::Object
     V4_OBJECT
     Q_MANAGED_TYPE(QmlSequence)
 public:
-    QQmlSequence(QV4::ExecutionEngine *engine, const Container &container)
-        : QV4::Object(InternalClass::create(engine, staticVTable(), engine->sequencePrototype.asObject()))
-    {
-        d()->container = container;
-        d()->propertyIndex = -1;
-        d()->isReference = false;
-
-        QV4::Scope scope(engine);
-        QV4::ScopedObject protectThis(scope, this);
-        Q_UNUSED(protectThis);
-        setArrayType(ArrayData::Custom);
-        init();
-    }
-
-    QQmlSequence(QV4::ExecutionEngine *engine, QObject *object, int propertyIndex)
-        : QV4::Object(InternalClass::create(engine, staticVTable(), engine->sequencePrototype.asObject()))
-    {
-        d()->object = object;
-        d()->propertyIndex = propertyIndex;
-        d()->isReference = true;
-
-        QV4::Scope scope(engine);
-        QV4::ScopedObject protectThis(scope, this);
-        Q_UNUSED(protectThis);
-        setArrayType(ArrayData::Custom);
-        loadReference();
-        init();
-    }
 
     void init()
     {
@@ -591,7 +587,7 @@ bool SequencePrototype::isSequenceType(int sequenceTypeId)
 
 #define NEW_REFERENCE_SEQUENCE(ElementType, ElementTypeName, SequenceType, unused) \
     if (sequenceType == qMetaTypeId<SequenceType>()) { \
-        QV4::Scoped<QV4::Object> obj(scope, new (engine->memoryManager) QQml##ElementTypeName##List(engine, object, propertyIndex)); \
+        QV4::Scoped<QV4::Object> obj(scope, new (engine) QQml##ElementTypeName##List::Data(engine, object, propertyIndex)); \
         return obj.asReturnedValue(); \
     } else
 
@@ -609,7 +605,7 @@ ReturnedValue SequencePrototype::newSequence(QV4::ExecutionEngine *engine, int s
 
 #define NEW_COPY_SEQUENCE(ElementType, ElementTypeName, SequenceType, unused) \
     if (sequenceType == qMetaTypeId<SequenceType>()) { \
-        QV4::Scoped<QV4::Object> obj(scope, new (engine->memoryManager) QQml##ElementTypeName##List(engine, v.value<SequenceType >())); \
+        QV4::Scoped<QV4::Object> obj(scope, new (engine) QQml##ElementTypeName##List::Data(engine, v.value<SequenceType >())); \
         return obj.asReturnedValue(); \
     } else