aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp15
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp18
2 files changed, 24 insertions, 9 deletions
diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp
index 61608b4cba..aacc5bf517 100644
--- a/src/qml/jsruntime/qv4internalclass.cpp
+++ b/src/qml/jsruntime/qv4internalclass.cpp
@@ -458,17 +458,14 @@ void InternalClass::destroy()
void InternalClass::markObjects()
{
// all prototype changes are done on the empty class
- Q_ASSERT(!prototype);
+ Q_ASSERT(!prototype || this != engine->emptyClass);
+
+ if (prototype)
+ prototype->mark(engine);
for (QHash<Transition, InternalClass *>::ConstIterator it = transitions.begin(), end = transitions.end();
- it != end; ++it) {
- if (it.key().flags == Transition::VTableChange) {
- it.value()->markObjects();
- } else if (it.key().flags == Transition::ProtoChange) {
- Q_ASSERT(it.value()->prototype);
- it.value()->prototype->mark(engine);
- }
- }
+ it != end; ++it)
+ it.value()->markObjects();
}
QT_END_NAMESPACE
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index 518d3e9897..7ef6bd9d2b 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -151,6 +151,8 @@ private slots:
void regexpLastMatch();
void indexedAccesses();
+ void prototypeChainGc();
+
signals:
void testSignal();
};
@@ -2942,6 +2944,22 @@ void tst_QJSEngine::indexedAccesses()
QVERIFY(v.isUndefined());
}
+void tst_QJSEngine::prototypeChainGc()
+{
+ QJSEngine engine;
+
+ QJSValue getProto = engine.evaluate("Object.getPrototypeOf");
+
+ QJSValue factory = engine.evaluate("function() { return Object.create(Object.create({})); }");
+ QVERIFY(factory.isCallable());
+ QJSValue obj = factory.call();
+ engine.collectGarbage();
+
+ QJSValue proto = getProto.call(QJSValueList() << obj);
+ proto = getProto.call(QJSValueList() << proto);
+ QVERIFY(proto.isObject());
+}
+
QTEST_MAIN(tst_QJSEngine)
#include "tst_qjsengine.moc"