diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2016-03-30 14:01:40 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2016-05-20 11:15:00 +0000 |
commit | 41a426d78177b704cdf321fdf0b36b7cabc29a56 (patch) | |
tree | 247ecbbb18abb16472e41f8bc3faaa68982f813e /src/qml/jsruntime/qv4qobjectwrapper_p.h | |
parent | 106054d3f5e002d46e18a8c01bc660af8959a71c (diff) |
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 <lars.knoll@theqtcompany.com>
Diffstat (limited to 'src/qml/jsruntime/qv4qobjectwrapper_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper_p.h | 19 |
1 files changed, 19 insertions, 0 deletions
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<QObject *>(object)); + if (Q_LIKELY(priv->declarativeData)) { + auto ddata = static_cast<QQmlData *>(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 |