aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-04-25 15:19:54 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2018-04-26 06:51:31 +0000
commitfb027435f597d55b9e72465036cb0daa2b272ec0 (patch)
tree6fa6ea1647d7ea0947e7d153c22a36bc98667ad9 /src
parent950de04322191c16c3066707889b17b0f5eb2ee6 (diff)
Only create CallContext objects for bindings that might be signal handlers
Creating the callcontext for all bindings causes a 15% performance regression in both of the moving images benchmarks of qmlbench. But in most cases, we know that a binding can't be a signal handler, as those always have to start with 'on'. Take this into account and avoid creating the context for most binding expressions. Task-number: QTBUG-67782 Task-number: QTBUG-67783 Change-Id: I9a25cb916e374c7d03693e49646ca28853c6ba54 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qml/compiler/qv4codegen.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp
index 8ada1d505e..c281275da1 100644
--- a/src/qml/compiler/qv4codegen.cpp
+++ b/src/qml/compiler/qv4codegen.cpp
@@ -2104,9 +2104,14 @@ int Codegen::defineFunction(const QString &name, AST::Node *ast,
_context->addLocalVar(QStringLiteral("arguments"), Context::VariableDeclaration, AST::VariableDeclaration::FunctionScope);
bool allVarsEscape = _context->hasWith || _context->hasTry || _context->hasDirectEval;
- if (_context->compilationMode == QmlBinding // we don't really need this for bindings, but we do for signal handlers, and we don't know if the code is a signal handler or not.
- || (!_context->canUseSimpleCall() && _context->compilationMode != GlobalCode &&
- (_context->compilationMode != EvalCode || _context->isStrict))) {
+ bool needsCallContext = false;
+ const QLatin1String exprForOn("expression for on");
+ if (!_context->canUseSimpleCall() && _context->compilationMode != GlobalCode && (_context->compilationMode != EvalCode || _context->isStrict))
+ needsCallContext = true;
+ else if (_context->compilationMode == QmlBinding && name.length() > exprForOn.size() && name.startsWith(exprForOn) && name.at(exprForOn.size()).isUpper())
+ // we don't really need this for bindings, but we do for signal handlers, and we don't know if the code is a signal handler or not.
+ needsCallContext = true;
+ if (needsCallContext) {
Instruction::CreateCallContext createContext;
bytecodeGenerator->addInstruction(createContext);
}