aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlboundsignal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qml/qqmlboundsignal.cpp')
-rw-r--r--src/qml/qml/qqmlboundsignal.cpp97
1 files changed, 70 insertions, 27 deletions
diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp
index e5a0df8c32..8c3e1c7384 100644
--- a/src/qml/qml/qqmlboundsignal.cpp
+++ b/src/qml/qml/qqmlboundsignal.cpp
@@ -66,36 +66,44 @@ static QQmlJavaScriptExpression::VTable QQmlBoundSignalExpression_jsvtable = {
QQmlBoundSignalExpression::expressionChanged
};
+QQmlBoundSignalExpression::ExtraData::ExtraData(const QString &handlerName, const QString &parameterString,
+ const QString &expression, const QString &fileName,
+ quint16 line, quint16 column)
+ : m_handlerName(handlerName),
+ m_parameterString(parameterString),
+ m_expression(expression),
+ m_fileName(fileName),
+ m_line(line),
+ m_column(column)
+{
+}
+
QQmlBoundSignalExpression::QQmlBoundSignalExpression(QObject *target, int index,
QQmlContextData *ctxt, QObject *scope, const QString &expression,
const QString &fileName, quint16 line, quint16 column,
const QString &handlerName,
const QString &parameterString)
: QQmlJavaScriptExpression(&QQmlBoundSignalExpression_jsvtable),
- m_fileName(fileName),
- m_line(line),
- m_column(column),
m_target(target),
m_index(index),
- m_expressionFunctionValid(false),
- m_invalidParameterName(false)
+ m_extra(new ExtraData(handlerName, parameterString, expression, fileName, line, column))
{
+ setExpressionFunctionValid(false);
+ setInvalidParameterName(false);
+
init(ctxt, scope);
- m_handlerName = handlerName;
- m_parameterString = parameterString;
- m_expression = expression;
}
QQmlBoundSignalExpression::QQmlBoundSignalExpression(QObject *target, int index, QQmlContextData *ctxt, QObject *scope, const QV4::ValueRef &function)
: QQmlJavaScriptExpression(&QQmlBoundSignalExpression_jsvtable),
m_v8function(function),
- m_line(USHRT_MAX),
- m_column(USHRT_MAX),
m_target(target),
m_index(index),
- m_expressionFunctionValid(true),
- m_invalidParameterName(false)
+ m_extra(0)
{
+ setExpressionFunctionValid(true);
+ setInvalidParameterName(false);
+
init(ctxt, scope);
}
@@ -124,21 +132,55 @@ void QQmlBoundSignalExpression::expressionChanged(QQmlJavaScriptExpression *)
// bound signals do not notify on change.
}
+QString QQmlBoundSignalExpression::sourceFile() const
+{
+ if (expressionFunctionValid()) {
+ QV4::Function *f = function();
+ Q_ASSERT(f);
+ return f->sourceFile();
+ }
+ Q_ASSERT(!m_extra.isNull());
+ return m_extra->m_fileName;
+}
+
+quint16 QQmlBoundSignalExpression::lineNumber() const
+{
+ if (expressionFunctionValid()) {
+ QV4::Function *f = function();
+ Q_ASSERT(f);
+ return f->compiledFunction->location.line;
+ }
+ Q_ASSERT(!m_extra.isNull());
+ return m_extra->m_line;
+}
+
+quint16 QQmlBoundSignalExpression::columnNumber() const
+{
+ if (expressionFunctionValid()) {
+ QV4::Function *f = function();
+ Q_ASSERT(f);
+ return f->compiledFunction->location.column;
+ }
+ Q_ASSERT(!m_extra.isNull());
+ return m_extra->m_column;
+}
+
QString QQmlBoundSignalExpression::expression() const
{
- if (m_expressionFunctionValid) {
+ if (expressionFunctionValid()) {
Q_ASSERT (context() && engine());
QV4::Scope scope(QQmlEnginePrivate::get(engine())->v4engine());
QV4::ScopedValue v(scope, m_v8function.value());
return v->toQStringNoThrow();
} else {
- return m_expression;
+ Q_ASSERT(!m_extra.isNull());
+ return m_extra->m_expression;
}
}
QV4::Function *QQmlBoundSignalExpression::function() const
{
- if (m_expressionFunctionValid) {
+ if (expressionFunctionValid()) {
Q_ASSERT (context() && engine());
QV4::Scope scope(QQmlEnginePrivate::get(engine())->v4engine());
QV4::Scoped<QV4::FunctionObject> v(scope, m_v8function.value());
@@ -153,7 +195,7 @@ void QQmlBoundSignalExpression::evaluate(void **a)
{
Q_ASSERT (context() && engine());
- if (m_invalidParameterName)
+ if (invalidParameterName())
return;
QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine());
@@ -161,14 +203,15 @@ void QQmlBoundSignalExpression::evaluate(void **a)
ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation.
{
- if (!m_expressionFunctionValid) {
+ if (!expressionFunctionValid()) {
+ Q_ASSERT(!m_extra.isNull());
QString expression;
expression = QStringLiteral("(function ");
- expression += m_handlerName;
+ expression += m_extra->m_handlerName;
expression += QLatin1Char('(');
- if (m_parameterString.isEmpty()) {
+ if (m_extra->m_parameterString.isEmpty()) {
QString error;
//TODO: look at using the property cache here (as in the compiler)
// for further optimization
@@ -177,30 +220,30 @@ void QQmlBoundSignalExpression::evaluate(void **a)
if (!error.isEmpty()) {
qmlInfo(scopeObject()) << error;
- m_invalidParameterName = true;
+ setInvalidParameterName(true);
ep->dereferenceScarceResources();
return;
}
} else
- expression += m_parameterString;
+ expression += m_extra->m_parameterString;
expression += QStringLiteral(") { ");
- expression += m_expression;
+ expression += m_extra->m_expression;
expression += QStringLiteral(" })");
- m_expression.clear();
- m_handlerName.clear();
- m_parameterString.clear();
+ m_extra->m_expression.clear();
+ m_extra->m_handlerName.clear();
+ m_extra->m_parameterString.clear();
m_v8function = evalFunction(context(), scopeObject(), expression,
- m_fileName, m_line, &m_v8qmlscope);
+ m_extra->m_fileName, m_extra->m_line, &m_v8qmlscope);
if (m_v8function.isNullOrUndefined()) {
ep->dereferenceScarceResources();
return; // could not evaluate function. Not valid.
}
- m_expressionFunctionValid = true;
+ setExpressionFunctionValid(true);
}
QV8Engine *engine = ep->v8engine();