From 6178d3437dad86ec9e7da2170944c40b2b352db0 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 5 Jun 2013 10:04:16 +0200 Subject: Get rid of the QV8Engine pointer in QV8QObjectConnectionList Change-Id: I06ee7afb9abd81a354d84d312be9ea90b91d9baf Reviewed-by: Lars Knoll --- src/qml/qml/v8/qv8qobjectwrapper.cpp | 52 +++++++++++++++++------------------- 1 file changed, 25 insertions(+), 27 deletions(-) (limited to 'src/qml/qml/v8/qv8qobjectwrapper.cpp') diff --git a/src/qml/qml/v8/qv8qobjectwrapper.cpp b/src/qml/qml/v8/qv8qobjectwrapper.cpp index fb0db7cccb..b65d09effc 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper.cpp +++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp @@ -838,7 +838,7 @@ QPair QV8QObjectWrapper::ExtractQtMethod(QV8Engine *engine, QV4: class QV8QObjectConnectionList : public QObject, public QQmlGuard { public: - QV8QObjectConnectionList(QObject *object, QV8Engine *engine); + QV8QObjectConnectionList(QObject *object, QHash *allConnections); ~QV8QObjectConnectionList(); struct Connection { @@ -856,9 +856,6 @@ public: QV4::PersistentValue thisObject; QV4::PersistentValue function; - void dispose() { - } - bool needsDestroy; }; @@ -868,7 +865,7 @@ public: bool connectionsNeedClean; }; - QV8Engine *engine; + QHash *allConnections; typedef QHash SlotHash; SlotHash slotHash; @@ -879,9 +876,10 @@ public: virtual int qt_metacall(QMetaObject::Call, int, void **); }; -QV8QObjectConnectionList::QV8QObjectConnectionList(QObject *object, QV8Engine *engine) -: QQmlGuard(object), engine(engine), needsDestroy(false), inUse(0) +QV8QObjectConnectionList::QV8QObjectConnectionList(QObject *object, QHash *allConnections) +: QQmlGuard(object), needsDestroy(false), inUse(0) { + this->allConnections = allConnections; } QV8QObjectConnectionList::~QV8QObjectConnectionList() @@ -894,7 +892,7 @@ QV8QObjectConnectionList::~QV8QObjectConnectionList() void QV8QObjectConnectionList::objectDestroyed(QObject *object) { - engine->qobjectWrapper()->m_connections.remove(object); + allConnections->remove(object); if (inUse) needsDestroy = true; @@ -922,16 +920,7 @@ int QV8QObjectConnectionList::qt_metacall(QMetaObject::Call method, int index, v int *argsTypes = QQmlPropertyCache::methodParameterTypes(data(), index, dummy, 0); int argCount = argsTypes?argsTypes[0]:0; - QVarLengthArray args(argCount); - - for (int ii = 0; ii < argCount; ++ii) { - int type = argsTypes[ii + 1]; - if (type == qMetaTypeId()) { - args[ii] = engine->fromVariant(*((QVariant *)metaArgs[ii + 1])); - } else { - args[ii] = engine->fromVariant(QVariant(type, metaArgs[ii + 1])); - } - } + QVarLengthArray args; for (int ii = 0; ii < connections.count(); ++ii) { Connection &connection = connections[ii]; @@ -941,15 +930,28 @@ int QV8QObjectConnectionList::qt_metacall(QMetaObject::Call method, int index, v QV4::FunctionObject *f = connection.function.value().asFunctionObject(); QV4::ExecutionEngine *v4 = f->internalClass->engine; QV4::ExecutionContext *ctx = v4->current; + + if (args.count() != argCount) { + args.resize(argCount); + for (int ii = 0; ii < argCount; ++ii) { + int type = argsTypes[ii + 1]; + if (type == qMetaTypeId()) { + args[ii] = v4->v8Engine->fromVariant(*((QVariant *)metaArgs[ii + 1])); + } else { + args[ii] = v4->v8Engine->fromVariant(QVariant(type, metaArgs[ii + 1])); + } + } + } + try { - f->call(v4->current, connection.thisObject.isEmpty() ? engine->global() : connection.thisObject.value(), args.data(), argCount); + f->call(v4->current, connection.thisObject.isEmpty() ? Value::fromObject(v4->globalObject) : connection.thisObject.value(), args.data(), argCount); } catch (QV4::Exception &e) { e.accept(ctx); QQmlError error; QQmlExpressionPrivate::exceptionToError(e, error); if (error.description().isEmpty()) error.setDescription(QString(QLatin1String("Unknown exception occurred during evaluation of connected function: %1")).arg(f->name->toQString())); - QQmlEnginePrivate::get(engine->engine())->warning(error); + QQmlEnginePrivate::get(v4->v8Engine->engine())->warning(error); } } @@ -957,12 +959,10 @@ int QV8QObjectConnectionList::qt_metacall(QMetaObject::Call method, int index, v if (connectionList.connectionsInUse == 0 && connectionList.connectionsNeedClean) { for (QList::Iterator iter = connectionList.begin(); iter != connectionList.end(); ) { - if (iter->needsDestroy) { - iter->dispose(); + if (iter->needsDestroy) iter = connectionList.erase(iter); - } else { + else ++iter; - } } } @@ -1014,7 +1014,7 @@ QV4::Value QV8QObjectWrapper::Connect(SimpleCallContext *ctx) QHash &connections = qobjectWrapper->m_connections; QHash::Iterator iter = connections.find(signalObject); if (iter == connections.end()) - iter = connections.insert(signalObject, new QV8QObjectConnectionList(signalObject, engine)); + iter = connections.insert(signalObject, new QV8QObjectConnectionList(signalObject, &connections)); QV8QObjectConnectionList *connectionList = *iter; QV8QObjectConnectionList::SlotHash::Iterator slotIter = connectionList->slotHash.find(signalIndex); @@ -1099,7 +1099,6 @@ QV4::Value QV8QObjectWrapper::Disconnect(SimpleCallContext *ctx) connection.needsDestroy = true; connections.connectionsNeedClean = true; } else { - connection.dispose(); connections.removeAt(ii); } return QV4::Value::undefinedValue(); @@ -1119,7 +1118,6 @@ QV4::Value QV8QObjectWrapper::Disconnect(SimpleCallContext *ctx) connection.needsDestroy = true; connections.connectionsNeedClean = true; } else { - connection.dispose(); connections.removeAt(ii); } return QV4::Value::undefinedValue(); -- cgit v1.2.3