diff options
author | Kent Hansen <khansen@trolltech.com> | 2009-07-13 09:18:22 (GMT) |
---|---|---|
committer | Kent Hansen <khansen@trolltech.com> | 2009-07-13 09:25:57 (GMT) |
commit | a267b590d17d1e7088acf44a8ba7e307f898ccb1 (patch) | |
tree | 11b7a48ef6251b6184f4a38303cf99a8b5fb2cdc /src/script/api | |
parent | 2859da9f22517099ce5d193398b7cc417a9c54d7 (diff) | |
download | Qt-a267b590d17d1e7088acf44a8ba7e307f898ccb1.zip Qt-a267b590d17d1e7088acf44a8ba7e307f898ccb1.tar.gz Qt-a267b590d17d1e7088acf44a8ba7e307f898ccb1.tar.bz2 |
add GC marking guards
Caller is responsible for calling marked() before mark(),
otherwise you might get infinite recursion.
Diffstat (limited to 'src/script/api')
-rw-r--r-- | src/script/api/qscriptengine.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index bf76cd4..4800286 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -563,17 +563,19 @@ void GlobalObject::mark() if (engine->uncaughtException) engine->uncaughtException.mark(); - if (engine->qobjectPrototype) + if (engine->qobjectPrototype && !engine->qobjectPrototype->marked()) engine->qobjectPrototype->mark(); - if (engine->qmetaobjectPrototype) + if (engine->qmetaobjectPrototype && !engine->qmetaobjectPrototype->marked()) engine->qmetaobjectPrototype->mark(); - if (engine->variantPrototype) + if (engine->variantPrototype && !engine->variantPrototype->marked()) engine->variantPrototype->mark(); { QHash<JSC::JSCell*,QBasicAtomicInt>::const_iterator it; for (it = engine->keepAliveValues.constBegin(); it != engine->keepAliveValues.constEnd(); ++it) { - it.key()->mark(); + JSC::JSCell *cell = it.key(); + if (!cell->marked()) + cell->mark(); } } @@ -590,7 +592,7 @@ void GlobalObject::mark() { QHash<int, QScriptTypeInfo*>::const_iterator it; for (it = engine->m_typeInfos.constBegin(); it != engine->m_typeInfos.constEnd(); ++it) { - if ((*it)->prototype) + if ((*it)->prototype && !(*it)->prototype.marked()) (*it)->prototype.mark(); } } @@ -1413,8 +1415,10 @@ QScriptValue QScriptEngine::newVariant(const QScriptValue &object, if (!object.isObject()) return newVariant(value); JSC::JSObject *jscObject = JSC::asObject(QScriptValuePrivate::get(object)->jscValue); - if (!jscObject->isObject(&QScriptObject::info)) + if (!jscObject->isObject(&QScriptObject::info)) { + qWarning("QScriptEngine::newVariant(): changing class of non-QScriptObject not supported"); return QScriptValue(); + } QScriptObject *jscScriptObject = static_cast<QScriptObject*>(jscObject); if (!object.isVariant()) { delete jscScriptObject->delegate(); @@ -1489,8 +1493,10 @@ QScriptValue QScriptEngine::newQObject(const QScriptValue &scriptObject, if (!scriptObject.isObject()) return newQObject(qtObject, ownership, options); JSC::JSObject *jscObject = JSC::asObject(QScriptValuePrivate::get(scriptObject)->jscValue); - if (!jscObject->isObject(&QScriptObject::info)) + if (!jscObject->isObject(&QScriptObject::info)) { + qWarning("QScriptEngine::newQObject(): changing class of non-QScriptObject not supported"); return QScriptValue(); + } QScriptObject *jscScriptObject = static_cast<QScriptObject*>(jscObject); if (!scriptObject.isQObject()) { delete jscScriptObject->delegate(); |