aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2022-02-24 08:53:07 +0100
committerUlf Hermann <ulf.hermann@qt.io>2022-02-24 12:16:41 +0100
commita7925b9a7dc43661cd1d9835b91088142bf77816 (patch)
tree14665d262509b2f419fac945432cb2770cae88d5
parent57614680f760068c1db39888beba46944f409ff0 (diff)
QmlCompiler: Perform an actual conversion() in generate_MoveConst()
This allows us to convert to other types than the ones listed in the guesswork we do so far. It also clarifies the meaning of that inconspicuous '=' used to assign to the out accumulator. Change-Id: I041145ab451f5e8b44ae529a66414251b81fe072 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/qmlcompiler/qqmljscodegenerator.cpp44
1 files changed, 17 insertions, 27 deletions
diff --git a/src/qmlcompiler/qqmljscodegenerator.cpp b/src/qmlcompiler/qqmljscodegenerator.cpp
index 1271372818..7aee1ab562 100644
--- a/src/qmlcompiler/qqmljscodegenerator.cpp
+++ b/src/qmlcompiler/qqmljscodegenerator.cpp
@@ -531,35 +531,25 @@ void QQmlJSCodeGenerator::generate_MoveConst(int constIndex, int destTemp)
const auto v4Value = QV4::StaticValue::fromReturnedValue(
m_jsUnitGenerator->constant(constIndex));
- if (v4Value.isNull()) {
- const auto changed = m_state.changedRegister();
- m_body += var + u" = "_qs;
- if (m_typeResolver->registerIsStoredIn(changed, m_typeResolver->jsPrimitiveType())) {
- m_body += u"QJSPrimitiveNull()"_qs;
- } else if (m_typeResolver->registerIsStoredIn(changed, m_typeResolver->jsValueType())) {
- m_body += u"QJSValue(QJSValue::NullValue)"_qs;
- } else if (m_typeResolver->registerIsStoredIn(changed, m_typeResolver->varType())) {
- m_body += u"QVariant::fromValue<std::nullptr_t>(nullptr)"_qs;
- } else if (changed.storedType()->accessSemantics()
- == QQmlJSScope::AccessSemantics::Reference) {
- m_body += u"nullptr"_qs;
- } else {
- setError(u"Cannot load null into %1"_qs.arg(changed.descriptiveName()));
- }
+ const auto changed = m_state.changedRegister().storedType();
- m_body += u";\n"_qs;
- return;
+ m_body += var + u" = "_qs;
+ if (v4Value.isNull()) {
+ m_body += conversion(m_typeResolver->nullType(), changed, QString());
+ } else if (v4Value.isUndefined()) {
+ m_body += conversion(m_typeResolver->voidType(), changed, QString());
+ } else if (v4Value.isBoolean()) {
+ m_body += conversion(m_typeResolver->boolType(), changed,
+ v4Value.booleanValue() ? u"true"_qs : u"false"_qs);
+ } else if (v4Value.isInteger()) {
+ m_body += conversion(m_typeResolver->intType(), changed,
+ QString::number(v4Value.int_32()));
+ } else if (v4Value.isDouble()) {
+ m_body += conversion(m_typeResolver->realType(), changed,
+ toNumericString(v4Value.doubleValue()));
+ } else {
+ reject(u"unknown const type"_qs);
}
-
- double value = 0.0f;
- if (v4Value.isInteger() || v4Value.isBoolean())
- value = v4Value.int_32();
- else if (v4Value.isDouble())
- value = v4Value.doubleValue();
-
- m_body += var;
- m_body += u" = "_qs;
- m_body += toNumericString(value);
m_body += u";\n"_qs;
}