diff options
Diffstat (limited to 'src/qml/jsruntime/qv4qmlcontext.cpp')
| -rw-r--r-- | src/qml/jsruntime/qv4qmlcontext.cpp | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/src/qml/jsruntime/qv4qmlcontext.cpp b/src/qml/jsruntime/qv4qmlcontext.cpp index ecf56e90c5..0fd7cdc1ff 100644 --- a/src/qml/jsruntime/qv4qmlcontext.cpp +++ b/src/qml/jsruntime/qv4qmlcontext.cpp @@ -632,8 +632,17 @@ static ReturnedValue revertObjectMethodLookup(Lookup *l, ExecutionEngine *engine return QQmlContextWrapper::resolveQmlContextPropertyLookupGetter(l, engine, base); } +// The object may be gone once it is being destroyed. Its name is not defined then, just like +// when resolving the name anew. +static ReturnedValue throwLostObjectReferenceError(Lookup *l, ExecutionEngine *engine) +{ + return engine->throwReferenceError( + engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[l->nameIndex] + ->toQString()); +} + template<typename Call> -ReturnedValue callWithScopeObject(ExecutionEngine *engine, Value *base, Call c) +ReturnedValue callWithScopeObject(Lookup *l, ExecutionEngine *engine, Value *base, Call c) { Scope scope(engine); Scoped<QmlContext> qmlContext(scope, engine->qmlContext()); @@ -641,11 +650,8 @@ ReturnedValue callWithScopeObject(ExecutionEngine *engine, Value *base, Call c) return QV4::Encode::undefined(); QObject *scopeObject = qmlContext->qmlScope(); - if (!scopeObject) - return QV4::Encode::undefined(); - - if (QQmlData::wasDeleted(scopeObject)) - return QV4::Encode::undefined(); + if (!scopeObject || QQmlData::wasDeleted(scopeObject)) + return throwLostObjectReferenceError(l, engine); ScopedValue obj(scope, QV4::QObjectWrapper::wrap(engine, scopeObject)); @@ -657,7 +663,7 @@ ReturnedValue callWithScopeObject(ExecutionEngine *engine, Value *base, Call c) ReturnedValue QQmlContextWrapper::lookupScopeObjectProperty(Lookup *l, ExecutionEngine *engine, Value *base) { - return callWithScopeObject(engine, base, [l, engine, base](const Value &obj) { + return callWithScopeObject(l, engine, base, [l, engine, base](const Value &obj) { const QObjectWrapper::Flags flags = l->forCall ? QObjectWrapper::NoFlag : QObjectWrapper::AttachMethods; @@ -669,7 +675,7 @@ ReturnedValue QQmlContextWrapper::lookupScopeObjectProperty(Lookup *l, Execution ReturnedValue QQmlContextWrapper::lookupScopeObjectMethod(Lookup *l, ExecutionEngine *engine, Value *base) { - return callWithScopeObject(engine, base, [l, engine, base](const Value &obj) { + return callWithScopeObject(l, engine, base, [l, engine, base](const Value &obj) { const QObjectWrapper::Flags flags = l->forCall ? QObjectWrapper::NoFlag : QObjectWrapper::AttachMethods; @@ -680,7 +686,7 @@ ReturnedValue QQmlContextWrapper::lookupScopeObjectMethod(Lookup *l, ExecutionEn } template<typename Call> -ReturnedValue callWithContextObject(ExecutionEngine *engine, Value *base, Call c) +ReturnedValue callWithContextObject(Lookup *l, ExecutionEngine *engine, Value *base, Call c) { Scope scope(engine); Scoped<QmlContext> qmlContext(scope, engine->qmlContext()); @@ -692,11 +698,8 @@ ReturnedValue callWithContextObject(ExecutionEngine *engine, Value *base, Call c return QV4::Encode::undefined(); QObject *contextObject = context->contextObject(); - if (!contextObject) - return QV4::Encode::undefined(); - - if (QQmlData::wasDeleted(contextObject)) - return QV4::Encode::undefined(); + if (!contextObject || QQmlData::wasDeleted(contextObject)) + return throwLostObjectReferenceError(l, engine); ScopedValue obj(scope, QV4::QObjectWrapper::wrap(engine, contextObject)); @@ -709,7 +712,7 @@ ReturnedValue callWithContextObject(ExecutionEngine *engine, Value *base, Call c ReturnedValue QQmlContextWrapper::lookupContextObjectProperty( Lookup *l, ExecutionEngine *engine, Value *base) { - return callWithContextObject(engine, base, [l, engine, base](const Value &obj) { + return callWithContextObject(l, engine, base, [l, engine, base](const Value &obj) { const QObjectWrapper::Flags flags = l->forCall ? QObjectWrapper::NoFlag : QObjectWrapper::AttachMethods; @@ -722,7 +725,7 @@ ReturnedValue QQmlContextWrapper::lookupContextObjectProperty( ReturnedValue QQmlContextWrapper::lookupContextObjectMethod( Lookup *l, ExecutionEngine *engine, Value *base) { - return callWithContextObject(engine, base, [l, engine, base](const Value &obj) { + return callWithContextObject(l, engine, base, [l, engine, base](const Value &obj) { const QObjectWrapper::Flags flags = l->forCall ? QObjectWrapper::NoFlag : QObjectWrapper::AttachMethods; |
