diff options
-rw-r--r-- | src/qml/jsruntime/qv4internalclass.cpp | 15 | ||||
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 18 |
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" |