summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/qml/qmlboundsignal.cpp8
-rw-r--r--src/declarative/qml/qmlexpression.cpp45
-rw-r--r--src/declarative/qml/qmlexpression_p.h8
-rw-r--r--src/declarative/qml/qmlvme.cpp2
-rw-r--r--tests/auto/declarative/qmlparser/assignSignal.qml1
-rw-r--r--tests/auto/declarative/qmlparser/testtypes.h2
-rw-r--r--tests/auto/declarative/qmlparser/tst_qmlparser.cpp2
7 files changed, 45 insertions, 23 deletions
diff --git a/src/declarative/qml/qmlboundsignal.cpp b/src/declarative/qml/qmlboundsignal.cpp
index 9af4003..c43097e 100644
--- a/src/declarative/qml/qmlboundsignal.cpp
+++ b/src/declarative/qml/qmlboundsignal.cpp
@@ -42,6 +42,7 @@
#include "qmlboundsignal_p.h"
#include "private/qmetaobjectbuilder_p.h"
#include "private/qmlengine_p.h"
+#include "private/qmlexpression_p.h"
#include "private/qmlcontext_p.h"
#include <qfxglobal.h>
#include <qmlmetatype.h>
@@ -60,7 +61,8 @@ QmlBoundSignal::QmlBoundSignal(QmlContext *ctxt, const QString &val, QObject *me
// This is thread safe. Although it may be updated by two threads, they
// will both set it to the same value - so the worst thing that can happen
// is that they both do the work to figure it out. Boo hoo.
- if (evaluateIdx == -1) evaluateIdx = QmlExpression::staticMetaObject.indexOfMethod("value()");
+ if (evaluateIdx == -1)
+ evaluateIdx = QmlExpression::staticMetaObject.indexOfMethod("value()");
setTrackChange(false);
QFx_setParent_noEvent(this, parent);
@@ -73,15 +75,13 @@ QmlBoundSignalProxy::QmlBoundSignalProxy(QmlContext *ctxt, const QString &val, Q
QMetaMethod signal = me->metaObject()->method(idx);
params = new QmlBoundSignalParameters(signal, this);
-
- ctxt->d_func()->addDefaultObject(params, QmlContextPrivate::HighPriority);
}
int QmlBoundSignalProxy::qt_metacall(QMetaObject::Call c, int id, void **a)
{
if (c == QMetaObject::InvokeMetaMethod && id == evaluateIdx) {
params->setValues(a);
- value();
+ QmlExpressionPrivate::get(this)->value(params);
params->clearValues();
return -1;
} else {
diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp
index 845dcf6..db9d39f 100644
--- a/src/declarative/qml/qmlexpression.cpp
+++ b/src/declarative/qml/qmlexpression.cpp
@@ -212,7 +212,7 @@ QVariant QmlExpressionPrivate::evalSSE()
return rv;
}
-QVariant QmlExpressionPrivate::evalQtScript()
+QVariant QmlExpressionPrivate::evalQtScript(QObject *secondaryScope)
{
#ifdef Q_ENABLE_PERFORMANCE_LOG
QFxPerfTimer<QFxPerf::BindValueQt> perfqt;
@@ -223,6 +223,9 @@ QVariant QmlExpressionPrivate::evalQtScript()
if (me)
ctxtPriv->defaultObjects.insert(ctxtPriv->highPriorityCount, me);
+ if (secondaryScope)
+ ctxtPriv->defaultObjects.insert(ctxtPriv->highPriorityCount,
+ secondaryScope);
QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
@@ -263,6 +266,8 @@ QVariant QmlExpressionPrivate::evalQtScript()
if (me)
ctxtPriv->defaultObjects.removeAt(ctxtPriv->highPriorityCount);
+ if (secondaryScope)
+ ctxtPriv->defaultObjects.removeAt(ctxtPriv->highPriorityCount);
QVariant rv;
@@ -306,42 +311,38 @@ QVariant QmlExpressionPrivate::evalQtScript()
return rv;
}
-/*!
- Returns the value of the expression, or an invalid QVariant if the
- expression is invalid or has an error.
-*/
-QVariant QmlExpression::value()
+QVariant QmlExpressionPrivate::value(QObject *secondaryScope)
{
- Q_D(QmlExpression);
+ Q_Q(QmlExpression);
QVariant rv;
- if (!engine() || (!d->sse.isValid() && d->expression.isEmpty()))
+ if (!q->engine() || (!sse.isValid() && expression.isEmpty()))
return rv;
#ifdef Q_ENABLE_PERFORMANCE_LOG
QFxPerfTimer<QFxPerf::BindValue> perf;
#endif
- QmlEnginePrivate *ep = QmlEnginePrivate::get(engine());
+ QmlEnginePrivate *ep = QmlEnginePrivate::get(q->engine());
QmlExpression *lastCurrentExpression = ep->currentExpression;
QPODVector<QmlEnginePrivate::CapturedProperty> lastCapturedProperties;
ep->capturedProperties.copyAndClear(lastCapturedProperties);
- ep->currentExpression = this;
+ ep->currentExpression = q;
- if (d->sse.isValid()) {
- rv = d->evalSSE();
+ if (sse.isValid()) {
+ rv = evalSSE();
} else {
- rv = d->evalQtScript();
+ rv = evalQtScript(secondaryScope);
}
ep->currentExpression = lastCurrentExpression;
- if ((!trackChange() || !ep->capturedProperties.count()) && d->guardList) {
- d->clearGuards();
- } else if(trackChange()) {
- d->updateGuards(ep->capturedProperties);
+ if ((!q->trackChange() || !ep->capturedProperties.count()) && guardList) {
+ clearGuards();
+ } else if(q->trackChange()) {
+ updateGuards(ep->capturedProperties);
}
lastCapturedProperties.copyAndClear(ep->capturedProperties);
@@ -350,6 +351,16 @@ QVariant QmlExpression::value()
}
/*!
+ Returns the value of the expression, or an invalid QVariant if the
+ expression is invalid or has an error.
+*/
+QVariant QmlExpression::value()
+{
+ Q_D(QmlExpression);
+ return d->value();
+}
+
+/*!
Returns true if the expression results in a constant value.
QmlExpression::value() must have been invoked at least once before the
return from this method is valid.
diff --git a/src/declarative/qml/qmlexpression_p.h b/src/declarative/qml/qmlexpression_p.h
index 997bf8d..501e5d8 100644
--- a/src/declarative/qml/qmlexpression_p.h
+++ b/src/declarative/qml/qmlexpression_p.h
@@ -93,6 +93,7 @@ public:
PreTransformedQtScriptData = 2
};
+
void init(QmlContext *, const QString &, QObject *);
void init(QmlContext *, void *, QmlRefCount *, QObject *);
@@ -108,8 +109,9 @@ public:
QString fileName;
int line;
+ QVariant value(QObject *secondaryScope = 0);
QVariant evalSSE();
- QVariant evalQtScript();
+ QVariant evalQtScript(QObject *secondaryScope);
struct SignalGuard : public QGuard<QObject> {
SignalGuard() : isDuplicate(false), notifyIndex(-1) {}
@@ -132,6 +134,10 @@ public:
int guardListLength;
void updateGuards(const QPODVector<QmlEnginePrivate::CapturedProperty> &properties);
void clearGuards();
+
+ static QmlExpressionPrivate *get(QmlExpression *expr) {
+ return static_cast<QmlExpressionPrivate *>(QObjectPrivate::get(expr));
+ }
};
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp
index 4d133e3..ca88455 100644
--- a/src/declarative/qml/qmlvme.cpp
+++ b/src/declarative/qml/qmlvme.cpp
@@ -540,7 +540,7 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledData
if (signal.parameterTypes().isEmpty()) {
(void *)new QmlBoundSignal(ctxt, primitives.at(instr.storeSignal.value), target, instr.storeSignal.signalIndex, target);
} else {
- (void *)new QmlBoundSignalProxy(new QmlContext(ctxt, target, true), primitives.at(instr.storeSignal.value), target, instr.storeSignal.signalIndex, target);
+ (void *)new QmlBoundSignalProxy(ctxt, primitives.at(instr.storeSignal.value), target, instr.storeSignal.signalIndex, target);
}
}
break;
diff --git a/tests/auto/declarative/qmlparser/assignSignal.qml b/tests/auto/declarative/qmlparser/assignSignal.qml
index 153b403..3abc04d 100644
--- a/tests/auto/declarative/qmlparser/assignSignal.qml
+++ b/tests/auto/declarative/qmlparser/assignSignal.qml
@@ -1,4 +1,5 @@
import Test 1.0
MyQmlObject {
onBasicSignal: basicSlot()
+ onBasicParameterizedSignal: basicSlot(parameter)
}
diff --git a/tests/auto/declarative/qmlparser/testtypes.h b/tests/auto/declarative/qmlparser/testtypes.h
index e3e9aae..f6f966f 100644
--- a/tests/auto/declarative/qmlparser/testtypes.h
+++ b/tests/auto/declarative/qmlparser/testtypes.h
@@ -97,9 +97,11 @@ public:
void setCustomType(const MyCustomVariantType &v) { m_custom = v; }
public slots:
void basicSlot() { qWarning("MyQmlObject::basicSlot"); }
+ void basicSlot(int v) { qWarning("MyQmlObject::basicSlot(%d)", v); }
signals:
void basicSignal();
+ void basicParameterizedSignal(int parameter);
private:
friend class tst_qmlparser;
diff --git a/tests/auto/declarative/qmlparser/tst_qmlparser.cpp b/tests/auto/declarative/qmlparser/tst_qmlparser.cpp
index ee1b072..c2f1e1a 100644
--- a/tests/auto/declarative/qmlparser/tst_qmlparser.cpp
+++ b/tests/auto/declarative/qmlparser/tst_qmlparser.cpp
@@ -376,6 +376,8 @@ void tst_qmlparser::assignSignal()
QVERIFY(object != 0);
QTest::ignoreMessage(QtWarningMsg, "MyQmlObject::basicSlot");
emit object->basicSignal();
+ QTest::ignoreMessage(QtWarningMsg, "MyQmlObject::basicSlot(9)");
+ emit object->basicParameterizedSignal(9);
}
// Tests the creation and assignment of dynamic properties