summaryrefslogtreecommitdiffstats
path: root/src/script/api
diff options
context:
space:
mode:
authorKent Hansen <khansen@trolltech.com>2009-07-13 09:18:22 (GMT)
committerKent Hansen <khansen@trolltech.com>2009-07-13 09:25:57 (GMT)
commita267b590d17d1e7088acf44a8ba7e307f898ccb1 (patch)
tree11b7a48ef6251b6184f4a38303cf99a8b5fb2cdc /src/script/api
parent2859da9f22517099ce5d193398b7cc417a9c54d7 (diff)
downloadQt-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.cpp20
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();