From 80474586da6f3e257038c80093bc56f9fd21d8a4 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Mon, 5 Dec 2011 15:19:09 +0000 Subject: [PATCH] Don't eval signal handler closure until signal is emitted Change-Id: Ic3bd6ed53330b19567fa0bf34b8e4618e3f68ba5 Reviewed-by: Roberto Raggi --- src/declarative/qml/qdeclarativeexpression.cpp | 29 ++++++++++++++--------- src/declarative/qml/qdeclarativeexpression_p.h | 1 + 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/declarative/qml/qdeclarativeexpression.cpp b/src/declarative/qml/qdeclarativeexpression.cpp index bf2552d..a5b7e7c 100644 --- a/src/declarative/qml/qdeclarativeexpression.cpp +++ b/src/declarative/qml/qdeclarativeexpression.cpp @@ -81,7 +81,8 @@ QDeclarativeJavaScriptExpression::~QDeclarativeJavaScriptExpression() } QDeclarativeExpressionPrivate::QDeclarativeExpressionPrivate() -: expressionFunctionValid(true), extractExpressionFromFunction(false), line(-1), dataRef(0) +: expressionFunctionValid(true), expressionFunctionRewritten(false), + extractExpressionFromFunction(false), line(-1), dataRef(0) { } @@ -101,6 +102,7 @@ void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, const QS QDeclarativeAbstractExpression::setContext(ctxt); setScopeObject(me); expressionFunctionValid = false; + expressionFunctionRewritten = false; } void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, v8::Handle func, @@ -112,23 +114,21 @@ void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, v8::Hand v8function = qPersistentNew(func); setUseSharedContext(false); expressionFunctionValid = true; + expressionFunctionRewritten = false; extractExpressionFromFunction = true; } -void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, const QString &expr, bool isRewritten, - QObject *me, const QString &srcUrl, int lineNumber) +void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, const QString &expr, + bool isRewritten, QObject *me, const QString &srcUrl, + int lineNumber) { url = srcUrl; line = lineNumber; expression = expr; - if (!isRewritten) { - expressionFunctionValid = false; - } else { - v8function = evalFunction(ctxt, me, expression, url, line, &v8qmlscope); - expressionFunctionValid = true; - } + expressionFunctionValid = false; + expressionFunctionRewritten = isRewritten; QDeclarativeAbstractExpression::setContext(ctxt); setScopeObject(me); @@ -373,6 +373,7 @@ void QDeclarativeExpression::setExpression(const QString &expression) d->resetNotifyOnValueChanged(); d->expression = expression; d->expressionFunctionValid = false; + d->expressionFunctionRewritten = false; qPersistentDispose(d->v8function); qPersistentDispose(d->v8qmlscope); } @@ -571,10 +572,16 @@ void QDeclarativeJavaScriptExpression::clearGuards() v8::Local QDeclarativeExpressionPrivate::v8value(QObject *secondaryScope, bool *isUndefined) { if (!expressionFunctionValid) { + bool ok = true; + QDeclarativeRewrite::RewriteBinding rewriteBinding; rewriteBinding.setName(name); - bool ok = true; - const QString code = rewriteBinding(expression, &ok); + QString code; + if (expressionFunctionRewritten) + code = expression; + else + code = rewriteBinding(expression, &ok); + if (ok) v8function = evalFunction(context(), scopeObject(), code, url, line, &v8qmlscope); setUseSharedContext(false); expressionFunctionValid = true; diff --git a/src/declarative/qml/qdeclarativeexpression_p.h b/src/declarative/qml/qdeclarativeexpression_p.h index 7b53bab..6d8a07c 100644 --- a/src/declarative/qml/qdeclarativeexpression_p.h +++ b/src/declarative/qml/qdeclarativeexpression_p.h @@ -197,6 +197,7 @@ public: const QString &, int); bool expressionFunctionValid:1; + bool expressionFunctionRewritten:1; bool extractExpressionFromFunction:1; inline virtual QString expressionIdentifier(); -- 1.7.2.5