aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <[email protected]>2024-12-10 10:26:34 +0100
committerUlf Hermann <[email protected]>2024-12-12 08:00:24 +0100
commitb4b691b040f2251820292a27bdcf01d4d7530bc6 (patch)
treeb44e3672f38dc53bb503fc336646ddc1ef050017
parentc5b0fa28061fc3e99ce79ff9603d87791b41a197 (diff)
QtQml: Add some consistency to QV4::RegExp
The RegExp JIT should behave the same as the V4 JIT. In particular, it should honor the same JIT call threshold and not second guess any manually set thresholds. To do this we need to store the match count in 32 bits. In turn we can store the 5 flags we may have in 8 bits. To make this safe, pass typed flags to the initialization functions. Also, consider the flags when calculating hash values. Finally, in the init() function, we don't need to initialize members to zero, since that is already guaranteed by the memory manager. And we can delete the flagsAsString() method since it's unused. This requires shuffling some #includes into the places where they actually belong. [ChangeLog][QtQml] The JavaScript regular expression engine now honors QV4_JIT_CALL_THRESHOLD for its own JIT. If QV4_JIT_CALL_THRESHOLD is not set, it uses the JIT after 3 interpreted matches for any regular expression, rather than the previous 5. Matching a regular expression on a string longer than 1024 bytes counts as 3 matches. This is to retain the default behavior of JIT'ing regular expressions right away when encountering long strings. Task-number: QTBUG-131957 Change-Id: I269ccea55d34b191ef18d7cd5fccd4cad8aec7cd Reviewed-by: Sami Shalayel <[email protected]> Reviewed-by: Fabian Kosmale <[email protected]>
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp14
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp5
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp2
-rw-r--r--src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp13
-rw-r--r--src/qml/common/qqmltranslation.cpp2
-rw-r--r--src/qml/common/qqmltranslation_p.h4
-rw-r--r--src/qml/common/qv4compileddata_p.h4
-rw-r--r--src/qml/jsruntime/qv4engine.cpp4
-rw-r--r--src/qml/jsruntime/qv4engine_p.h17
-rw-r--r--src/qml/jsruntime/qv4function_p.h2
-rw-r--r--src/qml/jsruntime/qv4regexp.cpp67
-rw-r--r--src/qml/jsruntime/qv4regexp_p.h37
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp8
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp44
-rw-r--r--src/qml/qml/qqmlvaluetype_p.h4
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp5
-rw-r--r--src/qmlcompiler/qqmljsbasicblocks.cpp5
-rw-r--r--tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp22
-rw-r--r--tools/qmlls/qmllanguageservertool.cpp21
19 files changed, 149 insertions, 131 deletions
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp
index 90edf86acb..382fc3bf90 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp
@@ -5,15 +5,15 @@
#include "qv4debugger.h"
#include "qv4debugjob.h"
-#include <private/qv4script_p.h>
-#include <private/qv4string_p.h>
-#include <private/qv4objectiterator_p.h>
-#include <private/qv4identifierhash_p.h>
-#include <private/qv4runtime_p.h>
-#include <private/qv4identifiertable_p.h>
-
#include <private/qqmlcontext_p.h>
#include <private/qqmlengine_p.h>
+#include <private/qv4identifierhash_p.h>
+#include <private/qv4identifiertable_p.h>
+#include <private/qv4objectiterator_p.h>
+#include <private/qv4runtime_p.h>
+#include <private/qv4script_p.h>
+#include <private/qv4stackframe_p.h>
+#include <private/qv4string_p.h>
#include <QtCore/qjsonarray.h>
#include <QtCore/qjsonobject.h>
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp
index a407153401..69eef41261 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp
@@ -5,10 +5,11 @@
#include "qv4debugjob.h"
#include "qv4datacollector.h"
-#include <private/qv4scopedvalue_p.h>
-#include <private/qv4script_p.h>
#include <private/qqmlcontext_p.h>
#include <private/qqmlengine_p.h>
+#include <private/qv4scopedvalue_p.h>
+#include <private/qv4script_p.h>
+#include <private/qv4stackframe_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp
index 11e1a49512..e512567f3e 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp
@@ -5,6 +5,8 @@
#include "qv4debugservice.h"
#include "qv4datacollector.h"
+#include <private/qv4stackframe_p.h>
+
#include <QtCore/qjsonobject.h>
#include <QtCore/qjsonarray.h>
diff --git a/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp b/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp
index 84cd1236d9..ae68f7d980 100644
--- a/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp
@@ -4,17 +4,18 @@
#include "qqmlnativedebugservice.h"
#include <private/qqmldebugconnector_p.h>
+#include <private/qqmldebugserviceinterfaces_p.h>
#include <private/qv4debugging_p.h>
-#include <private/qv4engine_p.h>
#include <private/qv4debugging_p.h>
-#include <private/qv4script_p.h>
-#include <private/qv4string_p.h>
-#include <private/qv4objectiterator_p.h>
+#include <private/qv4engine_p.h>
#include <private/qv4identifierhash_p.h>
+#include <private/qv4identifiertable_p.h>
+#include <private/qv4objectiterator_p.h>
#include <private/qv4runtime_p.h>
+#include <private/qv4script_p.h>
+#include <private/qv4stackframe_p.h>
+#include <private/qv4string_p.h>
#include <private/qversionedpacket_p.h>
-#include <private/qqmldebugserviceinterfaces_p.h>
-#include <private/qv4identifiertable_p.h>
#include <QtQml/qjsengine.h>
#include <QtCore/qjsonarray.h>
diff --git a/src/qml/common/qqmltranslation.cpp b/src/qml/common/qqmltranslation.cpp
index 7120071b1a..80a088b228 100644
--- a/src/qml/common/qqmltranslation.cpp
+++ b/src/qml/common/qqmltranslation.cpp
@@ -3,6 +3,8 @@
#include "private/qqmltranslation_p.h"
+#include <QtCore/qcoreapplication.h>
+
QQmlTranslation::QQmlTranslation(const Data &d) : data(d) { }
QQmlTranslation::QQmlTranslation() : data(nullptr) { }
diff --git a/src/qml/common/qqmltranslation_p.h b/src/qml/common/qqmltranslation_p.h
index 9849203abe..7f5bb87531 100644
--- a/src/qml/common/qqmltranslation_p.h
+++ b/src/qml/common/qqmltranslation_p.h
@@ -15,9 +15,9 @@
// We mean it.
//
-#include <QtCore/qstring.h>
+#include <private/qtqmlglobal_p.h>
-#include <private/qv4qmlcontext_p.h>
+#include <QtCore/qstring.h>
QT_BEGIN_NAMESPACE
diff --git a/src/qml/common/qv4compileddata_p.h b/src/qml/common/qv4compileddata_p.h
index 18d2a4c114..95aaf01707 100644
--- a/src/qml/common/qv4compileddata_p.h
+++ b/src/qml/common/qv4compileddata_p.h
@@ -156,7 +156,7 @@ static_assert(sizeof(Location) == 4, "Location structure needs to have the expec
struct RegExp
{
- enum Flags : unsigned int {
+ enum Flag : quint8 {
RegExp_NoFlags = 0x0,
RegExp_Global = 0x01,
RegExp_IgnoreCase = 0x02,
@@ -165,6 +165,8 @@ struct RegExp
RegExp_Unicode = 0x10,
};
+ Q_DECLARE_FLAGS(Flags, Flag);
+
RegExp() : m_data(QSpecialIntegerBitfieldZero) {}
RegExp(quint32 flags, quint32 stringIndex) : RegExp()
{
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index f3f2a35336..0f896210cc 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -3,6 +3,10 @@
#include "qv4engine_p.h"
+#include <wtf/BumpPointerAllocator.h>
+#include <wtf/OSAllocator.h>
+#include <wtf/PageAllocation.h>
+
#include <private/qjsvalue_p.h>
#include <private/qqmlbuiltinfunctions_p.h>
#include <private/qqmlengine_p.h>
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index 9a0f56fd26..671e0f5a42 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -21,7 +21,6 @@
#include <private/qv4context_p.h>
#include <private/qv4enginebase_p.h>
#include <private/qv4executablecompilationunit_p.h>
-#include <private/qv4function_p.h>
#include <private/qv4global_p.h>
#include <private/qv4stacklimits_p.h>
@@ -696,19 +695,15 @@ public:
bool checkStackLimits();
int safeForAllocLength(qint64 len64);
- bool canJIT(Function *f = nullptr)
+ template<typename Jittable>
+ bool canJIT(Jittable *jittable) const
{
#if QT_CONFIG(qml_jit)
- if (!m_canAllocateExecutableMemory)
- return false;
- if (f) {
- return f->kind != Function::AotCompiled
- && !f->isGenerator()
- && f->interpreterCallCount >= s_jitCallCountThreshold;
- }
- return true;
+ return m_canAllocateExecutableMemory
+ && jittable->isJittable()
+ && jittable->interpreterCallCount >= s_jitCallCountThreshold;
#else
- Q_UNUSED(f);
+ Q_UNUSED(jittable);
return false;
#endif
}
diff --git a/src/qml/jsruntime/qv4function_p.h b/src/qml/jsruntime/qv4function_p.h
index 7543dd3c4b..8161c17406 100644
--- a/src/qml/jsruntime/qv4function_p.h
+++ b/src/qml/jsruntime/qv4function_p.h
@@ -132,6 +132,8 @@ public:
return nullptr;
return executableCompilationUnit()->runtimeFunctions[compiledFunction->nestedFunctionIndex];
}
+
+ bool isJittable() const { return kind != Function::AotCompiled && !isGenerator(); }
};
}
diff --git a/src/qml/jsruntime/qv4regexp.cpp b/src/qml/jsruntime/qv4regexp.cpp
index 9c48199157..8dd14d3a43 100644
--- a/src/qml/jsruntime/qv4regexp.cpp
+++ b/src/qml/jsruntime/qv4regexp.cpp
@@ -10,10 +10,11 @@
using namespace QV4;
#if ENABLE(YARR_JIT)
-static constexpr quint8 RegexpJitThreshold = 5;
+static constexpr qsizetype LongStringJitThreshold = 1024;
+static constexpr int LongStringJitBoost = 3;
#endif
-static JSC::RegExpFlags jscFlags(uint flags)
+static JSC::RegExpFlags jscFlags(quint8 flags)
{
JSC::RegExpFlags jscFlags = JSC::NoFlags;
if (flags & CompiledData::RegExp::RegExp_Global)
@@ -71,22 +72,33 @@ uint RegExp::match(const QString &string, int start, uint *matchOffsets)
regexp->byteCode = nullptr;
};
- if (!priv->jitCode && !priv->jitFailed && priv->internalClass->engine->canJIT()
- && (string.length() > 1024 || priv->matchCount++ == RegexpJitThreshold)) {
- removeByteCode(priv);
+ if (!priv->jitCode) {
- JSC::Yarr::ErrorCode error = JSC::Yarr::ErrorCode::NoError;
- JSC::Yarr::YarrPattern yarrPattern(
- WTF::String(*priv->pattern), jscFlags(priv->flags), error);
- if (!yarrPattern.m_containsBackreferences) {
- priv->jitCode = new JSC::Yarr::YarrCodeBlock;
- JSC::VM *vm = static_cast<JSC::VM *>(priv->internalClass->engine);
- JSC::Yarr::jitCompile(yarrPattern, JSC::Yarr::Char16, vm, *priv->jitCode);
- }
+ // Long strings count as more calls. We want the JIT to run earlier.
+ const bool longString = string.length() > LongStringJitThreshold;
+ if (longString)
+ priv->interpreterCallCount += LongStringJitBoost;
+
+ if (priv->internalClass->engine->canJIT(priv)) {
+ removeByteCode(priv);
+
+ JSC::Yarr::ErrorCode error = JSC::Yarr::ErrorCode::NoError;
+ JSC::Yarr::YarrPattern yarrPattern(
+ WTF::String(*priv->pattern), jscFlags(priv->flags), error);
+ if (!yarrPattern.m_containsBackreferences) {
+ priv->jitCode = new JSC::Yarr::YarrCodeBlock;
+ JSC::VM *vm = static_cast<JSC::VM *>(priv->internalClass->engine);
+ JSC::Yarr::jitCompile(yarrPattern, JSC::Yarr::Char16, vm, *priv->jitCode);
+ }
- if (!priv->hasValidJITCode()) {
- removeJitCode(priv);
- regenerateByteCode(priv);
+ if (!priv->hasValidJITCode()) {
+ removeJitCode(priv);
+ regenerateByteCode(priv);
+ }
+ } else if (!longString) {
+ // Short strings do the regular post-increment to honor
+ // QV4_JIT_CALL_THRESHOLD.
+ ++priv->interpreterCallCount;
}
}
#endif
@@ -172,23 +184,8 @@ QString RegExp::getSubstitution(const QString &matched, const QString &str, int
return result;
}
-QString Heap::RegExp::flagsAsString() const
-{
- QString result;
- if (flags & CompiledData::RegExp::RegExp_Global)
- result += QLatin1Char('g');
- if (flags & CompiledData::RegExp::RegExp_IgnoreCase)
- result += QLatin1Char('i');
- if (flags & CompiledData::RegExp::RegExp_Multiline)
- result += QLatin1Char('m');
- if (flags & CompiledData::RegExp::RegExp_Unicode)
- result += QLatin1Char('u');
- if (flags & CompiledData::RegExp::RegExp_Sticky)
- result += QLatin1Char('y');
- return result;
-}
-
-Heap::RegExp *RegExp::create(ExecutionEngine* engine, const QString& pattern, uint flags)
+Heap::RegExp *RegExp::create(
+ ExecutionEngine *engine, const QString &pattern, CompiledData::RegExp::Flags flags)
{
RegExpCacheKey key(pattern, flags);
@@ -215,10 +212,6 @@ void Heap::RegExp::init(ExecutionEngine *engine, const QString &pattern, uint fl
this->pattern = new QString(pattern);
this->flags = flags;
- valid = false;
- jitFailed = false;
- matchCount = 0;
-
JSC::Yarr::ErrorCode error = JSC::Yarr::ErrorCode::NoError;
JSC::Yarr::YarrPattern yarrPattern(WTF::String(pattern), jscFlags(flags), error);
if (error != JSC::Yarr::ErrorCode::NoError)
diff --git a/src/qml/jsruntime/qv4regexp_p.h b/src/qml/jsruntime/qv4regexp_p.h
index 8a178dd2f6..89f9515917 100644
--- a/src/qml/jsruntime/qv4regexp_p.h
+++ b/src/qml/jsruntime/qv4regexp_p.h
@@ -14,21 +14,18 @@
// We mean it.
//
-#include <QString>
-#include <QVector>
-
-#include <wtf/RefPtr.h>
-#include <wtf/FastAllocBase.h>
-#include <wtf/BumpPointerAllocator.h>
-
-#include <limits.h>
+// Yarr.h is not self-contained. Make sure it sees uint8_t
+#include <cstdint>
#include <yarr/Yarr.h>
#include <yarr/YarrInterpreter.h>
#include <yarr/YarrJIT.h>
-#include "qv4managed_p.h"
-#include "qv4engine_p.h"
+#include <private/qv4compileddata_p.h>
+#include <private/qv4managed_p.h>
+
+#include <QtCore/qstring.h>
+#include <QtCore/qvector.h>
QT_BEGIN_NAMESPACE
@@ -64,12 +61,16 @@ struct RegExp : Base {
RegExpCache *cache;
int subPatternCount;
- uint flags;
- bool valid;
+
+#if ENABLE(YARR_JIT)
+ bool isJittable() const { return !jitFailed; }
+ int interpreterCallCount;
bool jitFailed;
- quint8 matchCount;
+#endif
+
+ quint8 flags;
+ bool valid;
- QString flagsAsString() const;
int captureCount() const { return subPatternCount + 1; }
};
Q_STATIC_ASSERT(std::is_trivial_v<RegExp>);
@@ -96,7 +97,9 @@ struct RegExp : public Managed
bool unicode() const { return d()->unicode(); }
bool sticky() const { return d()->sticky(); }
- static Heap::RegExp *create(ExecutionEngine* engine, const QString& pattern, uint flags = CompiledData::RegExp::RegExp_NoFlags);
+ static Heap::RegExp *create(
+ ExecutionEngine *engine, const QString &pattern,
+ CompiledData::RegExp::Flags flags = CompiledData::RegExp::RegExp_NoFlags);
bool isValid() const { return d()->valid; }
@@ -122,7 +125,7 @@ struct RegExpCacheKey
{ return !operator==(other); }
QString pattern;
- uint flags;
+ quint8 flags;
};
inline RegExpCacheKey::RegExpCacheKey(const RegExp::Data *re)
@@ -131,7 +134,7 @@ inline RegExpCacheKey::RegExpCacheKey(const RegExp::Data *re)
{}
inline size_t qHash(const RegExpCacheKey& key, size_t seed = 0) noexcept
-{ return qHash(key.pattern, seed); }
+{ return qHashMulti(seed, key.pattern, key.flags); }
class RegExpCache : public QHash<RegExpCacheKey, WeakValue>
{
diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp
index 144cd39bcd..0f5050c704 100644
--- a/src/qml/jsruntime/qv4regexpobject.cpp
+++ b/src/qml/jsruntime/qv4regexpobject.cpp
@@ -91,7 +91,7 @@ void Heap::RegExpObject::init(const QRegularExpression &re)
Scoped<QV4::RegExpObject> o(scope, this);
QRegularExpression::PatternOptions options = re.patternOptions();
- uint flags = (options & QRegularExpression::CaseInsensitiveOption)
+ CompiledData::RegExp::Flags flags = (options & QRegularExpression::CaseInsensitiveOption)
? CompiledData::RegExp::RegExp_IgnoreCase
: CompiledData::RegExp::RegExp_NoFlags;
if (options & QRegularExpression::MultilineOption)
@@ -222,9 +222,9 @@ static bool isRegExp(ExecutionEngine *e, const QV4::Value *arg)
return re ? true : false;
}
-uint parseFlags(Scope &scope, const QV4::Value *f)
+static CompiledData::RegExp::Flags parseFlags(Scope &scope, const QV4::Value *f)
{
- uint flags = CompiledData::RegExp::RegExp_NoFlags;
+ CompiledData::RegExp::Flags flags = CompiledData::RegExp::RegExp_NoFlags;
if (!f->isUndefined()) {
ScopedString s(scope, f->toString(scope.engine));
if (scope.hasException())
@@ -269,7 +269,7 @@ ReturnedValue RegExpCtor::virtualCallAsConstructor(const FunctionObject *fo, con
ScopedValue f(scope, argc > 1 ? argv[1] : Value::undefinedValue());
Scoped<RegExpObject> re(scope, p);
QString pattern;
- uint flags = CompiledData::RegExp::RegExp_NoFlags;
+ CompiledData::RegExp::Flags flags = CompiledData::RegExp::RegExp_NoFlags;
if (re) {
if (f->isUndefined()) {
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 5616d2fd15..d986ed9b39 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -3,36 +3,36 @@
#include "qqmlobjectcreator_p.h"
-#include <private/qqmlengine_p.h>
-#include <private/qqmlvmemetaobject_p.h>
-#include <private/qv4function_p.h>
-#include <private/qv4functionobject_p.h>
-#include <private/qv4qobjectwrapper_p.h>
+#include <private/qjsvalue_p.h>
+#include <private/qqmlanybinding_p.h>
#include <private/qqmlbinding_p.h>
-#include <private/qqmlstringconverters_p.h>
#include <private/qqmlboundsignal_p.h>
-#include <private/qqmlcomponentattached_p.h>
#include <private/qqmlcomponent_p.h>
+#include <private/qqmlcomponentattached_p.h>
#include <private/qqmlcustomparser_p.h>
-#include <private/qqmlscriptstring_p.h>
-#include <private/qqmlpropertyvalueinterceptor_p.h>
-#include <private/qqmlvaluetypeproxybinding_p.h>
#include <private/qqmldebugconnector_p.h>
#include <private/qqmldebugserviceinterfaces_p.h>
+#include <private/qqmlengine_p.h>
+#include <private/qqmlpropertybinding_p.h>
+#include <private/qqmlpropertyvalueinterceptor_p.h>
#include <private/qqmlscriptdata_p.h>
+#include <private/qqmlscriptstring_p.h>
#include <private/qqmlsourcecoordinate_p.h>
-#include <private/qjsvalue_p.h>
+#include <private/qqmlstringconverters_p.h>
+#include <private/qqmlvaluetypeproxybinding_p.h>
+#include <private/qqmlvme_p.h>
+#include <private/qqmlvmemetaobject_p.h>
+#include <private/qv4function_p.h>
+#include <private/qv4functionobject_p.h>
#include <private/qv4generatorobject_p.h>
+#include <private/qv4qobjectwrapper_p.h>
+#include <private/qv4referenceobject_p.h>
#include <private/qv4resolvedtypereference_p.h>
-#include <private/qqmlpropertybinding_p.h>
-#include <private/qqmlanybinding_p.h>
-#include <QtQml/private/qqmlvme_p.h>
-
-#include <QScopedValueRollback>
#include <qtqml_tracepoints_p.h>
-#include <QScopedValueRollback>
-#include <QLoggingCategory>
+
+#include <QtCore/qscopedvaluerollback.h>
+#include <QtCore/qloggingcategory.h>
Q_STATIC_LOGGING_CATEGORY(lcQmlDefaultMethod, "qt.qml.defaultmethod")
@@ -947,8 +947,12 @@ bool QQmlObjectCreator::setPropertyBinding(const QQmlPropertyData *bindingProper
return false;
}
- if (valueType)
- valueType->write(_qobject, bindingProperty->coreIndex(), QQmlPropertyData::BypassInterceptor);
+ if (valueType) {
+ valueType->write(
+ _qobject, bindingProperty->coreIndex(),
+ QQmlPropertyData::BypassInterceptor,
+ QV4::ReferenceObject::AllProperties);
+ }
return true;
}
diff --git a/src/qml/qml/qqmlvaluetype_p.h b/src/qml/qml/qqmlvaluetype_p.h
index 4b5442223d..f6634bacd9 100644
--- a/src/qml/qml/qqmlvaluetype_p.h
+++ b/src/qml/qml/qqmlvaluetype_p.h
@@ -19,7 +19,6 @@
#include <private/qqmlnullablevalue_p.h>
#include <private/qmetatype_p.h>
-#include <private/qv4referenceobject_p.h>
#include <QtCore/qobject.h>
#include <QtCore/qrect.h>
@@ -75,8 +74,7 @@ public:
~QQmlGadgetPtrWrapper();
void read(QObject *obj, int idx);
- void write(QObject *obj, int idx, QQmlPropertyData::WriteFlags flags,
- int internalIndex = QV4::ReferenceObject::AllProperties) const;
+ void write(QObject *obj, int idx, QQmlPropertyData::WriteFlags flags, int internalIndex) const;
QVariant value() const;
void setValue(const QVariant &value);
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index e0a11ac4aa..977733ef91 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -372,7 +372,10 @@ bool QQmlInterceptorMetaObject::doIntercept(QMetaObject::Call c, int id, void **
// current value is explicitly set.
// So, we cannot return here if prevComponentValue == newComponentValue.
valueType->writeOnGadget(valueProp, std::move(prevComponentValue));
- valueType->write(object, id, QQmlPropertyData::DontRemoveBinding | QQmlPropertyData::BypassInterceptor);
+ valueType->write(
+ object, id,
+ QQmlPropertyData::DontRemoveBinding | QQmlPropertyData::BypassInterceptor,
+ QV4::ReferenceObject::AllProperties);
vi->write(newComponentValue);
return true;
diff --git a/src/qmlcompiler/qqmljsbasicblocks.cpp b/src/qmlcompiler/qqmljsbasicblocks.cpp
index 2c07dd00b7..9f83715e92 100644
--- a/src/qmlcompiler/qqmljsbasicblocks.cpp
+++ b/src/qmlcompiler/qqmljsbasicblocks.cpp
@@ -2,9 +2,10 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "qqmljsbasicblocks_p.h"
-#include "qqmljsutils_p.h"
-#include <QtQml/private/qv4instr_moth_p.h>
+#include <private/qqmlglobal_p.h>
+#include <private/qqmljsutils_p.h>
+#include <private/qv4instr_moth_p.h>
QT_BEGIN_NAMESPACE
diff --git a/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp b/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp
index bd3e2b50ff..0d45e519a4 100644
--- a/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp
+++ b/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp
@@ -1,16 +1,22 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-#include <qtest.h>
-#include <QQmlEngine>
-#include <QQmlComponent>
-#include <QQmlContext>
-#include <QDebug>
-#include <QScopedPointer>
+#include "testtypes.h"
+
+#include <private/qmlutils_p.h>
#include <private/qqmlglobal_p.h>
#include <private/qquickvaluetypes_p.h>
-#include <QtQuickTestUtils/private/qmlutils_p.h>
-#include "testtypes.h"
+#include <private/qv4object_p.h>
+#include <private/qv4scopedvalue_p.h>
+
+#include <QtTest/qtest.h>
+
+#include <QtQml/qqmlengine.h>
+#include <QtQml/qqmlcomponent.h>
+#include <QtQml/qqmlcontext.h>
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qscopedpointer.h>
QT_BEGIN_NAMESPACE
extern int qt_defaultDpi(void);
diff --git a/tools/qmlls/qmllanguageservertool.cpp b/tools/qmlls/qmllanguageservertool.cpp
index ad53e75e3e..a0a0a3a234 100644
--- a/tools/qmlls/qmllanguageservertool.cpp
+++ b/tools/qmlls/qmllanguageservertool.cpp
@@ -1,14 +1,22 @@
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
-#include <QtQmlLS/private/qqmllanguageserver_p.h>
+#include <private/qhttpmessagestreamparser_p.h>
+#include <private/qqmlglobal_p.h>
+#include <private/qqmljscompiler_p.h>
+#include <private/qqmljsimporter_p.h>
+#include <private/qqmljslogger_p.h>
+#include <private/qqmljsresourcefilemapper_p.h>
+#include <private/qqmljsscope_p.h>
+#include <private/qqmllanguageserver_p.h>
+#include <private/qqmltoolingsettings_p.h>
+#include <private/qqmltoolingutils_p.h>
+
#include <QtCore/qdebug.h>
#include <QtCore/qfile.h>
#include <QtCore/qdir.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qcoreapplication.h>
-#include <QtQmlToolingSettings/private/qqmltoolingsettings_p.h>
-#include <QtQmlToolingSettings/private/qqmltoolingutils_p.h>
#include <QtCore/qdiriterator.h>
#include <QtCore/qjsonobject.h>
#include <QtCore/qjsonarray.h>
@@ -20,13 +28,6 @@
#include <QtCore/qthreadpool.h>
#include <QtCore/qtimer.h>
-#include <QtJsonRpc/private/qhttpmessagestreamparser_p.h>
-
-#include <QtQmlCompiler/private/qqmljsresourcefilemapper_p.h>
-#include <QtQmlCompiler/private/qqmljscompiler_p.h>
-#include <QtQmlCompiler/private/qqmljslogger_p.h>
-#include <QtQmlCompiler/private/qqmljsscope_p.h>
-#include <QtQmlCompiler/private/qqmljsimporter_p.h>
#if QT_CONFIG(commandlineparser)
# include <QtCore/qcommandlineparser.h>
#endif