aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljscodegenerator.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2022-02-24 16:36:14 +0100
committerUlf Hermann <ulf.hermann@qt.io>2022-03-02 09:03:32 +0100
commitdddd6a66ddd77d3887c52cb145e7e14b8fb542b9 (patch)
tree8f2dd9bac92cee21c6cca24b5fc38bbaaa2ed004 /src/qmlcompiler/qqmljscodegenerator.cpp
parente88318802d9b1a9d23b50c515dad5e756ea98317 (diff)
QmlCompiler: Optimize some more type conversions
Some of those make the compiled code slower than the interpreted code. That is bad enough of a bug to pick it back to 6.2. Pick-to: 6.2 6.3 Fixes: QTBUG-100847 Change-Id: I823ff688d3aead364e21ae1e90e16a4bfaedb1f5 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmlcompiler/qqmljscodegenerator.cpp')
-rw-r--r--src/qmlcompiler/qqmljscodegenerator.cpp57
1 files changed, 45 insertions, 12 deletions
diff --git a/src/qmlcompiler/qqmljscodegenerator.cpp b/src/qmlcompiler/qqmljscodegenerator.cpp
index dba0ec82b2..7a87bd952b 100644
--- a/src/qmlcompiler/qqmljscodegenerator.cpp
+++ b/src/qmlcompiler/qqmljscodegenerator.cpp
@@ -83,8 +83,13 @@ QString QQmlJSCodeGenerator::metaTypeFromName(const QQmlJSScope::ConstPtr &type)
QString QQmlJSCodeGenerator::metaObject(const QQmlJSScope::ConstPtr &objectType)
{
- if (!objectType->isComposite())
+ if (!objectType->isComposite()) {
+ if (objectType->internalName() == u"QtObject"_qs
+ || objectType->internalName() == u"QQmlComponent"_qs) {
+ return metaTypeFromType(objectType) + u".metaObject()"_qs;
+ }
return metaTypeFromName(objectType) + u".metaObject()"_qs;
+ }
reject(u"retrieving the metaObject of a composite type without using an instance."_qs);
return QString();
@@ -376,10 +381,8 @@ void QQmlJSCodeGenerator::eliminateDeadStores()
QString QQmlJSCodeGenerator::errorReturnValue()
{
- if (m_function->returnType) {
- return conversion(m_typeResolver->jsPrimitiveType(), m_function->returnType,
- u"QJSPrimitiveValue(QJSPrimitiveUndefined())"_qs);
- }
+ if (m_function->returnType)
+ return conversion(m_typeResolver->voidType(), m_function->returnType, QString());
return QString();
}
@@ -2553,12 +2556,6 @@ QString QQmlJSCodeGenerator::conversion(const QQmlJSScope::ConstPtr &from,
if (m_typeResolver->equals(from, m_typeResolver->voidType())) {
if (to->accessSemantics() == QQmlJSScope::AccessSemantics::Reference)
return u"static_cast<"_qs + to->internalName() + u" *>(nullptr)"_qs;
- if (m_typeResolver->equals(to, jsValueType))
- return u"QJSValue()"_qs;
- if (m_typeResolver->equals(to, jsPrimitiveType))
- return u"QJSPrimitiveValue()"_qs;
- if (m_typeResolver->equals(to, varType))
- return u"QVariant()"_qs;
const QString zero = zeroBoolOrNumeric(to);
if (!zero.isEmpty())
return zero;
@@ -2566,7 +2563,8 @@ QString QQmlJSCodeGenerator::conversion(const QQmlJSScope::ConstPtr &from,
return QQmlJSUtils::toLiteral(u"undefined"_qs);
if (m_typeResolver->equals(from, to))
return QString();
- reject(u"Conversion from void to %1"_qs.arg(to->internalName()));
+ // Anything else is just the default constructed type.
+ return to->augmentedInternalName() + u"()"_qs;
}
if (m_typeResolver->equals(from, m_typeResolver->nullType())) {
@@ -2680,6 +2678,41 @@ QString QQmlJSCodeGenerator::conversion(const QQmlJSScope::ConstPtr &from,
if (m_typeResolver->equals(to, varType))
return u"QVariant::fromValue("_qs + variable + u')';
+ if (m_typeResolver->equals(from, m_typeResolver->urlType())
+ && m_typeResolver->equals(to, m_typeResolver->stringType())) {
+ return variable + u".toString()"_qs;
+ }
+
+ if (m_typeResolver->equals(from, m_typeResolver->stringType())
+ && m_typeResolver->equals(to, m_typeResolver->urlType())) {
+ return u"QUrl("_qs + variable + u')';
+ }
+
+ const auto retrieveFromPrimitive = [&](const QQmlJSScope::ConstPtr &type)
+ {
+ if (m_typeResolver->equals(type, m_typeResolver->boolType()))
+ return u".toBool()"_qs;
+ if (m_typeResolver->equals(type, m_typeResolver->intType()))
+ return u".toInteger()"_qs;
+ if (m_typeResolver->equals(type, m_typeResolver->realType()))
+ return u".toDouble()"_qs;
+ if (m_typeResolver->equals(type, m_typeResolver->stringType()))
+ return u".toString()"_qs;
+ return QString();
+ };
+
+ const auto fitsIntoPrimitive = [&](const QQmlJSScope::ConstPtr &type)
+ {
+ return !retrieveFromPrimitive(type).isEmpty()
+ || m_typeResolver->equals(type, m_typeResolver->floatType());
+ };
+
+ if (fitsIntoPrimitive(from)) {
+ const QString retrieve = retrieveFromPrimitive(to);
+ if (!retrieve.isEmpty())
+ return u"QJSPrimitiveValue("_qs + variable + u')' + retrieve;
+ }
+
// TODO: more efficient string conversions, possibly others
return u"aotContext->engine->fromScriptValue<"_qs + castTargetName(to)