diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-16 22:02:27 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-22 01:06:20 +0200 |
commit | e441692b0b8f8fffdfdfa8a21c570adcd5cbae7a (patch) | |
tree | 9b764401d87682012328c46dc947721f47b428b2 /src/qml/types/qquickworkerscript.cpp | |
parent | a0f8be4021caa9bb5055923f0eea3bee0e345235 (diff) |
Further work towards an exact GC
Add some more convenience in the helper classes
in qscopedvalue_p.h
Make accesses to CallData safer, and change
ExecutionEngine::newObject() to return a safe
pointer.
Change-Id: I980909754ce9681cf6faa1355bab3a1e5d6dd186
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/types/qquickworkerscript.cpp')
-rw-r--r-- | src/qml/types/qquickworkerscript.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/qml/types/qquickworkerscript.cpp b/src/qml/types/qquickworkerscript.cpp index 4e39682d84..d80df760fa 100644 --- a/src/qml/types/qquickworkerscript.cpp +++ b/src/qml/types/qquickworkerscript.cpp @@ -177,7 +177,7 @@ public: }; QHash<int, WorkerScript *> workers; - QV4::Value getWorker(WorkerScript *); + QV4::ReturnedValue getWorker(WorkerScript *); int m_nextId; @@ -282,9 +282,9 @@ QV4::ReturnedValue QQuickWorkerScriptEnginePrivate::method_sendMessage(QV4::Simp { WorkerEngine *engine = (WorkerEngine*)ctx->engine->v8Engine; - int id = ctx->argument(1).toInt32(); + int id = ctx->argumentCount > 1 ? ctx->arguments[1].toInt32() : 0; - QByteArray data = QV4::Serialize::serialize(ctx->argument(2), engine); + QByteArray data = QV4::Serialize::serialize(ctx->argumentCount > 2 ? ctx->arguments[2] : QV4::Value::undefinedValue(), engine); QMutexLocker locker(&engine->p->m_lock); WorkerScript *script = engine->p->workers.value(id); @@ -298,27 +298,29 @@ QV4::ReturnedValue QQuickWorkerScriptEnginePrivate::method_sendMessage(QV4::Simp } // Requires handle scope and context scope -QV4::Value QQuickWorkerScriptEnginePrivate::getWorker(WorkerScript *script) +QV4::ReturnedValue QQuickWorkerScriptEnginePrivate::getWorker(WorkerScript *script) { if (!script->initialized) { script->initialized = true; QV4::ExecutionEngine *v4 = QV8Engine::getV4(workerEngine); + QV4::Scope scope(v4); script->object = QV4::QmlContextWrapper::urlScope(workerEngine, script->source); - QV4::QmlContextWrapper *w = script->object.value().asObject()->as<QV4::QmlContextWrapper>(); + QV4::Scoped<QV4::QmlContextWrapper> w(scope, script->object.value()); + Q_ASSERT(!!w); w->setReadOnly(false); - QV4::Object *api = v4->newObject(); + QV4::Scoped<QV4::Object> api(scope, v4->newObject()); api->put(v4->newString("sendMessage"), workerEngine->sendFunction(script->id)); - script->object.value().asObject()->put(v4->newString("WorkerScript"), QV4::Value::fromObject(api)); + script->object.value().asObject()->put(v4->newString("WorkerScript"), api.asValue()); w->setReadOnly(true); } - return script->object.value(); + return script->object.value().asReturnedValue(); } bool QQuickWorkerScriptEnginePrivate::event(QEvent *event) @@ -386,12 +388,15 @@ void QQuickWorkerScriptEnginePrivate::processLoad(int id, const QUrl &url) if (!script) return; script->source = url; - QV4::Value activation = getWorker(script); - if (activation.isEmpty()) - return; QV4::ExecutionEngine *v4 = QV8Engine::getV4(workerEngine); - QV4::Script program(v4, activation.asObject(), sourceCode, url.toString()); + QV4::Scope scope(v4); + + QV4::Scoped<QV4::Object> activation(scope, getWorker(script)); + if (!activation) + return; + + QV4::Script program(v4, activation.getPointer(), sourceCode, url.toString()); QV4::ExecutionContext *ctx = v4->current; try { |