diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-06-05 10:04:16 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2013-06-05 10:57:24 +0200 |
commit | 6178d3437dad86ec9e7da2170944c40b2b352db0 (patch) | |
tree | beb45cb72f325f31e211ba23918506634c43a93a /src/qml/qml/v8/qv8qobjectwrapper.cpp | |
parent | fd01eb1797221fbcc983ed5d4ff644cecdba5e42 (diff) |
Get rid of the QV8Engine pointer in QV8QObjectConnectionList
Change-Id: I06ee7afb9abd81a354d84d312be9ea90b91d9baf
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/qml/v8/qv8qobjectwrapper.cpp')
-rw-r--r-- | src/qml/qml/v8/qv8qobjectwrapper.cpp | 52 |
1 files changed, 25 insertions, 27 deletions
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<QObject *, int> QV8QObjectWrapper::ExtractQtMethod(QV8Engine *engine, QV4: class QV8QObjectConnectionList : public QObject, public QQmlGuard<QObject> { public: - QV8QObjectConnectionList(QObject *object, QV8Engine *engine); + QV8QObjectConnectionList(QObject *object, QHash<QObject *, QV8QObjectConnectionList *> *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<QObject *, QV8QObjectConnectionList *> *allConnections; typedef QHash<int, ConnectionList> SlotHash; SlotHash slotHash; @@ -879,9 +876,10 @@ public: virtual int qt_metacall(QMetaObject::Call, int, void **); }; -QV8QObjectConnectionList::QV8QObjectConnectionList(QObject *object, QV8Engine *engine) -: QQmlGuard<QObject>(object), engine(engine), needsDestroy(false), inUse(0) +QV8QObjectConnectionList::QV8QObjectConnectionList(QObject *object, QHash<QObject *, QV8QObjectConnectionList *> *allConnections) +: QQmlGuard<QObject>(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<QV4::Value, 9> args(argCount); - - for (int ii = 0; ii < argCount; ++ii) { - int type = argsTypes[ii + 1]; - if (type == qMetaTypeId<QVariant>()) { - args[ii] = engine->fromVariant(*((QVariant *)metaArgs[ii + 1])); - } else { - args[ii] = engine->fromVariant(QVariant(type, metaArgs[ii + 1])); - } - } + QVarLengthArray<QV4::Value, 9> 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<QVariant>()) { + 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<Connection>::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<QObject *, QV8QObjectConnectionList *> &connections = qobjectWrapper->m_connections; QHash<QObject *, QV8QObjectConnectionList *>::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(); |