aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@live.com>2014-07-23 12:43:38 -0500
committerMichael Brasser <michael.brasser@live.com>2014-08-07 21:36:27 +0200
commitb42c8c4de293af0b6e9c0691daa835939b54d4e1 (patch)
tree0df0321298af530c95d085063500799d82f7aaa4 /src/qml/qml
parentee616b3905106a3eedef9ee964ab283ef45c7dbc (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.cpp5
-rw-r--r--src/qml/qml/qqmltypewrapper.cpp11
-rw-r--r--src/qml/qml/qqmltypewrapper_p.h1
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;