setNotifyOnValueChanged(false);
setContext(ctxt);
setScopeObject(scope);
- m_expression = QString::fromUtf8(expression);
+ if (isRewritten)
+ m_expressionUtf8 = expression;
+ else
+ m_expression = QString::fromUtf8(expression);
m_expressionFunctionValid = false;
m_expressionFunctionRewritten = isRewritten;
m_fileName = fileName;
setNotifyOnValueChanged(false);
setContext(ctxt);
setScopeObject(scope);
- m_expression = expression;
+ if (isRewritten)
+ m_expressionUtf8 = expression.toUtf8();
+ else
+ m_expression = expression;
m_expressionFunctionValid = false;
m_expressionFunctionRewritten = isRewritten;
m_fileName = fileName;
QString QQmlBoundSignalExpression::expressionIdentifier(QQmlJavaScriptExpression *e)
{
QQmlBoundSignalExpression *This = static_cast<QQmlBoundSignalExpression *>(e);
- return QLatin1Char('"') + This->m_expression + QLatin1Char('"');
+ return This->sourceFile() + QLatin1Char(':') + QString::number(This->lineNumber());
}
void QQmlBoundSignalExpression::expressionChanged(QQmlJavaScriptExpression *)
// bound signals do not notify on change.
}
+QString QQmlBoundSignalExpression::expression() const
+{
+ if (m_expressionFunctionValid) {
+ Q_ASSERT (context() && engine());
+ v8::HandleScope handle_scope;
+ v8::Context::Scope context_scope(QQmlEnginePrivate::get(engine())->v8engine()->context());
+ return QV8Engine::toStringStatic(m_v8function->ToString());
+ } else if (!m_expressionUtf8.isEmpty()) {
+ return QString::fromUtf8(m_expressionUtf8);
+ } else {
+ return m_expression;
+ }
+}
+
// This mirrors code in QQmlExpressionPrivate::value() and v8value().
// Any change made here should be made there and vice versa.
void QQmlBoundSignalExpression::evaluate(QObject *secondaryScope)
v8::HandleScope handle_scope;
v8::Context::Scope context_scope(ep->v8engine()->context());
if (!m_expressionFunctionValid) {
- bool ok = true;
- QString code;
+
if (m_expressionFunctionRewritten) {
- code = m_expression;
+ m_v8function = evalFunction(context(), scopeObject(), m_expressionUtf8, m_fileName, m_line, &m_v8qmlscope);
+ m_expressionUtf8.clear();
} else {
+ bool ok = true;
QQmlRewrite::RewriteSignalHandler rewriteSignalHandler;
- code = rewriteSignalHandler(m_expression, m_functionName, &ok);
+ const QString &code = rewriteSignalHandler(m_expression, QString()/*no name hint available*/, &ok);
+ if (ok)
+ m_v8function = evalFunction(context(), scopeObject(), code, m_fileName, m_line, &m_v8qmlscope);
+ m_expression.clear();
}
- if (ok)
- m_v8function = evalFunction(context(), scopeObject(), code, m_fileName, m_line, &m_v8qmlscope);
-
if (m_v8function.IsEmpty() || m_v8function->IsNull()) {
ep->dereferenceScarceResources();
return; // could not evaluate function. Not valid.
QString sourceFile() const { return m_fileName; }
int lineNumber() const { return m_line; }
int columnNumber() const { return m_column; }
- QString expression() const { return m_expression; }
+ QString expression() const;
QQmlEngine *engine() const { return context() ? context()->engine : 0; }
v8::Persistent<v8::Object> m_v8qmlscope;
v8::Persistent<v8::Function> m_v8function;
- QString m_expression;
- QString m_functionName; // hint for debugger
+ //either expressionUtf8 or expression will be used (but not both).
+ //once m_v8function is valid, we clear both expressions, and
+ //extract it from m_v8function if needed.
+ QByteArray m_expressionUtf8;
+ QString m_expression; //only used when expression needs to be rewritten
+
QString m_fileName;
int m_line;
int m_column;