diff options
Diffstat (limited to 'src/qml/compiler')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 4 | ||||
-rw-r--r-- | src/qml/compiler/qqmlpropertyvalidator.cpp | 36 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler.cpp | 8 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler_p.h | 1 | ||||
-rw-r--r-- | src/qml/compiler/qv4compileddata.cpp | 10 | ||||
-rw-r--r-- | src/qml/compiler/qv4compileddata_p.h | 21 |
6 files changed, 40 insertions, 40 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index 0461299866..1f6a702e4a 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -1069,7 +1069,7 @@ void IRBuilder::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST binding->value.b = false; } else if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(expr)) { binding->type = QV4::CompiledData::Binding::Type_Number; - binding->setNumberValueInternal(lit->value); + binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(lit->value)); } else if (QQmlJS::AST::CallExpression *call = QQmlJS::AST::cast<QQmlJS::AST::CallExpression *>(expr)) { if (QQmlJS::AST::IdentifierExpression *base = QQmlJS::AST::cast<QQmlJS::AST::IdentifierExpression *>(call->base)) { tryGeneratingTranslationBinding(base->name, call->arguments, binding); @@ -1081,7 +1081,7 @@ void IRBuilder::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST } else if (QQmlJS::AST::UnaryMinusExpression *unaryMinus = QQmlJS::AST::cast<QQmlJS::AST::UnaryMinusExpression *>(expr)) { if (QQmlJS::AST::NumericLiteral *lit = QQmlJS::AST::cast<QQmlJS::AST::NumericLiteral *>(unaryMinus->expression)) { binding->type = QV4::CompiledData::Binding::Type_Number; - binding->setNumberValueInternal(-lit->value); + binding->value.constantValueIndex = jsGenerator->registerConstant(QV4::Encode(-lit->value)); } } } diff --git a/src/qml/compiler/qqmlpropertyvalidator.cpp b/src/qml/compiler/qqmlpropertyvalidator.cpp index 7ae88cf80c..99bd525d47 100644 --- a/src/qml/compiler/qqmlpropertyvalidator.cpp +++ b/src/qml/compiler/qqmlpropertyvalidator.cpp @@ -333,7 +333,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache if (binding->flags & QV4::CompiledData::Binding::IsResolvedEnum) return noError; - QString value = binding->valueAsString(qmlUnit); + QString value = binding->valueAsString(compilationUnit.data()); QMetaProperty p = propertyCache->firstCppMetaObject()->property(property->coreIndex()); bool ok; if (p.isFlagType()) { @@ -376,7 +376,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::UInt: { if (binding->type == QV4::CompiledData::Binding::Type_Number) { - double d = binding->valueAsNumber(); + double d = binding->valueAsNumber(compilationUnit->constants); if (double(uint(d)) == d) return noError; } @@ -385,7 +385,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::Int: { if (binding->type == QV4::CompiledData::Binding::Type_Number) { - double d = binding->valueAsNumber(); + double d = binding->valueAsNumber(compilationUnit->constants); if (double(int(d)) == d) return noError; } @@ -406,7 +406,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::Color: { bool ok = false; - QQmlStringConverters::rgbaFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::rgbaFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: color expected")); } @@ -415,7 +415,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache #if QT_CONFIG(datestring) case QVariant::Date: { bool ok = false; - QQmlStringConverters::dateFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::dateFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: date expected")); } @@ -423,7 +423,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::Time: { bool ok = false; - QQmlStringConverters::timeFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::timeFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: time expected")); } @@ -431,7 +431,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::DateTime: { bool ok = false; - QQmlStringConverters::dateTimeFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::dateTimeFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: datetime expected")); } @@ -440,7 +440,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache #endif // datestring case QVariant::Point: { bool ok = false; - QQmlStringConverters::pointFFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::pointFFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: point expected")); } @@ -448,7 +448,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::PointF: { bool ok = false; - QQmlStringConverters::pointFFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::pointFFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: point expected")); } @@ -456,7 +456,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::Size: { bool ok = false; - QQmlStringConverters::sizeFFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::sizeFFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: size expected")); } @@ -464,7 +464,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::SizeF: { bool ok = false; - QQmlStringConverters::sizeFFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::sizeFFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: size expected")); } @@ -472,7 +472,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::Rect: { bool ok = false; - QQmlStringConverters::rectFFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::rectFFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: rect expected")); } @@ -480,7 +480,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache break; case QVariant::RectF: { bool ok = false; - QQmlStringConverters::rectFFromString(binding->valueAsString(qmlUnit), &ok); + QQmlStringConverters::rectFFromString(binding->valueAsString(compilationUnit.data()), &ok); if (!ok) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: point expected")); } @@ -497,7 +497,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache float xp; float yp; } vec; - if (!QQmlStringConverters::createFromString(QMetaType::QVector2D, binding->valueAsString(qmlUnit), &vec, sizeof(vec))) { + if (!QQmlStringConverters::createFromString(QMetaType::QVector2D, binding->valueAsString(compilationUnit.data()), &vec, sizeof(vec))) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: 2D vector expected")); } } @@ -508,7 +508,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache float yp; float zy; } vec; - if (!QQmlStringConverters::createFromString(QMetaType::QVector3D, binding->valueAsString(qmlUnit), &vec, sizeof(vec))) { + if (!QQmlStringConverters::createFromString(QMetaType::QVector3D, binding->valueAsString(compilationUnit.data()), &vec, sizeof(vec))) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: 3D vector expected")); } } @@ -520,7 +520,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache float zy; float wp; } vec; - if (!QQmlStringConverters::createFromString(QMetaType::QVector4D, binding->valueAsString(qmlUnit), &vec, sizeof(vec))) { + if (!QQmlStringConverters::createFromString(QMetaType::QVector4D, binding->valueAsString(compilationUnit.data()), &vec, sizeof(vec))) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: 4D vector expected")); } } @@ -532,7 +532,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache float yp; float zp; } vec; - if (!QQmlStringConverters::createFromString(QMetaType::QQuaternion, binding->valueAsString(qmlUnit), &vec, sizeof(vec))) { + if (!QQmlStringConverters::createFromString(QMetaType::QQuaternion, binding->valueAsString(compilationUnit.data()), &vec, sizeof(vec))) { return QQmlCompileError(binding->valueLocation, tr("Invalid property assignment: quaternion expected")); } } @@ -549,7 +549,7 @@ QQmlCompileError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache } else if (property->propType() == qMetaTypeId<QList<int> >()) { bool ok = (binding->type == QV4::CompiledData::Binding::Type_Number); if (ok) { - double n = binding->valueAsNumber(); + double n = binding->valueAsNumber(compilationUnit->constants); if (double(int(n)) != n) ok = false; } diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 6582a9ca6b..a6bdf93e2e 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -207,6 +207,11 @@ int QQmlTypeCompiler::registerString(const QString &str) return document->jsGenerator.registerString(str); } +int QQmlTypeCompiler::registerConstant(QV4::ReturnedValue v) +{ + return document->jsGenerator.registerConstant(v); +} + const QV4::CompiledData::Unit *QQmlTypeCompiler::qmlUnit() const { return document->javaScriptCompilationUnit->unitData(); @@ -555,7 +560,8 @@ bool QQmlEnumTypeResolver::assignEnumToBinding(QmlIR::Binding *binding, const QS COMPILE_EXCEPTION(binding, tr("Invalid property assignment: Enum value \"%1\" cannot start with a lowercase letter").arg(enumName.toString())); } binding->type = QV4::CompiledData::Binding::Type_Number; - binding->setNumberValueInternal((double)enumValue); + binding->value.constantValueIndex = compiler->registerConstant(QV4::Encode((double)enumValue)); +// binding->setNumberValueInternal((double)enumValue); binding->flags |= QV4::CompiledData::Binding::IsResolvedEnum; return true; } diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h index 537f87ab4c..ffe04eb090 100644 --- a/src/qml/compiler/qqmltypecompiler_p.h +++ b/src/qml/compiler/qqmltypecompiler_p.h @@ -100,6 +100,7 @@ public: void recordError(const QQmlCompileError &error); int registerString(const QString &str); + int registerConstant(QV4::ReturnedValue v); const QV4::CompiledData::Unit *qmlUnit() const; diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index a4c7c98642..3e3859d9fb 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -588,7 +588,8 @@ void CompilationUnit::setUnitData(const Unit *unitData) #endif } -QString Binding::valueAsString(const Unit *unit) const +#ifndef V4_BOOTSTRAP +QString Binding::valueAsString(const CompilationUnit *unit) const { switch (type) { case Type_Script: @@ -597,7 +598,7 @@ QString Binding::valueAsString(const Unit *unit) const case Type_Boolean: return value.b ? QStringLiteral("true") : QStringLiteral("false"); case Type_Number: - return QString::number(valueAsNumber()); + return QString::number(valueAsNumber(unit->constants)); case Type_Invalid: return QString(); #if !QT_CONFIG(translation) @@ -611,7 +612,7 @@ QString Binding::valueAsString(const Unit *unit) const } case Type_Translation: { // This code must match that in the qsTr() implementation - const QString &path = unit->stringAt(unit->sourceFileIndex); + const QString &path = unit->stringAt(unit->data->sourceFileIndex); int lastSlash = path.lastIndexOf(QLatin1Char('/')); QStringRef context = (lastSlash > -1) ? path.midRef(lastSlash + 1, path.length() - lastSlash - 5) : QStringRef(); @@ -671,7 +672,7 @@ QString Binding::escapedString(const QString &string) return tmp; } -QString Binding::valueAsScriptString(const Unit *unit) const +QString Binding::valueAsScriptString(const CompilationUnit *unit) const { if (type == Type_String) return escapedString(unit->stringAt(stringIndex)); @@ -679,7 +680,6 @@ QString Binding::valueAsScriptString(const Unit *unit) const return valueAsString(unit); } -#ifndef V4_BOOTSTRAP /*! Returns the property cache, if one alread exists. The cache is not referenced. */ diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 31e83e8f76..7bbc4d2835 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -404,7 +404,7 @@ struct Q_QML_PRIVATE_EXPORT Binding }; union { bool b; - quint64 doubleValue; // do not access directly, needs endian protected access + quint32_le constantValueIndex; quint32_le compiledScriptIndex; // used when Type_Script quint32_le objectIndex; TranslationData translationData; // used when Type_Translation @@ -470,22 +470,15 @@ struct Q_QML_PRIVATE_EXPORT Binding bool isTranslationBinding() const { return type == Type_Translation || type == Type_TranslationById; } bool evaluatesToString() const { return type == Type_String || isTranslationBinding(); } - QString valueAsString(const Unit *unit) const; - QString valueAsScriptString(const Unit *unit) const; - double valueAsNumber() const +#ifndef V4_BOOTSTRAP + QString valueAsString(const CompilationUnit *unit) const; + QString valueAsScriptString(const CompilationUnit *unit) const; +#endif + double valueAsNumber(const Value *constantTable) const { if (type != Type_Number) return 0.0; - quint64 intval = qFromLittleEndian<quint64>(value.doubleValue); - double d; - memcpy(&d, &intval, sizeof(double)); - return d; - } - void setNumberValueInternal(double d) - { - quint64 intval; - memcpy(&intval, &d, sizeof(double)); - value.doubleValue = qToLittleEndian<quint64>(intval); + return constantTable[value.constantValueIndex].doubleValue(); } bool valueAsBoolean() const |