diff options
author | Michael Brasser <michael.brasser@live.com> | 2014-07-23 12:43:38 -0500 |
---|---|---|
committer | Michael Brasser <michael.brasser@live.com> | 2014-08-07 21:36:27 +0200 |
commit | b42c8c4de293af0b6e9c0691daa835939b54d4e1 (patch) | |
tree | 0df0321298af530c95d085063500799d82f7aaa4 /src/qml/qml | |
parent | ee616b3905106a3eedef9ee964ab283ef45c7dbc (diff) |
Accelerate property lookups for C++-based QObject singletons.
Change-Id: Icbdf06a077014db5dd57cba42f84591433ec4196
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper.cpp | 11 | ||||
-rw-r--r-- | src/qml/qml/qqmltypewrapper_p.h | 1 |
3 files changed, 16 insertions, 1 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 42f67f3345..900ac5a2e4 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -233,7 +233,10 @@ void QQmlType::SingletonInstanceInfo::init(QQmlEngine *e) v4->popContext(); } else if (qobjectCallback && !qobjectApi(e)) { v4->pushGlobalContext(); - setQObjectApi(e, qobjectCallback(e, e)); + QObject *o = qobjectCallback(e, e); + setQObjectApi(e, o); + // if this object can use a property cache, create it now + QQmlData::ensurePropertyCache(e, o); v4->popContext(); } else if (!url.isEmpty() && !qobjectApi(e)) { v4->pushGlobalContext(); diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp index 53afd36437..0ae3e31ec0 100644 --- a/src/qml/qml/qqmltypewrapper.cpp +++ b/src/qml/qml/qqmltypewrapper.cpp @@ -75,6 +75,17 @@ bool QmlTypeWrapper::isSingleton() const return d()->type && d()->type->isSingleton(); } +QObject* QmlTypeWrapper::singletonObject() const +{ + if (!isSingleton()) + return 0; + + QQmlEngine *e = d()->v8->engine(); + QQmlType::SingletonInstanceInfo *siinfo = d()->type->singletonInstanceInfo(); + siinfo->init(e); + return siinfo->qobjectApi(e); +} + QVariant QmlTypeWrapper::toVariant() const { if (d()->type && d()->type->isSingleton()) { diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h index 27ecac991e..becd73eaf0 100644 --- a/src/qml/qml/qqmltypewrapper_p.h +++ b/src/qml/qml/qqmltypewrapper_p.h @@ -87,6 +87,7 @@ private: public: bool isSingleton() const; + QObject *singletonObject() const; QVariant toVariant() const; |