diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2023-07-24 11:02:09 +0300 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2023-08-29 10:23:33 +0000 |
commit | f19e6751987c54ee5cb16cfa144c82f4fd36dc73 (patch) | |
tree | db451cebe95b37fce9cab67d9e93769e6ca22f11 /tests/auto | |
parent | cd44045e4c48a9a4397a4de1ff1707eace6d6563 (diff) |
probes: cache map variants
Introduce a StoredVariantValue that is saved in Probe items.
Only QVariantMaps/Lists are stored since they can contain
potentially huge objects (e.g. info plists in XCode).
Cached values are now "frozen" so that users won't
acceidentally modify them. Bundle module is updated
accordingly to avoid mutating stored objects.
This saves about 7s when resolving QtC on Mac.
Change-Id: I0dd134f95105b1e4cf16e4320819db81a1c1e9a7
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/language/testdata/erroneous/frozen-object-list.qbs | 17 | ||||
-rw-r--r-- | tests/auto/language/testdata/erroneous/frozen-object.qbs | 18 | ||||
-rw-r--r-- | tests/auto/language/tst_language.cpp | 5 |
3 files changed, 40 insertions, 0 deletions
diff --git a/tests/auto/language/testdata/erroneous/frozen-object-list.qbs b/tests/auto/language/testdata/erroneous/frozen-object-list.qbs new file mode 100644 index 000000000..8bbd2b413 --- /dev/null +++ b/tests/auto/language/testdata/erroneous/frozen-object-list.qbs @@ -0,0 +1,17 @@ + +Product { + Probe { + id: probe + property varList output + configure: { + output = [{"key": "value"}]; + found = true; + } + } + + property var test: { + var result = probe.output; + result.push({}); + return result; + } +} diff --git a/tests/auto/language/testdata/erroneous/frozen-object.qbs b/tests/auto/language/testdata/erroneous/frozen-object.qbs new file mode 100644 index 000000000..0f891d04b --- /dev/null +++ b/tests/auto/language/testdata/erroneous/frozen-object.qbs @@ -0,0 +1,18 @@ + +Product { + Probe { + id: probe + property var output + configure: { + output = {"key": "value"} + found = true + } + } + + property var test: { + "use strict" + var result = probe.output; + result.key = "newValue"; + return result; + } +} diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index e945a8d3a..9b8506d84 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -186,6 +186,9 @@ TopLevelProjectPtr TestLanguage::resolveProject(const char *relProjectFilePath) void TestLanguage::init() { + // clear caches, otherwise StoredVariantValues may end up being at the same address + // as the destroyed value + m_engine->reset(); m_logSink->setLogLevel(LoggerInfo); defaultParameters = {}; defaultParameters.setBuildRoot(m_tempDir.path() + "/buildroot"); @@ -1013,6 +1016,8 @@ void TestLanguage::erroneousFiles_data() << "invalid-references.qbs:2:17.*Cannot open '.*nosuchproject.qbs'"; QTest::newRow("missing-js-file") << "missing-js-file-module.qbs.*Cannot open '.*javascriptfile.js'"; + QTest::newRow("frozen-object") << "'key' is read-only"; + QTest::newRow("frozen-object-list") << "object is not extensible"; } void TestLanguage::erroneousFiles() |