aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/compiler')
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp10
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp36
-rw-r--r--src/qml/compiler/qqmltypecompiler_p.h1
-rw-r--r--src/qml/compiler/qv4codegen.cpp10
-rw-r--r--src/qml/compiler/qv4isel_p.cpp2
-rw-r--r--src/qml/compiler/qv4jsir.cpp2
-rw-r--r--src/qml/compiler/qv4ssa.cpp12
7 files changed, 41 insertions, 32 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp
index 9fcfe53b05..a34c1cbf0e 100644
--- a/src/qml/compiler/qqmlirbuilder.cpp
+++ b/src/qml/compiler/qqmlirbuilder.cpp
@@ -411,7 +411,7 @@ bool IRBuilder::generateFromQml(const QString &code, const QString &url, Documen
bool IRBuilder::isSignalPropertyName(const QString &name)
{
if (name.length() < 3) return false;
- if (!name.startsWith(QStringLiteral("on"))) return false;
+ if (!name.startsWith(QLatin1String("on"))) return false;
int ns = name.length();
for (int i = 2; i < ns; ++i) {
const QChar curr = name.at(i);
@@ -1061,7 +1061,7 @@ void IRBuilder::appendBinding(QQmlJS::AST::UiQualifiedId *name, QQmlJS::AST::Sta
Object *object = 0;
if (!resolveQualifiedId(&name, &object))
return;
- if (_object == object && name->name == QStringLiteral("id")) {
+ if (_object == object && name->name == QLatin1String("id")) {
setId(name->identifierToken, value);
return;
}
@@ -1097,7 +1097,7 @@ void IRBuilder::appendBinding(const QQmlJS::AST::SourceLocation &qualifiedNameLo
void IRBuilder::appendBinding(const QQmlJS::AST::SourceLocation &qualifiedNameLocation, const QQmlJS::AST::SourceLocation &nameLocation, quint32 propertyNameIndex, int objectIndex, bool isListItem, bool isOnAssignment)
{
- if (stringAt(propertyNameIndex) == QStringLiteral("id")) {
+ if (stringAt(propertyNameIndex) == QLatin1String("id")) {
recordError(nameLocation, tr("Invalid component id specification"));
return;
}
@@ -1192,7 +1192,7 @@ bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, O
{
QQmlJS::AST::UiQualifiedId *qualifiedIdElement = *nameToResolve;
- if (qualifiedIdElement->name == QStringLiteral("id") && qualifiedIdElement->next)
+ if (qualifiedIdElement->name == QLatin1String("id") && qualifiedIdElement->next)
COMPILE_EXCEPTION(qualifiedIdElement->identifierToken, tr( "Invalid use of id property"));
// If it's a namespace, prepend the qualifier and we'll resolve it later to the correct type.
@@ -1918,7 +1918,7 @@ QQmlPropertyData *PropertyResolver::signal(const QString &name, bool *notInRevis
return d;
}
- if (name.endsWith(QStringLiteral("Changed"))) {
+ if (name.endsWith(QLatin1String("Changed"))) {
QString propName = name.mid(0, name.length() - static_cast<int>(strlen("Changed")));
d = property(propName, notInRevision);
diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp
index 2b3cd93052..33716d57b8 100644
--- a/src/qml/compiler/qqmltypecompiler.cpp
+++ b/src/qml/compiler/qqmltypecompiler.cpp
@@ -972,7 +972,7 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio
QmlIR::PropertyResolver resolver(propertyCache);
- Q_ASSERT(propertyName.startsWith(QStringLiteral("on")));
+ Q_ASSERT(propertyName.startsWith(QLatin1String("on")));
propertyName.remove(0, 2);
// Note that the property name could start with any alpha or '_' or '$' character,
@@ -1039,7 +1039,7 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio
}
QHash<QString, QStringList>::ConstIterator entry = customSignals.constFind(propertyName);
- if (entry == customSignals.constEnd() && propertyName.endsWith(QStringLiteral("Changed"))) {
+ if (entry == customSignals.constEnd() && propertyName.endsWith(QLatin1String("Changed"))) {
QString alternateName = propertyName.mid(0, propertyName.length() - static_cast<int>(strlen("Changed")));
entry = customSignals.constFind(alternateName);
}
@@ -1163,6 +1163,17 @@ struct StaticQtMetaObject : public QObject
{ return &staticQtMetaObject; }
};
+bool QQmlEnumTypeResolver::assignEnumToBinding(QmlIR::Binding *binding, const QString &enumName, int enumValue, bool isQtObject)
+{
+ if (enumName.length() > 0 && enumName[0].isLower() && !isQtObject) {
+ COMPILE_EXCEPTION(binding, tr("Invalid property assignment: Enum value \"%1\" cannot start with a lowercase letter").arg(enumName));
+ }
+ binding->type = QV4::CompiledData::Binding::Type_Number;
+ binding->value.d = (double)enumValue;
+ binding->flags |= QV4::CompiledData::Binding::IsResolvedEnum;
+ return true;
+}
+
bool QQmlEnumTypeResolver::tryQualifiedEnumAssignment(const QmlIR::Object *obj, const QQmlPropertyCache *propertyCache, const QQmlPropertyData *prop, QmlIR::Binding *binding)
{
bool isIntProp = (prop->propType == QMetaType::Int) && !prop->isEnum();
@@ -1185,6 +1196,7 @@ bool QQmlEnumTypeResolver::tryQualifiedEnumAssignment(const QmlIR::Object *obj,
return true;
QHashedStringRef typeName(string.constData(), dot);
+ const bool isQtObject = (typeName == QLatin1String("Qt"));
QString enumValue = string.mid(dot+1);
if (isIntProp) {
@@ -1192,16 +1204,15 @@ bool QQmlEnumTypeResolver::tryQualifiedEnumAssignment(const QmlIR::Object *obj,
bool ok;
int enumval = evaluateEnum(typeName.toString(), enumValue.toUtf8(), &ok);
if (ok) {
- binding->type = QV4::CompiledData::Binding::Type_Number;
- binding->value.d = (double)enumval;
- binding->flags |= QV4::CompiledData::Binding::IsResolvedEnum;
+ if (!assignEnumToBinding(binding, enumValue, enumval, isQtObject))
+ return false;
}
return true;
}
QQmlType *type = 0;
imports->resolveType(typeName, &type, 0, 0, 0);
- if (!type && typeName != QLatin1String("Qt"))
+ if (!type && !isQtObject)
return true;
int value = 0;
@@ -1234,10 +1245,7 @@ bool QQmlEnumTypeResolver::tryQualifiedEnumAssignment(const QmlIR::Object *obj,
if (!ok)
return true;
- binding->type = QV4::CompiledData::Binding::Type_Number;
- binding->value.d = (double)value;
- binding->flags |= QV4::CompiledData::Binding::IsResolvedEnum;
- return true;
+ return assignEnumToBinding(binding, enumValue, value, isQtObject);
}
int QQmlEnumTypeResolver::evaluateEnum(const QString &scope, const QByteArray &enumValue, bool *ok) const
@@ -2749,7 +2757,7 @@ bool QQmlJavaScriptBindingExpressionSimplificationPass::simplifyBinding(QV4::IR:
bool QQmlJavaScriptBindingExpressionSimplificationPass::detectTranslationCallAndConvertBinding(QmlIR::Binding *binding)
{
- if (*_nameOfFunctionCalled == QStringLiteral("qsTr")) {
+ if (*_nameOfFunctionCalled == QLatin1String("qsTr")) {
QString translation;
QV4::CompiledData::TranslationData translationData;
translationData.number = -1;
@@ -2791,7 +2799,7 @@ bool QQmlJavaScriptBindingExpressionSimplificationPass::detectTranslationCallAnd
binding->stringIndex = compiler->registerString(translation);
binding->value.translationData = translationData;
return true;
- } else if (*_nameOfFunctionCalled == QStringLiteral("qsTrId")) {
+ } else if (*_nameOfFunctionCalled == QLatin1String("qsTrId")) {
QString id;
QV4::CompiledData::TranslationData translationData;
translationData.number = -1;
@@ -2825,7 +2833,7 @@ bool QQmlJavaScriptBindingExpressionSimplificationPass::detectTranslationCallAnd
binding->stringIndex = compiler->registerString(id);
binding->value.translationData = translationData;
return true;
- } else if (*_nameOfFunctionCalled == QStringLiteral("QT_TR_NOOP") || *_nameOfFunctionCalled == QStringLiteral("QT_TRID_NOOP")) {
+ } else if (*_nameOfFunctionCalled == QLatin1String("QT_TR_NOOP") || *_nameOfFunctionCalled == QLatin1String("QT_TRID_NOOP")) {
QVector<int>::ConstIterator param = _functionParameters.constBegin();
QVector<int>::ConstIterator end = _functionParameters.constEnd();
if (param == end)
@@ -2842,7 +2850,7 @@ bool QQmlJavaScriptBindingExpressionSimplificationPass::detectTranslationCallAnd
binding->type = QV4::CompiledData::Binding::Type_String;
binding->stringIndex = compiler->registerString(*stringParam->value);
return true;
- } else if (*_nameOfFunctionCalled == QStringLiteral("QT_TRANSLATE_NOOP")) {
+ } else if (*_nameOfFunctionCalled == QLatin1String("QT_TRANSLATE_NOOP")) {
QVector<int>::ConstIterator param = _functionParameters.constBegin();
QVector<int>::ConstIterator end = _functionParameters.constEnd();
if (param == end)
diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h
index 3404350ece..240f591f91 100644
--- a/src/qml/compiler/qqmltypecompiler_p.h
+++ b/src/qml/compiler/qqmltypecompiler_p.h
@@ -196,6 +196,7 @@ public:
bool resolveEnumBindings();
private:
+ bool assignEnumToBinding(QmlIR::Binding *binding, const QString &enumName, int enumValue, bool isQtObject);
bool tryQualifiedEnumAssignment(const QmlIR::Object *obj, const QQmlPropertyCache *propertyCache,
const QQmlPropertyData *prop,
QmlIR::Binding *binding);
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp
index eab5b7fd2d..d08d2aafa2 100644
--- a/src/qml/compiler/qv4codegen.cpp
+++ b/src/qml/compiler/qv4codegen.cpp
@@ -115,7 +115,7 @@ void Codegen::ScanFunctions::checkDirectivePrologue(SourceElements *ast)
if (strLit->literalToken.length < 2)
continue;
QStringRef str = _sourceCode.midRef(strLit->literalToken.offset + 1, strLit->literalToken.length - 2);
- if (str == QStringLiteral("use strict")) {
+ if (str == QLatin1String("use strict")) {
_env->isStrict = true;
} else {
// TODO: give a warning.
@@ -148,7 +148,7 @@ void Codegen::ScanFunctions::checkName(const QStringRef &name, const SourceLocat
void Codegen::ScanFunctions::checkForArguments(AST::FormalParameterList *parameters)
{
while (parameters) {
- if (parameters->name == QStringLiteral("arguments"))
+ if (parameters->name == QLatin1String("arguments"))
_env->usesArgumentsObject = Environment::ArgumentsObjectNotUsed;
parameters = parameters->next;
}
@@ -170,7 +170,7 @@ bool Codegen::ScanFunctions::visit(CallExpression *ast)
{
if (! _env->hasDirectEval) {
if (IdentifierExpression *id = cast<IdentifierExpression *>(ast->base)) {
- if (id->name == QStringLiteral("eval")) {
+ if (id->name == QLatin1String("eval")) {
if (_env->usesArgumentsObject == Environment::ArgumentsObjectUnknown)
_env->usesArgumentsObject = Environment::ArgumentsObjectUsed;
_env->hasDirectEval = true;
@@ -241,7 +241,7 @@ bool Codegen::ScanFunctions::visit(ExpressionStatement *ast)
return false;
} else {
SourceLocation firstToken = ast->firstSourceLocation();
- if (_sourceCode.midRef(firstToken.offset, firstToken.length) == QStringLiteral("function")) {
+ if (_sourceCode.midRef(firstToken.offset, firstToken.length) == QLatin1String("function")) {
_cg->throwSyntaxError(firstToken, QStringLiteral("unexpected token"));
}
}
@@ -1441,7 +1441,7 @@ IR::Expr *Codegen::identifier(const QString &name, int line, int col)
Q_ASSERT (index < e->members.size());
if (index != -1) {
IR::ArgLocal *al = _block->LOCAL(index, scope);
- if (name == QStringLiteral("arguments") || name == QStringLiteral("eval"))
+ if (name == QLatin1String("arguments") || name == QLatin1String("eval"))
al->isArgumentsOrEval = true;
return al;
}
diff --git a/src/qml/compiler/qv4isel_p.cpp b/src/qml/compiler/qv4isel_p.cpp
index 49e7d5c66e..0ae08160ab 100644
--- a/src/qml/compiler/qv4isel_p.cpp
+++ b/src/qml/compiler/qv4isel_p.cpp
@@ -95,7 +95,7 @@ void IRDecoder::visitMove(IR::Move *s)
}
} else if (s->target->asTemp() || s->target->asArgLocal()) {
if (IR::Name *n = s->source->asName()) {
- if (n->id && *n->id == QStringLiteral("this")) // TODO: `this' should be a builtin.
+ if (n->id && *n->id == QLatin1String("this")) // TODO: `this' should be a builtin.
loadThisObject(s->target);
else if (n->builtin == IR::Name::builtin_qml_context)
loadQmlContext(s->target);
diff --git a/src/qml/compiler/qv4jsir.cpp b/src/qml/compiler/qv4jsir.cpp
index c2b6fa477b..4c87b7557e 100644
--- a/src/qml/compiler/qv4jsir.cpp
+++ b/src/qml/compiler/qv4jsir.cpp
@@ -1145,7 +1145,7 @@ void IRPrinter::visitRegExp(RegExp *e)
void IRPrinter::visitName(Name *e)
{
if (e->id) {
- if (*e->id != QStringLiteral("this"))
+ if (*e->id != QLatin1String("this"))
*out << '.';
*out << *e->id;
} else {
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp
index 0ff3b52870..7881ab951a 100644
--- a/src/qml/compiler/qv4ssa.cpp
+++ b/src/qml/compiler/qv4ssa.cpp
@@ -570,7 +570,7 @@ class DominatorTree
bucket[s].push_back(n);
link(p, n);
if (bucket.contains(p)) {
- foreach (BasicBlockIndex v, bucket[p]) {
+ for (BasicBlockIndex v : bucket[p]) {
BasicBlockIndex y = ancestorWithLowestSemi(v, worklist);
BasicBlockIndex semi_v = d->semi[v];
if (d->semi[y] == semi_v)
@@ -670,7 +670,7 @@ public:
foreach (BasicBlock *y, function->basicBlock(node)->out)
if (idom[y->index()] != node)
S.insert(y);
- foreach (BasicBlockIndex child, np.children) {
+ for (BasicBlockIndex child : np.children) {
const BasicBlockSet &ws = DF[child];
for (BasicBlockSet::const_iterator it = ws.begin(), eit = ws.end(); it != eit; ++it) {
BasicBlock *w = *it;
@@ -1733,7 +1733,7 @@ void convertToSSA(IR::Function *function, const DominatorTree &df, DefUses &defU
W.reserve(8);
// Place phi functions:
- foreach (const Temp &a, variables.allTemps()) {
+ for (const Temp &a : variables.allTemps()) {
if (a.isInvalid())
continue;
if (!variables.isNonLocal(a))
@@ -1791,7 +1791,7 @@ void cleanupPhis(DefUses &defUses)
std::vector<Phi *> allPhis;
allPhis.reserve(32);
- foreach (const Temp *def, defUses.defs()) {
+ for (const Temp *def : defUses.defs()) {
Stmt *defStmt = defUses.defStmt(*def);
if (!defStmt)
continue;
@@ -1808,7 +1808,7 @@ void cleanupPhis(DefUses &defUses)
toRemove |= collectedPhis;
}
- foreach (Phi *phi, allPhis) {
+ for (Phi *phi : allPhis) {
if (!toRemove.at(phi->id()))
continue;
@@ -2070,7 +2070,7 @@ protected:
return;
// TODO: maybe we can distinguish between built-ins of which we know that they do not have
// a side-effect.
- if (e->builtin == Name::builtin_invalid || (e->id && *e->id != QStringLiteral("this")))
+ if (e->builtin == Name::builtin_invalid || (e->id && *e->id != QLatin1String("this")))
markAsSideEffect();
}