aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2018-04-30 12:34:54 +0200
committerLars Knoll <lars.knoll@qt.io>2018-05-02 14:16:59 +0000
commit3f82c8131fed248c24ed8c8be7449b4732afcd0b (patch)
treedb9d38747763beafb5cacb8a848cf9989e241263 /src
parent6d0378ad9b91db04ca725b98d941d32871b19d82 (diff)
Fix crashes when parsing functions with no parameters
Commit da5fffbd34d8be68f8ee4c649881dbb673c9c0a5 introduced deferencing of the formals parameter list that can be a null pointer if the declared function has no parameters. Change-Id: Id7dce0f78b16266e672f0ae430ee4f979de5734d Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp2
-rw-r--r--src/qml/compiler/qv4codegen.cpp2
-rw-r--r--src/qml/compiler/qv4compilercontext_p.h2
-rw-r--r--src/qml/compiler/qv4compilerscanfunctions.cpp10
4 files changed, 8 insertions, 8 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp
index 9de27a2588..f763e55113 100644
--- a/src/qml/compiler/qqmlirbuilder.cpp
+++ b/src/qml/compiler/qqmlirbuilder.cpp
@@ -983,7 +983,7 @@ bool IRBuilder::visit(QQmlJS::AST::UiSourceElement *node)
f->index = index;
f->nameIndex = registerString(funDecl->name.toString());
- const QStringList formals = funDecl->formals->formals();
+ const QStringList formals = funDecl->formals ? funDecl->formals->formals() : QStringList();
int formalsCount = formals.size();
f->formals.allocate(pool, formalsCount);
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp
index 0a46fc7a8e..4e6d56adcf 100644
--- a/src/qml/compiler/qv4codegen.cpp
+++ b/src/qml/compiler/qv4codegen.cpp
@@ -2425,7 +2425,7 @@ int Codegen::defineFunction(const QString &name, AST::Node *ast,
}
}
if (_context->usesArgumentsObject == Context::ArgumentsObjectUsed) {
- if (_context->isStrict || !formals->isSimpleParameterList()) {
+ if (_context->isStrict || (formals && !formals->isSimpleParameterList())) {
Instruction::CreateUnmappedArgumentsObject setup;
bytecodeGenerator->addInstruction(setup);
} else {
diff --git a/src/qml/compiler/qv4compilercontext_p.h b/src/qml/compiler/qv4compilercontext_p.h
index e53fb26e4a..2479465587 100644
--- a/src/qml/compiler/qv4compilercontext_p.h
+++ b/src/qml/compiler/qv4compilercontext_p.h
@@ -265,7 +265,7 @@ struct Context {
return true;
if (type != FunctionDefinition) {
- if (formals->containsName(name))
+ if (formals && formals->containsName(name))
return (scope == QQmlJS::AST::VariableScope::Var);
}
MemberMap::iterator it = members.find(name);
diff --git a/src/qml/compiler/qv4compilerscanfunctions.cpp b/src/qml/compiler/qv4compilerscanfunctions.cpp
index c6e792fc45..3bbef3a96a 100644
--- a/src/qml/compiler/qv4compilerscanfunctions.cpp
+++ b/src/qml/compiler/qv4compilerscanfunctions.cpp
@@ -420,7 +420,7 @@ bool ScanFunctions::enterFunction(Node *ast, const QString &name, FormalParamete
outerContext->usesArgumentsObject = Context::ArgumentsObjectNotUsed;
}
- if (formals->containsName(QStringLiteral("arguments")))
+ if (formals && formals->containsName(QStringLiteral("arguments")))
_context->usesArgumentsObject = Context::ArgumentsObjectNotUsed;
if (expr) {
if (expr->isArrowFunction)
@@ -430,18 +430,18 @@ bool ScanFunctions::enterFunction(Node *ast, const QString &name, FormalParamete
}
- if (!name.isEmpty() && !formals->containsName(name))
+ if (!name.isEmpty() && (!formals || !formals->containsName(name)))
_context->addLocalVar(name, Context::ThisFunctionName, VariableScope::Var);
_context->formals = formals;
if (body && !_context->isStrict)
checkDirectivePrologue(body);
- bool isSimpleParameterList = formals->isSimpleParameterList();
+ bool isSimpleParameterList = formals && formals->isSimpleParameterList();
- _context->arguments = formals->formals();
+ _context->arguments = formals ? formals->formals() : QStringList();
- const QStringList boundNames = formals->boundNames();
+ const QStringList boundNames = formals ? formals->boundNames() : QStringList();
for (int i = 0; i < boundNames.size(); ++i) {
const QString &arg = boundNames.at(i);
if (_context->isStrict || !isSimpleParameterList) {