aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp2
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp17
2 files changed, 18 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp
index 42e561bc7c..84755a6402 100644
--- a/src/qml/jsruntime/qv4lookup.cpp
+++ b/src/qml/jsruntime/qv4lookup.cpp
@@ -306,7 +306,7 @@ ReturnedValue Lookup::getterTwoClasses(Lookup *l, ExecutionEngine *engine, const
ReturnedValue v = o->getLookup(l);
Lookup l2 = *l;
- if (l2.getter == Lookup::getter0 || l2.getter == Lookup::getter1) {
+ if (l->index != UINT_MAX && (l2.getter == Lookup::getter0 || l2.getter == Lookup::getter1)) {
// if we have a getter0, make sure it comes first
if (l2.getter == Lookup::getter0)
qSwap(l1, l2);
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index 479584af54..d95d4ed59e 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -125,6 +125,7 @@ private slots:
void jsIncDecNonObjectProperty();
void JSONparse();
void arraySort();
+ void lookupOnDisappearingProperty();
void qRegExpInport_data();
void qRegExpInport();
@@ -2964,6 +2965,22 @@ void tst_QJSEngine::arraySort()
"crashMe();");
}
+void tst_QJSEngine::lookupOnDisappearingProperty()
+{
+ QJSEngine eng;
+ QJSValue func = eng.evaluate("(function(){\"use strict\"; return eval(\"function(obj) { return obj.someProperty; }\")})()");
+ QVERIFY(func.isCallable());
+
+ QJSValue o = eng.newObject();
+ o.setProperty(QStringLiteral("someProperty"), 42);
+
+ QCOMPARE(func.call(QJSValueList()<< o).toInt(), 42);
+
+ o = eng.newObject();
+ QVERIFY(func.call(QJSValueList()<< o).isUndefined());
+ QVERIFY(func.call(QJSValueList()<< o).isUndefined());
+}
+
static QRegExp minimal(QRegExp r) { r.setMinimal(true); return r; }
void tst_QJSEngine::qRegExpInport_data()