From 41a426d78177b704cdf321fdf0b36b7cabc29a56 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 30 Mar 2016 14:01:40 +0200 Subject: V4: create a fast-path for QObjectWrapper::wrap The typical case is that there's already a QQmlData for a QObject, so fast-path this, and fall back to the general case if there is none (or it is deleted, etc.) Change-Id: I00c890e5fe7abdd743c4e99316a7ce93eb3db9df Reviewed-by: Lars Knoll --- src/qml/jsruntime/qv4qobjectwrapper.cpp | 7 ++----- src/qml/jsruntime/qv4qobjectwrapper_p.h | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 3be32c7920..462c4f3171 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -560,7 +560,7 @@ void QObjectWrapper::setProperty(ExecutionEngine *engine, QObject *object, QQmlP } } -ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object) +ReturnedValue QObjectWrapper::wrap_slowPath(ExecutionEngine *engine, QObject *object) { if (QQmlData::wasDeleted(object)) return QV4::Encode::null(); @@ -571,10 +571,7 @@ ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object) Scope scope(engine); - if (ddata->jsEngineId == engine->m_engineId && !ddata->jsWrapper.isUndefined()) { - // We own the JS object - return ddata->jsWrapper.value(); - } else if (ddata->jsWrapper.isUndefined() && + if (ddata->jsWrapper.isUndefined() && (ddata->jsEngineId == engine->m_engineId || // We own the QObject ddata->jsEngineId == 0 || // No one owns the QObject !ddata->hasTaintedV4Object)) { // Someone else has used the QObject, but it isn't tainted diff --git a/src/qml/jsruntime/qv4qobjectwrapper_p.h b/src/qml/jsruntime/qv4qobjectwrapper_p.h index d25279e783..d2650efd58 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper_p.h +++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h @@ -145,8 +145,27 @@ protected: static ReturnedValue method_connect(CallContext *ctx); static ReturnedValue method_disconnect(CallContext *ctx); + +private: + static ReturnedValue wrap_slowPath(ExecutionEngine *engine, QObject *object); }; +inline ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object) +{ + if (Q_LIKELY(!QQmlData::wasDeleted(object))) { + QObjectPrivate *priv = QObjectPrivate::get(const_cast(object)); + if (Q_LIKELY(priv->declarativeData)) { + auto ddata = static_cast(priv->declarativeData); + if (Q_LIKELY(ddata->jsEngineId == engine->m_engineId && !ddata->jsWrapper.isUndefined())) { + // We own the JS object + return ddata->jsWrapper.value(); + } + } + } + + return wrap_slowPath(engine, object); +} + struct QQmlValueTypeWrapper; struct Q_QML_EXPORT QObjectMethod : public QV4::FunctionObject -- cgit v1.2.3