diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/qml/qmlexpression.cpp | 18 | ||||
-rw-r--r-- | src/declarative/qml/qmlexpression_p.h | 4 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp index 84352b8..3d8ee37 100644 --- a/src/declarative/qml/qmlexpression.cpp +++ b/src/declarative/qml/qmlexpression.cpp @@ -52,17 +52,17 @@ QT_BEGIN_NAMESPACE DEFINE_BOOL_CONFIG_OPTION(qmlDebugger, QML_DEBUGGER) QmlExpressionPrivate::QmlExpressionPrivate(QmlExpression *b) -: q(b), ctxt(0), sseData(0), proxy(0), me(0), trackChange(false), line(-1), id(0), log(0) +: q(b), ctxt(0), expressionFunctionValid(false), sseData(0), proxy(0), me(0), trackChange(false), line(-1), id(0), log(0) { } QmlExpressionPrivate::QmlExpressionPrivate(QmlExpression *b, void *expr, QmlRefCount *rc) -: q(b), ctxt(0), sse((const char *)expr, rc), sseData(0), proxy(0), me(0), trackChange(true), line(-1), id(0), log(0) +: q(b), ctxt(0), expressionFunctionValid(false), sse((const char *)expr, rc), sseData(0), proxy(0), me(0), trackChange(true), line(-1), id(0), log(0) { } QmlExpressionPrivate::QmlExpressionPrivate(QmlExpression *b, const QString &expr) -: q(b), ctxt(0), expression(expr), sseData(0), proxy(0), me(0), trackChange(true), line(-1), id(0), log(0) +: q(b), ctxt(0), expression(expr), expressionFunctionValid(false), sseData(0), proxy(0), me(0), trackChange(true), line(-1), id(0), log(0) { } @@ -177,6 +177,8 @@ void QmlExpression::setExpression(const QString &expression) delete d->proxy; d->proxy = 0; d->expression = expression; + d->expressionFunctionValid = false; + d->expressionFunction = QScriptValue(); d->sse.clear(); } @@ -234,8 +236,14 @@ QVariant QmlExpressionPrivate::evalQtScript() for (int i = ctxtPriv->scopeChain.size() - 1; i > -1; --i) scriptEngine->currentContext()->pushScope(ctxtPriv->scopeChain.at(i)); - QScriptValue svalue = - scriptEngine->evaluate(expression, fileName.toString(), line); + if (!expressionFunctionValid) { + expressionFunction = + scriptEngine->evaluate("function() {" +expression+"}", + fileName.toString(), line); + expressionFunctionValid = true; + } + + QScriptValue svalue = expressionFunction.call(); if (scriptEngine->hasUncaughtException()) { if (scriptEngine->uncaughtException().isError()){ diff --git a/src/declarative/qml/qmlexpression_p.h b/src/declarative/qml/qmlexpression_p.h index 5883125..09745a3 100644 --- a/src/declarative/qml/qmlexpression_p.h +++ b/src/declarative/qml/qmlexpression_p.h @@ -55,6 +55,7 @@ #include "qmlbasicscript_p.h" #include "qmlexpression.h" +#include <QtScript/qscriptvalue.h> QT_BEGIN_NAMESPACE @@ -73,6 +74,9 @@ public: QmlExpression *q; QmlContext *ctxt; QString expression; + bool expressionFunctionValid; + QScriptValue expressionFunction; + QmlBasicScript sse; void *sseData; QmlExpressionBindProxy *proxy; |