aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-12-05 15:19:09 +0000
committerQt by Nokia <qt-info@nokia.com>2011-12-05 17:09:14 +0100
commit80474586da6f3e257038c80093bc56f9fd21d8a4 (patch)
treeff7836a5811fcfe4a12b4ff3f2288333c42ec342
parent4bc66eb9389974ca1dda2595414175e69af418bc (diff)
Don't eval signal handler closure until signal is emitted
Change-Id: Ic3bd6ed53330b19567fa0bf34b8e4618e3f68ba5 Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
-rw-r--r--src/declarative/qml/qdeclarativeexpression.cpp29
-rw-r--r--src/declarative/qml/qdeclarativeexpression_p.h1
2 files changed, 19 insertions, 11 deletions
diff --git a/src/declarative/qml/qdeclarativeexpression.cpp b/src/declarative/qml/qdeclarativeexpression.cpp
index bf2552df10..a5b7e7c065 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<v8::Function> func,
@@ -112,23 +114,21 @@ void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, v8::Hand
v8function = qPersistentNew<v8::Function>(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<v8::Value> 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 7b53bab093..6d8a07c692 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();