diff options
author | Kent Hansen <khansen@trolltech.com> | 2009-07-27 14:32:16 (GMT) |
---|---|---|
committer | Kent Hansen <khansen@trolltech.com> | 2009-07-27 17:58:12 (GMT) |
commit | b9026b5f2182db6f0e607035cb4ac3798bf09054 (patch) | |
tree | 4b3c06b391e10d063f3301705e7b8f314c9d3826 /src/script/api/qscriptengine.cpp | |
parent | 4832462e2f0a3f68485ae85efff368e3346d5c1f (diff) | |
download | Qt-b9026b5f2182db6f0e607035cb4ac3798bf09054.zip Qt-b9026b5f2182db6f0e607035cb4ac3798bf09054.tar.gz Qt-b9026b5f2182db6f0e607035cb4ac3798bf09054.tar.bz2 |
don't rely on custom global object to get GC callback
Install custom ClientData on JSGlobalData instance instead.
Also some cleanups to avoid globalObject et al being accessed
directly.
Killed the proxying scheme employed in setGlobalObject() since it
didn't work; if you stored the original Global Object and replaced
it with another object, then added properties to the new object,
they would show up in the old object, too (because the old object
would always proxy to whatever the current Global Object was).
Diffstat (limited to 'src/script/api/qscriptengine.cpp')
-rw-r--r-- | src/script/api/qscriptengine.cpp | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index 5cbb8d7..2f7e976 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -313,6 +313,7 @@ struct GlobalClientData : public JSC::JSGlobalData::ClientData GlobalClientData(QScriptEnginePrivate *e) : engine(e) {} virtual ~GlobalClientData() {} + virtual void mark() { engine->mark(); } QScriptEnginePrivate *engine; }; @@ -596,50 +597,35 @@ GlobalObject::~GlobalObject() void GlobalObject::mark() { JSC::JSGlobalObject::mark(); - engine->mark(); } bool GlobalObject::getOwnPropertySlot(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertySlot& slot) { - if (engine->customGlobalObject) - return engine->customGlobalObject->getOwnPropertySlot(exec, propertyName, slot); return JSC::JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot); } void GlobalObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::JSValue value, JSC::PutPropertySlot& slot) { - if (engine->customGlobalObject) { - engine->customGlobalObject->put(exec, propertyName, value, slot); - return; - } JSC::JSGlobalObject::put(exec, propertyName, value, slot); } bool GlobalObject::deleteProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName) { - if (engine->customGlobalObject) - return engine->customGlobalObject->deleteProperty(exec, propertyName); return JSC::JSGlobalObject::deleteProperty(exec, propertyName); } bool GlobalObject::getPropertyAttributes(JSC::ExecState* exec, const JSC::Identifier& propertyName, unsigned& attributes) const { - if (engine->customGlobalObject) - return engine->customGlobalObject->getPropertyAttributes(exec, propertyName, attributes); return JSC::JSGlobalObject::getPropertyAttributes(exec, propertyName, attributes); } void GlobalObject::getPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames) { - if (engine->customGlobalObject) { - engine->customGlobalObject->getPropertyNames(exec, propertyNames); - return; - } JSC::JSGlobalObject::getPropertyNames(exec, propertyNames); } @@ -810,7 +796,7 @@ QScriptEnginePrivate::QScriptEnginePrivate() : idGenerator(1) globalData = JSC::JSGlobalData::create().releaseRef(); globalData->clientData = new QScript::GlobalClientData(this); - globalObject = new (globalData)QScript::GlobalObject(this); + JSC::JSGlobalObject *globalObject = new (globalData)QScript::GlobalObject(this); JSC::ExecState* exec = globalObject->globalExec(); @@ -1043,6 +1029,16 @@ void QScriptEnginePrivate::releaseContextForFrame(JSC::ExecState *frame) delete ctx; } +JSC::JSGlobalObject *QScriptEnginePrivate::globalObject() const +{ + return globalData->head; +} + +JSC::ExecState *QScriptEnginePrivate::globalExec() const +{ + return globalObject()->globalExec(); +} + void QScriptEnginePrivate::mark() { if (customGlobalObject && !customGlobalObject->marked()) @@ -1085,14 +1081,14 @@ void QScriptEnginePrivate::mark() bool QScriptEnginePrivate::isCollecting() const { - return globalObject->globalData()->heap.isBusy(); + return globalData->heap.isBusy(); } void QScriptEnginePrivate::collectGarbage() { // ### why isn't the global object always marked by the Collector? - if (!globalObject->marked()) - globalObject->mark(); + if (!globalObject()->marked()) + globalObject()->mark(); JSC::JSLock lock(false); globalData->heap.collect(); } @@ -1370,7 +1366,7 @@ QScriptEngine::~QScriptEngine() QScriptValue QScriptEngine::globalObject() const { Q_D(const QScriptEngine); - JSC::JSObject *result = d->customGlobalObject ? d->customGlobalObject : d->globalObject; + JSC::JSObject *result = d->globalObject(); return const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(result); } @@ -1392,10 +1388,8 @@ void QScriptEngine::setGlobalObject(const QScriptValue &object) if (!object.isObject() || globalObject().strictlyEquals(object)) return; JSC::JSObject *jscObject = JSC::asObject(d->scriptValueToJSCValue(object)); - if (jscObject == d->globalObject) - d->customGlobalObject = 0; - else - d->customGlobalObject = jscObject; + qWarning("QScriptEngine::setGlobalObject() is not implemented"); +// d->customGlobalObject = jscObject; } /*! @@ -2416,7 +2410,7 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr) } } if (result.isObject() && info && info->prototype - && JSC::JSValue::strictEqual(scriptValueToJSCValue(result.prototype()), globalObject->objectPrototype())) { + && JSC::JSValue::strictEqual(scriptValueToJSCValue(result.prototype()), globalObject()->objectPrototype())) { result.setPrototype(scriptValueFromJSCValue(info->prototype)); } return result; @@ -2675,17 +2669,18 @@ void QScriptEngine::registerCustomType(int type, MarshalFunction mf, void QScriptEngine::installTranslatorFunctions(const QScriptValue &object) { Q_D(QScriptEngine); - JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::ExecState* exec = d->currentFrame; JSC::JSValue jscObject = d->scriptValueToJSCValue(object); + JSC::JSGlobalObject *glob = d->globalObject(); if (!jscObject || !jscObject.isObject()) - jscObject = d->globalObject; + jscObject = glob; // unsigned attribs = JSC::DontEnum; - JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 5, JSC::Identifier(exec, "qsTranslate"), QScript::functionQsTranslate)); - JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 2, JSC::Identifier(exec, "QT_TRANSLATE_NOOP"), QScript::functionQsTranslateNoOp)); - JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 3, JSC::Identifier(exec, "qsTr"), QScript::functionQsTr)); - JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "QT_TR_NOOP"), QScript::functionQsTrNoOp)); + JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 5, JSC::Identifier(exec, "qsTranslate"), QScript::functionQsTranslate)); + JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 2, JSC::Identifier(exec, "QT_TRANSLATE_NOOP"), QScript::functionQsTranslateNoOp)); + JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 3, JSC::Identifier(exec, "qsTr"), QScript::functionQsTr)); + JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "QT_TR_NOOP"), QScript::functionQsTrNoOp)); - d->globalObject->stringPrototype()->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "arg"), QScript::stringProtoFuncArg)); + glob->stringPrototype()->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "arg"), QScript::stringProtoFuncArg)); } /*! @@ -3286,7 +3281,7 @@ int QScriptEngine::processEventsInterval() const bool QScriptEngine::isEvaluating() const { Q_D(const QScriptEngine); - return (d->currentFrame != d->globalObject->globalExec()); + return (d->currentFrame != d->globalExec()); } /*! |