aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4qobjectwrapper.cpp
diff options
context:
space:
mode:
authorMichael Brasser <mbrasser@ford.com>2019-01-04 13:09:21 -0600
committerMichael Brasser <michael.brasser@live.com>2019-03-20 20:25:34 +0000
commitbcbce96fffd25a4f2810f03cec060ab13e34ac9e (patch)
treed8c961acf3836d059fbeda4e719c687d66970d59 /src/qml/jsruntime/qv4qobjectwrapper.cpp
parentf9dac6f900fde93014305854b1bf3a81d9e58b92 (diff)
Accelerate access to scope object properties in lookups
Task-number: QTBUG-69898 Change-Id: I94bf1aa85c9b2302894f3224e41de81a456211f9 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4qobjectwrapper.cpp')
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp24
1 files changed, 5 insertions, 19 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 351076ac28..377c30617a 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -357,7 +357,7 @@ ReturnedValue QObjectWrapper::getQmlProperty(QQmlContextData *qmlContext, String
return getProperty(v4, d()->object(), result);
}
-ReturnedValue QObjectWrapper::getQmlProperty(QV4::ExecutionEngine *engine, QQmlContextData *qmlContext, QObject *object, String *name, QObjectWrapper::RevisionMode revisionMode, bool *hasProperty)
+ReturnedValue QObjectWrapper::getQmlProperty(QV4::ExecutionEngine *engine, QQmlContextData *qmlContext, QObject *object, String *name, QObjectWrapper::RevisionMode revisionMode, bool *hasProperty, QQmlPropertyData **property)
{
if (QQmlData::wasDeleted(object)) {
if (hasProperty)
@@ -384,6 +384,9 @@ ReturnedValue QObjectWrapper::getQmlProperty(QV4::ExecutionEngine *engine, QQmlC
if (hasProperty)
*hasProperty = true;
+ if (property)
+ *property = result;
+
return getProperty(engine, object, result);
} else {
// Check if this object is already wrapped.
@@ -884,24 +887,7 @@ ReturnedValue QObjectWrapper::lookupGetter(Lookup *lookup, ExecutionEngine *engi
return Lookup::getterGeneric(lookup, engine, object);
};
- // we can safely cast to a QV4::Object here. If object is something else,
- // the internal class won't match
- Heap::Object *o = static_cast<Heap::Object *>(object.heapObject());
- if (!o || o->internalClass != lookup->qobjectLookup.ic)
- return revertLookup();
-
- const Heap::QObjectWrapper *This = lookup->qobjectLookup.staticQObject ? lookup->qobjectLookup.staticQObject :
- static_cast<const Heap::QObjectWrapper *>(o);
- QObject *qobj = This->object();
- if (QQmlData::wasDeleted(qobj))
- return QV4::Encode::undefined();
-
- QQmlData *ddata = QQmlData::get(qobj, /*create*/false);
- if (!ddata || ddata->propertyCache != lookup->qobjectLookup.propertyCache)
- return revertLookup();
-
- QQmlPropertyData *property = lookup->qobjectLookup.propertyData;
- return getProperty(engine, qobj, property);
+ return lookupGetterImpl(lookup, engine, object, /*useOriginalProperty*/ false, revertLookup);
}
bool QObjectWrapper::virtualResolveLookupSetter(Object *object, ExecutionEngine *engine, Lookup *lookup,