Move extension mechanism over to use the v4 engine
authorLars Knoll <lars.knoll@theqtcompany.com>
Wed, 31 Dec 2014 12:21:39 +0000 (13:21 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Thu, 8 Jan 2015 21:08:55 +0000 (22:08 +0100)
Change-Id: Ib329fc7bcae3c78d962a116f53b2244a71f81228
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/imports/localstorage/plugin.cpp
src/particles/qquickv4particledata.cpp
src/qml/qml/qqmlcomponent.cpp
src/qml/qml/qqmllocale.cpp
src/qml/qml/v8/qqmlbuiltinfunctions.cpp
src/qml/qml/v8/qv8engine_p.h
src/qml/types/qqmldelegatemodel.cpp
src/qml/util/qqmladaptormodel.cpp
src/quick/items/context2d/qquickcontext2d.cpp

index 7c7989a..0ada149 100644 (file)
@@ -82,7 +82,7 @@ QT_BEGIN_NAMESPACE
 class QQmlSqlDatabaseData : public QV8Engine::Deletable
 {
 public:
-    QQmlSqlDatabaseData(QV8Engine *engine);
+    QQmlSqlDatabaseData(QV4::ExecutionEngine *engine);
     ~QQmlSqlDatabaseData();
 
     QV4::PersistentValue databaseProto;
@@ -90,7 +90,7 @@ public:
     QV4::PersistentValue rowsProto;
 };
 
-V8_DEFINE_EXTENSION(QQmlSqlDatabaseData, databaseData)
+V4_DEFINE_EXTENSION(QQmlSqlDatabaseData, databaseData)
 
 namespace QV4 {
 
@@ -318,7 +318,7 @@ static ReturnedValue qmlsqldatabase_executeSql(CallContext *ctx)
         }
         if (query.exec()) {
             QV4::Scoped<QQmlSqlDatabaseWrapper> rows(scope, QQmlSqlDatabaseWrapper::create(engine));
-            QV4::ScopedObject p(scope, databaseData(engine)->rowsProto.value());
+            QV4::ScopedObject p(scope, databaseData(scope.engine)->rowsProto.value());
             rows->setPrototype(p.getPointer());
             rows->d()->type = Heap::QQmlSqlDatabaseWrapper::Rows;
             rows->d()->database = db;
@@ -395,7 +395,7 @@ static ReturnedValue qmlsqldatabase_changeVersion(CallContext *ctx)
         V4THROW_SQL(SQLEXCEPTION_VERSION_ERR, QQmlEngine::tr("Version mismatch: expected %1, found %2").arg(from_version).arg(r->d()->version));
 
     Scoped<QQmlSqlDatabaseWrapper> w(scope, QQmlSqlDatabaseWrapper::create(engine));
-    ScopedObject p(scope, databaseData(engine)->queryProto.value());
+    ScopedObject p(scope, databaseData(scope.engine)->queryProto.value());
     w->setPrototype(p.getPointer());
     w->d()->type = Heap::QQmlSqlDatabaseWrapper::Query;
     w->d()->database = db;
@@ -448,7 +448,7 @@ static ReturnedValue qmlsqldatabase_transaction_shared(CallContext *ctx, bool re
     QSqlDatabase db = r->d()->database;
 
     Scoped<QQmlSqlDatabaseWrapper> w(scope, QQmlSqlDatabaseWrapper::create(engine));
-    QV4::ScopedObject p(scope, databaseData(engine)->queryProto.value());
+    QV4::ScopedObject p(scope, databaseData(scope.engine)->queryProto.value());
     w->setPrototype(p.getPointer());
     w->d()->type = Heap::QQmlSqlDatabaseWrapper::Query;
     w->d()->database = db;
@@ -481,9 +481,8 @@ static ReturnedValue qmlsqldatabase_read_transaction(CallContext *ctx)
     return qmlsqldatabase_transaction_shared(ctx, true);
 }
 
-QQmlSqlDatabaseData::QQmlSqlDatabaseData(QV8Engine *engine)
+QQmlSqlDatabaseData::QQmlSqlDatabaseData(ExecutionEngine *v4)
 {
-    ExecutionEngine *v4 = QV8Engine::getV4(engine);
     Scope scope(v4);
     {
         ScopedObject proto(scope, v4->newObject());
@@ -726,7 +725,7 @@ void QQuickLocalStorage::openDatabaseSync(QQmlV4Function *args)
     }
 
     QV4::Scoped<QQmlSqlDatabaseWrapper> db(scope, QQmlSqlDatabaseWrapper::create(engine));
-    QV4::ScopedObject p(scope, databaseData(engine)->databaseProto.value());
+    QV4::ScopedObject p(scope, databaseData(scope.engine)->databaseProto.value());
     db->setPrototype(p.getPointer());
     db->d()->database = database;
     db->d()->version = version;
index 660bc7c..b9cf926 100644 (file)
@@ -279,11 +279,11 @@ struct QV4ParticleData : public QV4::Object
 
 DEFINE_OBJECT_VTABLE(QV4ParticleData);
 
-class QV8ParticleDataDeletable : public QV8Engine::Deletable
+class QV4ParticleDataDeletable : public QV8Engine::Deletable
 {
 public:
-    QV8ParticleDataDeletable(QV8Engine *engine);
-    ~QV8ParticleDataDeletable();
+    QV4ParticleDataDeletable(QV4::ExecutionEngine *engine);
+    ~QV4ParticleDataDeletable();
 
     QV4::PersistentValue proto;
 };
@@ -445,9 +445,8 @@ FAKE_FLOAT_GETTER_AND_SETTER(curY, curY, setInstantaneousY)
 FAKE_FLOAT_GETTER_AND_SETTER(curVY, curVY, setInstantaneousVY)
 FAKE_FLOAT_GETTER_AND_SETTER(curAY, curAY, setInstantaneousAY)
 
-QV8ParticleDataDeletable::QV8ParticleDataDeletable(QV8Engine *engine)
+QV4ParticleDataDeletable::QV4ParticleDataDeletable(QV4::ExecutionEngine *v4)
 {
-    QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
     QV4::Scope scope(v4);
     QV4::ScopedObject p(scope, v4->newObject());
 
@@ -493,11 +492,11 @@ QV8ParticleDataDeletable::QV8ParticleDataDeletable(QV8Engine *engine)
     proto = p;
 }
 
-QV8ParticleDataDeletable::~QV8ParticleDataDeletable()
+QV4ParticleDataDeletable::~QV4ParticleDataDeletable()
 {
 }
 
-V8_DEFINE_EXTENSION(QV8ParticleDataDeletable, particleV8Data);
+V4_DEFINE_EXTENSION(QV4ParticleDataDeletable, particleV4Data);
 
 
 QQuickV4ParticleData::QQuickV4ParticleData(QV8Engine* engine, QQuickParticleData* datum)
@@ -505,9 +504,9 @@ QQuickV4ParticleData::QQuickV4ParticleData(QV8Engine* engine, QQuickParticleData
     if (!engine || !datum)
         return;
 
-    QV8ParticleDataDeletable *d = particleV8Data(engine);
     QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
     QV4::Scope scope(v4);
+    QV4ParticleDataDeletable *d = particleV4Data(scope.engine);
     QV4::ScopedObject o(scope, v4->memoryManager->alloc<QV4ParticleData>(v4, datum));
     QV4::ScopedObject p(scope, d->proto.value());
     o->setPrototype(p);
index 115046f..96623f2 100644 (file)
@@ -87,12 +87,12 @@ QT_BEGIN_NAMESPACE
 class QQmlComponentExtension : public QV8Engine::Deletable
 {
 public:
-    QQmlComponentExtension(QV8Engine *);
+    QQmlComponentExtension(QV4::ExecutionEngine *v4);
     virtual ~QQmlComponentExtension();
 
     QV4::PersistentValue incubationProto;
 };
-V8_DEFINE_EXTENSION(QQmlComponentExtension, componentExtension);
+V4_DEFINE_EXTENSION(QQmlComponentExtension, componentExtension);
 
 /*!
     \class QQmlComponent
@@ -1361,7 +1361,7 @@ void QQmlComponent::incubateObject(QQmlV4Function *args)
             mode = QQmlIncubator::AsynchronousIfNested;
     }
 
-    QQmlComponentExtension *e = componentExtension(args->v4engine()->v8Engine);
+    QQmlComponentExtension *e = componentExtension(args->v4engine());
 
     QV4::Scoped<QV4::QmlIncubatorObject> r(scope, v4->memoryManager->alloc<QV4::QmlIncubatorObject>(args->v4engine()->v8Engine, mode));
     QV4::ScopedObject p(scope, e->incubationProto.value());
@@ -1406,9 +1406,8 @@ void QQmlComponentPrivate::initializeObjectWithInitialProperties(const QV4::Valu
     }
 }
 
-QQmlComponentExtension::QQmlComponentExtension(QV8Engine *engine)
+QQmlComponentExtension::QQmlComponentExtension(QV4::ExecutionEngine *v4)
 {
-    QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
     QV4::Scope scope(v4);
     QV4::ScopedObject proto(scope, v4->newObject());
     proto->defineAccessorProperty(QStringLiteral("onStatusChanged"),
index 295347d..9aba582 100644 (file)
@@ -643,20 +643,19 @@ LOCALE_STRING_PROPERTY(exponential)
 LOCALE_STRING_PROPERTY(amText)
 LOCALE_STRING_PROPERTY(pmText)
 
-class QV8LocaleDataDeletable : public QV8Engine::Deletable
+class QV4LocaleDataDeletable : public QV8Engine::Deletable
 {
 public:
-    QV8LocaleDataDeletable(QV8Engine *engine);
-    ~QV8LocaleDataDeletable();
+    QV4LocaleDataDeletable(QV4::ExecutionEngine *engine);
+    ~QV4LocaleDataDeletable();
 
     QV4::PersistentValue prototype;
 };
 
-QV8LocaleDataDeletable::QV8LocaleDataDeletable(QV8Engine *engine)
+QV4LocaleDataDeletable::QV4LocaleDataDeletable(QV4::ExecutionEngine *engine)
 {
-    QV4::ExecutionEngine *eng = QV8Engine::getV4(engine);
-    QV4::Scope scope(eng);
-    QV4::ScopedObject o(scope, eng->newObject());
+    QV4::Scope scope(engine);
+    QV4::Scoped<QV4::Object> o(scope, engine->newObject());
 
     o->defineDefaultProperty(QStringLiteral("dateFormat"), QQmlLocaleData::method_dateFormat, 0);
     o->defineDefaultProperty(QStringLiteral("standaloneDayName"), QQmlLocaleData::method_standaloneDayName, 0);
@@ -687,11 +686,11 @@ QV8LocaleDataDeletable::QV8LocaleDataDeletable(QV8Engine *engine)
     prototype = o;
 }
 
-QV8LocaleDataDeletable::~QV8LocaleDataDeletable()
+QV4LocaleDataDeletable::~QV4LocaleDataDeletable()
 {
 }
 
-V8_DEFINE_EXTENSION(QV8LocaleDataDeletable, localeV8Data);
+V4_DEFINE_EXTENSION(QV4LocaleDataDeletable, localeV4Data);
 
 /*!
     \qmltype Locale
@@ -805,9 +804,9 @@ QV4::ReturnedValue QQmlLocale::locale(QV8Engine *v8engine, const QString &locale
 
 QV4::ReturnedValue QQmlLocale::wrap(QV8Engine *engine, const QLocale &locale)
 {
-    QV8LocaleDataDeletable *d = localeV8Data(engine);
     QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
     QV4::Scope scope(v4);
+    QV4LocaleDataDeletable *d = localeV4Data(scope.engine);
     QV4::Scoped<QQmlLocaleData> wrapper(scope, v4->memoryManager->alloc<QQmlLocaleData>(v4));
     wrapper->d()->locale = locale;
     QV4::ScopedObject p(scope, d->prototype.value());
index 70e512d..4b40fa3 100644 (file)
@@ -885,9 +885,7 @@ QQmlEngine::quit() signal to the QCoreApplication::quit() slot.
 */
 ReturnedValue QtObject::method_quit(CallContext *ctx)
 {
-    QV8Engine *v8engine = ctx->d()->engine->v8Engine;
-
-    QQmlEnginePrivate::get(v8engine->engine())->sendQuit();
+    QQmlEnginePrivate::get(ctx->engine()->qmlEngine())->sendQuit();
     return QV4::Encode::undefined();
 }
 
index 7bd3e56..329f491 100644 (file)
@@ -83,8 +83,8 @@ namespace QV4 {
 #define V4THROW_TYPE(string) \
     return ctx->engine()->throwTypeError(QStringLiteral(string));
 
-#define V8_DEFINE_EXTENSION(dataclass, datafunction) \
-    static inline dataclass *datafunction(QV8Engine *engine) \
+#define V4_DEFINE_EXTENSION(dataclass, datafunction) \
+    static inline dataclass *datafunction(QV4::ExecutionEngine *engine) \
     { \
         static int extensionId = -1; \
         if (extensionId == -1) { \
@@ -93,10 +93,10 @@ namespace QV4 {
                 extensionId = QV8Engine::registerExtension(); \
             QV8Engine::registrationMutex()->unlock(); \
         } \
-        dataclass *rv = (dataclass *)engine->extensionData(extensionId); \
+        dataclass *rv = (dataclass *)engine->v8Engine->extensionData(extensionId); \
         if (!rv) { \
             rv = new dataclass(engine); \
-            engine->setExtensionData(extensionId, rv); \
+            engine->v8Engine->setExtensionData(extensionId, rv); \
         } \
         return rv; \
     } \
index a4d86b5..1468169 100644 (file)
@@ -122,7 +122,7 @@ DEFINE_OBJECT_VTABLE(QV4::DelegateModelGroupFunction);
 class QQmlDelegateModelEngineData : public QV8Engine::Deletable
 {
 public:
-    QQmlDelegateModelEngineData(QV8Engine *engine);
+    QQmlDelegateModelEngineData(QV4::ExecutionEngine *v4);
     ~QQmlDelegateModelEngineData();
 
     QV4::ReturnedValue array(QV8Engine *engine, const QVector<QQmlChangeSet::Change> &changes);
@@ -130,7 +130,7 @@ public:
     QV4::PersistentValue changeProto;
 };
 
-V8_DEFINE_EXTENSION(QQmlDelegateModelEngineData, engineData)
+V4_DEFINE_EXTENSION(QQmlDelegateModelEngineData, engineData)
 
 
 void QQmlDelegateModelPartsMetaObject::propertyCreated(int, QMetaPropertyBuilder &prop)
@@ -2256,8 +2256,8 @@ void QQmlDelegateModelGroupPrivate::emitChanges(QV8Engine *engine)
     Q_Q(QQmlDelegateModelGroup);
     if (isChangedConnected() && !changeSet.isEmpty()) {
         QV4::Scope scope(QV8Engine::getV4(engine));
-        QV4::ScopedValue removed(scope, engineData(engine)->array(engine, changeSet.removes()));
-        QV4::ScopedValue inserted(scope, engineData(engine)->array(engine, changeSet.inserts()));
+        QV4::ScopedValue removed(scope, engineData(scope.engine)->array(engine, changeSet.removes()));
+        QV4::ScopedValue inserted(scope, engineData(scope.engine)->array(engine, changeSet.inserts()));
         emit q->changed(QQmlV4Handle(removed), QQmlV4Handle(inserted));
     }
     if (changeSet.difference() != 0)
@@ -3296,7 +3296,7 @@ public:
 
         const QQmlChangeSet::Change &change = array->at(index);
 
-        QV4::ScopedObject changeProto(scope, engineData(v4->v8Engine)->changeProto.value());
+        QV4::ScopedObject changeProto(scope, engineData(v4)->changeProto.value());
         QV4::Scoped<QQmlDelegateModelGroupChange> object(scope, QQmlDelegateModelGroupChange::create(v4));
         object->setPrototype(changeProto);
         object->d()->change = change;
@@ -3333,9 +3333,8 @@ QV4::Heap::QQmlDelegateModelGroupChangeArray::QQmlDelegateModelGroupChangeArray(
 
 DEFINE_OBJECT_VTABLE(QQmlDelegateModelGroupChangeArray);
 
-QQmlDelegateModelEngineData::QQmlDelegateModelEngineData(QV8Engine *e)
+QQmlDelegateModelEngineData::QQmlDelegateModelEngineData(QV4::ExecutionEngine *v4)
 {
-    QV4::ExecutionEngine *v4 = QV8Engine::getV4(e);
     QV4::Scope scope(v4);
 
     QV4::ScopedObject proto(scope, v4->newObject());
index 262a6ca..580641a 100644 (file)
@@ -46,14 +46,14 @@ QT_BEGIN_NAMESPACE
 class QQmlAdaptorModelEngineData : public QV8Engine::Deletable
 {
 public:
-    QQmlAdaptorModelEngineData(QV8Engine *engine);
+    QQmlAdaptorModelEngineData(QV4::ExecutionEngine *v4);
     ~QQmlAdaptorModelEngineData();
 
     QV4::ExecutionEngine *v4;
     QV4::PersistentValue listItemProto;
 };
 
-V8_DEFINE_EXTENSION(QQmlAdaptorModelEngineData, engineData)
+V4_DEFINE_EXTENSION(QQmlAdaptorModelEngineData, engineData)
 
 static QV4::ReturnedValue get_index(QV4::CallContext *ctx)
 {
@@ -421,7 +421,7 @@ public:
     QV4::ReturnedValue get()
     {
         if (type->prototype.isUndefined()) {
-            QQmlAdaptorModelEngineData * const data = engineData(v4->v8Engine);
+            QQmlAdaptorModelEngineData * const data = engineData(v4);
             type->initializeConstructor(data);
         }
         QV4::Scope scope(v4);
@@ -602,7 +602,7 @@ public:
 
     QV4::ReturnedValue get()
     {
-        QQmlAdaptorModelEngineData *data = engineData(v4->v8Engine);
+        QQmlAdaptorModelEngineData *data = engineData(v4);
         QV4::Scope scope(v4);
         QV4::ScopedObject o(scope, v4->memoryManager->alloc<QQmlDelegateModelItemObject>(v4, this));
         QV4::ScopedObject p(scope, data->listItemProto.value());
@@ -955,8 +955,8 @@ void QQmlAdaptorModel::objectDestroyed(QObject *)
     setModel(QVariant(), 0, 0);
 }
 
-QQmlAdaptorModelEngineData::QQmlAdaptorModelEngineData(QV8Engine *e)
-    : v4(QV8Engine::getV4(e))
+QQmlAdaptorModelEngineData::QQmlAdaptorModelEngineData(QV4::ExecutionEngine *v4)
+    : v4(v4)
 {
     QV4::Scope scope(v4);
     QV4::ScopedObject proto(scope, v4->newObject());
index bed9fb3..5a4ce7e 100644 (file)
@@ -463,7 +463,7 @@ static QFont qt_font_from_string(const QString& fontString, const QFont &current
 class QQuickContext2DEngineData : public QV8Engine::Deletable
 {
 public:
-    QQuickContext2DEngineData(QV8Engine *engine);
+    QQuickContext2DEngineData(QV4::ExecutionEngine *engine);
     ~QQuickContext2DEngineData();
 
     QV4::PersistentValue contextPrototype;
@@ -471,7 +471,7 @@ public:
     QV4::PersistentValue pixelArrayProto;
 };
 
-V8_DEFINE_EXTENSION(QQuickContext2DEngineData, engineData)
+V4_DEFINE_EXTENSION(QQuickContext2DEngineData, engineData)
 
 namespace QV4 {
 namespace Heap {
@@ -937,9 +937,9 @@ DEFINE_OBJECT_VTABLE(QQuickJSContext2DImageData);
 
 static QV4::ReturnedValue qt_create_image_data(qreal w, qreal h, QV8Engine* engine, const QImage& image)
 {
-    QQuickContext2DEngineData *ed = engineData(engine);
     QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
     QV4::Scope scope(v4);
+    QQuickContext2DEngineData *ed = engineData(scope.engine);
     QV4::Scoped<QQuickJSContext2DPixelData> pixelData(scope, scope.engine->memoryManager->alloc<QQuickJSContext2DPixelData>(v4));
     QV4::ScopedObject p(scope, ed->pixelArrayProto.value());
     pixelData->setPrototype(p);
@@ -1546,9 +1546,6 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createLinearGradient(QV4::
     QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>());
     CHECK_CONTEXT(r)
 
-
-    QV8Engine *engine = scope.engine->v8Engine;
-
     if (ctx->d()->callData->argc >= 4) {
         qreal x0 = ctx->d()->callData->args[0].toNumber();
         qreal y0 = ctx->d()->callData->args[1].toNumber();
@@ -1561,7 +1558,7 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createLinearGradient(QV4::
          || !qIsFinite(y1)) {
             V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "createLinearGradient(): Incorrect arguments")
         }
-        QQuickContext2DEngineData *ed = engineData(engine);
+        QQuickContext2DEngineData *ed = engineData(scope.engine);
 
         QV4::Scoped<QQuickContext2DStyle> gradient(scope, scope.engine->memoryManager->alloc<QQuickContext2DStyle>(scope.engine));
         QV4::ScopedObject p(scope, ed->gradientProto.value());
@@ -1592,9 +1589,6 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createRadialGradient(QV4::
     QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>());
     CHECK_CONTEXT(r)
 
-
-    QV8Engine *engine = scope.engine->v8Engine;
-
     if (ctx->d()->callData->argc >= 6) {
         qreal x0 = ctx->d()->callData->args[0].toNumber();
         qreal y0 = ctx->d()->callData->args[1].toNumber();
@@ -1615,7 +1609,7 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createRadialGradient(QV4::
         if (r0 < 0 || r1 < 0)
             V4THROW_DOM(DOMEXCEPTION_INDEX_SIZE_ERR, "createRadialGradient(): Incorrect arguments")
 
-        QQuickContext2DEngineData *ed = engineData(engine);
+        QQuickContext2DEngineData *ed = engineData(scope.engine);
 
         QV4::Scoped<QQuickContext2DStyle> gradient(scope, scope.engine->memoryManager->alloc<QQuickContext2DStyle>(scope.engine));
         QV4::ScopedObject p(scope, ed->gradientProto.value());
@@ -1646,9 +1640,6 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createConicalGradient(QV4:
     QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>());
     CHECK_CONTEXT(r)
 
-
-    QV8Engine *engine = scope.engine->v8Engine;
-
     if (ctx->d()->callData->argc >= 3) {
         qreal x = ctx->d()->callData->args[0].toNumber();
         qreal y = ctx->d()->callData->args[1].toNumber();
@@ -1661,7 +1652,7 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createConicalGradient(QV4:
             V4THROW_DOM(DOMEXCEPTION_INDEX_SIZE_ERR, "createConicalGradient(): Incorrect arguments");
         }
 
-        QQuickContext2DEngineData *ed = engineData(engine);
+        QQuickContext2DEngineData *ed = engineData(scope.engine);
 
         QV4::Scoped<QQuickContext2DStyle> gradient(scope, scope.engine->memoryManager->alloc<QQuickContext2DStyle>(scope.engine));
         QV4::ScopedObject p(scope, ed->gradientProto.value());
@@ -4203,9 +4194,8 @@ QImage QQuickContext2D::toImage(const QRectF& bounds)
 }
 
 
-QQuickContext2DEngineData::QQuickContext2DEngineData(QV8Engine *engine)
+QQuickContext2DEngineData::QQuickContext2DEngineData(QV4::ExecutionEngine *v4)
 {
-    QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
     QV4::Scope scope(v4);
 
     QV4::ScopedObject proto(scope, QQuickJSContext2DPrototype::create(v4));
@@ -4320,7 +4310,7 @@ void QQuickContext2D::setV8Engine(QV8Engine *engine)
         if (m_v8engine == 0)
             return;
 
-        QQuickContext2DEngineData *ed = engineData(engine);
+        QQuickContext2DEngineData *ed = engineData(QV8Engine::getV4(engine));
         QV4::ExecutionEngine *v4Engine = QV8Engine::getV4(engine);
         QV4::Scope scope(v4Engine);
         QV4::Scoped<QQuickJSContext2D> wrapper(scope, v4Engine->memoryManager->alloc<QQuickJSContext2D>(v4Engine));