summaryrefslogtreecommitdiff
path: root/tests/auto/qml/qmlcppcodegen
Commit message (Collapse)AuthorAgeFilesLines
...
* QmlCompiler: Test that infinities cleanly cast to intUlf Hermann2022-12-233-0/+29
| | | | | | | Task-number: QTBUG-108820 Change-Id: I984f6f35ffd32ca9adae31e56010d10c683e5615 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* QmlCompiler: Fix recognition of builtin list typesUlf Hermann2022-12-151-0/+7
| | | | | | | | | | | | | Previously all list types used as arguments or return types for methods had to be looked up via the imports. However, builtin types are not part of the imports at run time. Therefore, recognize list types already early on, when generating the IR. This is the same way we do it for property types and it allows us to easily identify lists of builtins. Pick-to: 6.5 Fixes: QTBUG-109147 Change-Id: I91fa9c8fc99c1e0155cc5db5faddd928ca7fabbc Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Fix wrapping of numbers in QJSPrimitiveValueUlf Hermann2022-12-154-0/+148
| | | | | | | | | | | | | | | | | | We need to explicitly cast to double if we are wrapping a number type that's not natively accepted by the ctors. As a side effect, correctly run conversions from generic QVariant to QJSPrimitiveValue through the engine now. For that we need another clause in metaTypeFromJS(). Since we are calling methods that return list types in the test, we need to add another clause that converts JS arrays to list types. Otherwise we cannot run that test in interpreted mode. Pick-to: 6.5 6.2 6.4 6.4.2 Task-number: QTBUG-109111 Change-Id: I87f7aafd24371d2c1ffe85569e1f2cd3a1979742 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Mark StoreElement on JS values has having side effectsUlf Hermann2022-12-153-0/+23
| | | | | | | | | | A StoreElement on a JS value can do pretty much anything you can imagine, after all. Pick-to: 6.5 6.4 6.4.2 Fixes: QTBUG-109196 Change-Id: Ic638d94b55e6340eb9fe56abc663a6f0f2277f5e Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QQmlJSCodeGenerator: fix nullptr dereferenceFabian Kosmale2022-12-125-0/+84
| | | | | | | | | | | | | If we try to lookup the length of a generic QVariant, we fail, and so far crashed. We should ideally detect that we are dealing with an array (and thus length is a known, available property), but for now simply reject compilation to C++. Pick-to: 6.4 Fixes: QTBUG-109164 Change-Id: I9d4149ac09a351754d012dbc829774413d6b32eb Reviewed-by: Semih Yavuz <semih.yavuz@qt.io> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* QML: Unify postprocessing of importsUlf Hermann2022-12-075-0/+44
| | | | | | | | | | | We want to always import dependencies, always import qualified scripts, and always try to load C++-based types from the binary. Furthermore, directory imports should be imported with their qmldir URI where possible, so that we can find them when loading local C++-based types. Fixes: QTBUG-109109 Change-Id: I58f08f479623a886c802035b41f5f604338468b5 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Ignore cloned signals when analyzing signal handlersUlf Hermann2022-12-074-1/+28
| | | | | | | | | We obviously want to see the defaulted parameters when generating the handlers. Fixes: QTBUG-108762 Change-Id: I33a52bac305238467d45650bf8a2ad59d40e366f Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Fix comparison AOT-lookup and intended type in value typesSemih Yavuz2022-12-054-0/+57
| | | | | | | | | | | | We currently force the lookup metatype to be exactly the same data type with the caller's. As a result, the conversion from enum to integral data type is not recognized. Relax this comparison by using isTypeCompatible helper. Pick-to: 6.4 Fixes: QTBUG-109007 Change-Id: I188dc3e6c1fd7100e9ed5c4ba5d0c90d85d79be4 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Fix various kinds of enum lookupUlf Hermann2022-12-024-0/+90
| | | | | | | | | | | | | | | | | * If we got an object type exposed as namespace, we still need to add the "*" to get its augmentedInternalName(). Otherwise we cannot get its metaobject, needed to look up enums. * Enums cannot be shadowed. The shadow check will produce garbage if we try to check because an enum lookup also does not use the accumulator, which then contains some artifact from a previous operation. * If we find a property lookup on a plain QMetaObject* we have to immediately return in order to not confuse it with attached properties. Pick-to: 6.4 6.2 Fixes: QTBUG-109048 Change-Id: If9e3b4806e4d773de9cf48f1b3750b684a8c8f69 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* qmltyperegistrar: Generate accessSemantics="none" for foreign namespacesUlf Hermann2022-11-294-1/+26
| | | | | | | | | | | | If the local type is a namespace, the resulting type can only be a namespace, too, no matter what kind of tag the foreign one has. Furthermore, we can re-use types with other QML_* tags this way. Task-number: QTBUG-108883 Change-Id: Ib2ae08d5b081b8faa35124314f97d406d7b4f76f Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Store imported types in a QListUlf Hermann2022-11-254-0/+74
| | | | | | | | | | | | | | | The same type can be exported multiple times with different attributes, even in the same module. This requires us to fix directory imports as qmllint otherwise complains about SegFault.bad.qml and SegFault.qml being the same type (which they obviously aren't). Task-number: QTCREATORBUG-27590 Change-Id: I295d927b9a07acbb715055a6883ac44b50129c2d Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* QmlCompiler: Implement console logging methodsUlf Hermann2022-11-234-0/+71
| | | | | | | | | | | We provide semi-private functions in the AOT context for this. Since we cannot know the complete run time type of the potential logging category at compile time, we have to check any first argument that might be one separately. Fixes: QTBUG-107175 Change-Id: I46a8922b1c5c16d2b450b8728d650d31dfd867e3 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Fix comparison of null and undefinedUlf Hermann2022-11-233-0/+43
| | | | | | | | | | | | Those are not stored. If we compare null to null or undefined to undefined, we do not have to generate a comparison at all. the result is statically known. Pick-to: 6.4 Fixes: QTBUG-108634 Change-Id: I6a5323c2e0c023838609aec90d7ecc15b885dc08 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Don't crash on CallWithSpreadUlf Hermann2022-11-223-0/+21
| | | | | | | | | | | | | When preparing for such a call, the byte code loads an "empty" constant. This has to be represented in the type system so that we don't hit the assert at the end of the instruction. Pick-to: 6.4 6.2 Task-number: QTBUG-108441 Change-Id: I66220bfae3d3a4b8e9600d84d4cfc43ac858b77e Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Remove signal index mismatch in aot-compiled codeSami Shalayel2022-11-153-0/+65
| | | | | | | | | | | | | | | | | | | | | There are multiple types of signal indexes, one of them belongs to QMetaMethod::signalIndex and another one to QObjectPrivate::signalIndex. Stop mixing them up in aot-compiled code when capturing properties as this leads to weird and hard to debug bugs. Add a smaller version of the drag and drop example as test to make sure that the bug does not appear again, without any visual elements. Fixes: QTBUG-104047 Fixes: QTBUG-104716 Pick-to: 6.4 6.2 Change-Id: I4f64ba237e824ff0ba1624c29ddcf5371d03d69e Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QML: Fix the most blatant TDZ violationsUlf Hermann2022-11-141-0/+6
| | | | | | | | | | | When reading a let or const register before its declaration we can be sure this is invalid. Task-number: QTBUG-108362 Fixes: QTBUG-77428 Change-Id: I7e8f8b46079860f00c051c1a91f773dc8cdd5595 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Ignore InitializeDeadTemporalZone instructionUlf Hermann2022-11-114-0/+34
| | | | | | | | | We don't discern between empty and undefined values in the compiler. Fixes: QTBUG-104192 Change-Id: Ida06386433ef9e8f9a7cba4bec99ba8e77edc324 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Allow lists as arguments to methodsUlf Hermann2022-11-103-0/+50
| | | | | | | | | | | | | | | | | | | Since lists are allowed as property types, you should be able to pass them as arguments to methods, too. For now we only handle QML-defined methods, implemented by adding JavaScript functions to your QML elements. The usual type coercion rules apply if you pass JavaScript arrays to such methods. That is, it usually works. We now resolve properties with the "list" flag to their actual types (QQmlListProperty or QList) already when populating the QQmlJSScope, and store the list types as members of QQmlJSScope rather than as a special map in QQmlJSTypeResolver. This allows us to do the same to lists passed as arguments and simplifies some of the type analysis. Fixes: QTBUG-107171 Change-Id: Idf71ccdc1d59f472c17084a36b5d7879c4d959c0 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Port to new Q_UNREACHABLE_RETURN()Marc Mutz2022-10-201-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a semantic patch using ClangTidyTransformator to convert sequences of Q_UNREACHABLE() + return into Q_UNREACHABLE_RETURN(), newly added to qtbase. const std::string unr = "unr", val = "val", ret = "ret"; auto makeUnreachableReturn = cat("Q_UNREACHABLE_RETURN(", ifBound(val, cat(node(val)), cat("")), ")"); auto ignoringSwitchCases = [](auto stmt) { return anyOf(stmt, switchCase(subStmt(stmt))); }; makeRule(stmt(ignoringSwitchCases(stmt(isExpandedFromMacro("Q_UNREACHABLE")).bind(unr)), nextStmt(returnStmt(optionally(hasReturnValue(expr().bind(val)))).bind(ret))), {changeTo(node(unr), cat(makeUnreachableReturn, ";")), // TODO: why is the ; lost w/o this? changeTo(node(ret), cat(""))}, cat("use ", makeUnreachableReturn)); a.k.a qt-use-unreachable-return. subStmt() and nextStmt() are non-standard matchers. There was one false positive, suppressed it with NOLINTNEXTLINE. It's not really a false positiive, it's just that Clang sees the world in one way and if conditonal compilation (#if) differs for other compilers, Clang doesn't know better. This is an artifact of matching two consecutive statements. Change-Id: I3855b2dc8523db1ea860f72ad9818738162495c6 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Add option to enforce function signaturesUlf Hermann2022-10-144-0/+72
| | | | | | | | | | | | | | | | | | | | | By default, the QML engine does not enforce signatures given as type annotations to functions. By passing different types than the function declares, you can get different behavior between the interpreter/JIT and the AOT-compiled code. In addition, in interpreted or JIT'ed mode, we pass all non-primitive value types as references. This means, if you modify them within the called function, the modifications are propagated back to the place where the value was loaded from. Enforcing the signature prevents all of this, at a run time cost. Since we have to coerce all arguments to the desired types, the function call overhead grows. This change introduces a pragma "FunctionSignatureBehavior" which you can set to "Ignored" or "Enforced" to choose one way or the other as universal way of handling type annotations. Fixes: QTBUG-106819 Change-Id: I50e9b2bd6702907da44974cd9e05b48a96bb609e Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Port from container::count() and length() to size() - V5Marc Mutz2022-10-131-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a semantic patch using ClangTidyTransformator as in qtbase/df9d882d41b741fef7c5beeddb0abe9d904443d8, but extended to handle typedefs and accesses through pointers, too: const std::string o = "object"; auto hasTypeIgnoringPointer = [](auto type) { return anyOf(hasType(type), hasType(pointsTo(type))); }; auto derivedFromAnyOfClasses = [&](ArrayRef<StringRef> classes) { auto exprOfDeclaredType = [&](auto decl) { return expr(hasTypeIgnoringPointer(hasUnqualifiedDesugaredType(recordType(hasDeclaration(decl))))).bind(o); }; return exprOfDeclaredType(cxxRecordDecl(isSameOrDerivedFrom(hasAnyName(classes)))); }; auto renameMethod = [&] (ArrayRef<StringRef> classes, StringRef from, StringRef to) { return makeRule(cxxMemberCallExpr(on(derivedFromAnyOfClasses(classes)), callee(cxxMethodDecl(hasName(from), parameterCountIs(0)))), changeTo(cat(access(o, cat(to)), "()")), cat("use '", to, "' instead of '", from, "'")); }; renameMethod(<classes>, "count", "size"); renameMethod(<classes>, "length", "size"); except that on() was replaced with a matcher that doesn't ignoreParens(). a.k.a qt-port-to-std-compatible-api V5 with config Scope: 'Container'. Change-Id: I58e1b41b91c34d2e860dbb5847b3752edbfc6fc9 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Properly check contained type for enumsUlf Hermann2022-10-123-0/+22
| | | | | | | | | | | | | | | In case of an enum the actual contained type is the one the enum dictates. This brings registerContains() in line with containedType() and makes it possible to match previously discovered types on subsequent passes of the type propagator. Therefore, it avoids infinite loops where the same types would be tracked over and over. Pick-to: 6.4 Fixes: QTBUG-107176 Fixes: QTBUG-107542 Change-Id: I4b8d66b157d0ec0ece4ca345cb99a630b8898a1b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Port from container::count() and length() to size()Marc Mutz2022-10-072-7/+7
| | | | | | | | | | | | | | | | | | | | This is a semantic patch using ClangTidyTransformator as in qtbase/df9d882d41b741fef7c5beeddb0abe9d904443d8: auto QtContainerClass = anyOf( expr(hasType(cxxRecordDecl(isSameOrDerivedFrom(hasAnyName(classes))))).bind(o), expr(hasType(namedDecl(hasAnyName(<classes>)))).bind(o)); makeRule(cxxMemberCallExpr(on(QtContainerClass), callee(cxxMethodDecl(hasAnyName({"count", "length"), parameterCountIs(0))))), changeTo(cat(access(o, cat("size"), "()"))), cat("use 'size()' instead of 'count()/length()'")) a.k.a qt-port-to-std-compatible-api with config Scope: 'Container', with the extended set of container classes recognized. Change-Id: Idb1f75dfe2323bd1d9e8b4d58d54f1b4b80c7ed7 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Do not crash on version-mismatched property accessUlf Hermann2022-10-064-1/+27
| | | | | | | | | | | If we cannot access a property due to a version mismatch, that's not an unqualified access. Pick-to: 6.4 Fixes: QTBUG-107080 Change-Id: I1780b171928df437a2121601f1aac829dbe1e994 Reviewed-by: Semih Yavuz <semih.yavuz@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* V4: Use an enum to categorize functions and rename aotFunctionUlf Hermann2022-09-291-1/+1
| | | | | | | | We want to use the aotFunction member also for typed JavaScript functions. Change-Id: Iad6d12ebed3ad3069832484137ed8e4d9e7a7cf4 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Extend hack to pass QML types through QMetaObject::invokeMethod()Ulf Hermann2022-09-131-2/+23
| | | | | | | | We now actually need a valid metatype. Task-number: QTBUG-106194 Change-Id: Idfc41cae4216e30058f797b08863c350f473ba55 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Change the license of all CMakeLists.txt and *.cmake files to BSDLucie Gérard2022-09-072-2/+2
| | | | | | | Task-number: QTBUG-105718 Change-Id: Id89ed14990804a5024183e75382cc539d4293da1 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* QmlCompiler: Prevent lookup of value type where we need an object typeUlf Hermann2022-08-303-0/+28
| | | | | | | | | | | | | | | | | With a particular nefarious combination of Q_GADGET and inheritance from QObject you can make QmlCompiler believe a type is a value type even though it is actually an object type. We never want to touch such a thing. There was a safe guard against this when looking up the type from the scope, but by putting it in a type namespace you could circumvent it. Refactor the code to apply to both cases the same way. Pick-to: 6.2 6.3 6.4 Fixes: QTBUG-104556 Fixes: QTBUG-105608 Change-Id: I8a690e2b6f78fcaba0911a93504cde0d2c7dde0d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Implement remaining operatorsUlf Hermann2022-08-294-36/+469
| | | | | | | | | | | | | Some of the math operators were still missing. Add them and test them all. Since the "runInterpreted()" test function takes too long now, split the qmlcppcodegen test in two: One that runs in compiled mode and one that runs in interpreted mode. Fixes: QTBUG-105188 Change-Id: I4b641d5e51b5a7e2a9254be40f257d7b249deb13 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_QmlCppCodegen: don't use QGenericArgument directlyThiago Macieira2022-08-041-3/+9
| | | | | | | | | | Just create a dummy type that has the actual name. To make that possible, export the property cache creator's class counter to the autotests – otherwise, we cannot know the name of the actual type, as it would depend on the order in which the tests run. Change-Id: I36b24183fbd041179f2ffffd17026b224c9737fa Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Allow any conversion possible via QJSPrimitiveValueUlf Hermann2022-08-033-0/+21
| | | | | | | | | | | | All of those are legal in ECMAScript, and so we need to support them in script bindings. As we have stricter rules for literal bindings, add an extra method there to check for what QQmlPropertyValidator does. Pick-to: 6.4 Fixes: QTBUG-105252 Task-number: QTBUG-105188 Change-Id: I0621b2c3aa196414f669873e93670557284a8bca Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QQmlListAccessor: Accept QQmlListPropertyUlf Hermann2022-07-263-0/+29
| | | | | | | | | | | So far we have only accepted QQmlListReference. However, we can also pass a QQmlListProperty around as value. Pick-to: 6.2 6.3 6.4 Fixes: QTBUG-105137 Change-Id: I7d4cd3048b62594298f91013c4cda5ec864a28df Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
* QmlCompiler: Support conversions between QString and QByteArrayUlf Hermann2022-07-225-0/+48
| | | | | | | Pick-to: 6.4 Fixes: QTBUG-104702 Change-Id: I80d3a28e17751d440ec4bea4c7be0d09c935fa19 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Implement Math.pow()Ulf Hermann2022-07-212-1/+2
| | | | | | | | | Also, add missing positive infinity to test data. Pick-to: 6.4 Fixes: QTBUG-104745 Change-Id: I958aca672cca8cc83c540ed3ea75b08e70eb90fd Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Allow storeNameSloppy to reset a propertyUlf Hermann2022-07-113-0/+14
| | | | | | | | | We should not convert from undefined on storeNameSloppy. The reset is intentional. Task-number: QTBUG-104508 Change-Id: Iede88fe6331dd173c9e8ea0ec4200df2b8bd30eb Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Add license headers to cmake filesLucie Gérard2022-07-082-0/+6
| | | | | | | | | | | | CMakeLists.txt and .cmake files of significant size (more than 2 lines according to our check in tst_license.pl) now have the copyright and license header. Existing copyright statements remain intact Task-number: QTBUG-88621 Change-Id: I72c89a98c42bbc9234d8495e9e503bec81d11037 Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* QmlCompiler: Handle trivial signal handler constructionsUlf Hermann2022-07-076-1/+46
| | | | | | | | | | | | | | If the signal handler does nothing but return a closure, we have to compile the closure using the same signature as the outer signal handler. In order for this to work, we also have to detect unresolved argument types for signal handlers. Those are just as bad as unresolved argument types for other functions. Fixes: QTBUG-101531 Change-Id: Idb5b3994809d91a4b4ce936282685435eb75e670 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Allow wrapping enums into intUlf Hermann2022-07-073-0/+23
| | | | | | | | | This is what we do internally in the QML engine. Pick-to: 6.4 Fixes: QTBUG-104683 Change-Id: I2f8712cb2cdc56b6c483500627fd8a218edbad81 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Don't crash on unknown list value typesUlf Hermann2022-07-065-0/+61
| | | | | | | Pick-to: 6.4 Fixes: QTBUG-104743 Change-Id: I551b21498bb746acf05be525dbcb72a74f816c04 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QML: Re-add the Qt namespace enums to the Qt objectUlf Hermann2022-07-051-1/+1
| | | | | | | | | | | They were replaced with an extension to the Qt singleton in Qt6. However, the singleton is only available when QtQml is imported. We can easily provide the enums using the metaobject of the Qt namespace. Pick-to: 6.4 Change-Id: I5f58d30c749c0cb9e531df180a5cbe75c92e1aa6 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
* QmlCompiler: Initialize registers with undefined where necessaryUlf Hermann2022-07-052-0/+27
| | | | | | | | | | | If we read the initial state of a register, we need to make sure it actually exists at that point. Uninitialized variables are implicitly undefined in JavaScript. Pick-to: 6.4 Task-number: QTBUG-104687 Change-Id: Ide4fe429b10ec28dcf267e7d34c6316355b16baa Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Don't push type conversions back into the engineUlf Hermann2022-07-053-0/+39
| | | | | | | | | | In many cases we can generate better code for type conversions. Furthermore, the engine only does QMetaType::convert(). This misses a lot of conversions we do in other places. Pick-to: 6.4 Change-Id: I1526ec327d189420885f6a7385f6cc1c2c94b19e Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Really fix writing into argument valuesUlf Hermann2022-07-052-2/+100
| | | | | | | | | | | | | | | | | | | | | | Arguments are now treated as registers "written" at the beginning of the first basic block. By modeling them this way, we can avoid all the complicated logic on whether to use a local or the arguments array when accessing any particular one of them. Furthermore, we can detect whether they are overwritten or not. If they are not overwritten, we can initialize them as a const reference into the arguments array. This way we save a copy. Treating the arguments as generic registers causes the basic blocks pass to aggressively adjust their types, pushing some conversions back into the QML engine. This is good. Unused arguments become void, for example, and don't have to be passed at all. However, we also need a special case for QJSPrimitiveValue arguments now. Pick-to: 6.4 Fixes: QTBUG-104462 Change-Id: I994bea0929bd508aa41db58dee4a7f12cd20f053 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* QmlCompiler: Fix register propagation in basic blocks passUlf Hermann2022-07-053-0/+30
| | | | | | | | | | | | | a, We were recording too many jump origins and targets. That messed up the basic blocks ordering logic. b, In the presence of backward jumps, we need to revisit earlier basic blocks if additional writes are discovered. Otherwise the type adjustment will optimize "dead" type conversions out. Pick-to: 6.4 Fixes: QTBUG-104665 Change-Id: I7219f85625761817ae4f63582d80d247a85df73b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Don't generate invalid code for storing undefinedUlf Hermann2022-06-293-0/+19
| | | | | | | | | | We don't actually have to store the retrieved value if it's not storable. Pick-to: 6.4 Fixes: QTBUG-104508 Change-Id: Ib091eabf4f4034a577b94e0d5761c5307815599e Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Add missing parentheses to in-place arithmetic operationsUlf Hermann2022-06-283-0/+41
| | | | | | | Pick-to: 6.4 Fixes: QTBUG-104512 Change-Id: I3d592eeda5cefd9e9805b1811b37bebec5d6fc9c Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Inline String.arg() into generated codeUlf Hermann2022-06-243-0/+29
| | | | | | | | This way we can compile common translation expressions with .arg(a). Task-number: QTBUG-101387 Change-Id: I89cdef48b63886684569c5b587ea69c937085b62 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Inline translation methodsUlf Hermann2022-06-243-0/+54
| | | | | | | | | We hardcode them into QQmlJSTypePropagator and QQmlJSCodegenerator for now. This is OK for builtins. Task-number: QTBUG-101387 Change-Id: Ifab46083b3a782f009859ce969c283d5bb2b4e8b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Introduce a sane resource path to qt_add_qml_moduleUlf Hermann2022-06-232-120/+121
| | | | | | | | | | | | | | | | | | Since "/qt" is reserved, we can use "/qt/qml" as the default path for user QML modules. [ChangeLog][QtQml] The AUTO_RESOURCE_PREFIX option was added to qt_add_qml_module(). It places your QML modules in the otherwise reserved resource directory /qt/qml. This directory is also added to the default QML import path. By using it you don't have to specify custom import paths anymore. Specifying neither AUTO_RESOURCE_PREFIX nor an explicit RESOURCE_PREFIX will generate a warning now because such QML modules are likely invisible in the resource file system. Fixes: QTBUG-95145 Fixes: QTBUG-103452 Change-Id: Ie27dec5cbf34ea06258d55c659d202cdd61e54b2 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
* QmlCompiler: Fix miscompilation if arguments are overwrittenUlf Hermann2022-06-233-0/+51
| | | | | | | | | | | | | | | | | In that case we need to allocate extra registers. We already did so before, but we wouldn't use the registers afterwards. This works nicely in 6.4 because we have a separate type for each store operation. Therefore, the original function argument (being of a different "type") won't be found in the list of local registers. Access to it falls back on the actual arguments array. Only once we've stored something into the register that mirrors the argument we can retrieve it. Pick-to: 6.4 Fixes: QTBUG-104462 Change-Id: Ibb0315cd2f8a8e4106d39fff88a6097b1623eb48 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>