summaryrefslogtreecommitdiff
path: root/dev-qt
diff options
context:
space:
mode:
authorIonen Wolkens <ionen@gentoo.org>2024-11-15 09:24:59 -0500
committerIonen Wolkens <ionen@gentoo.org>2024-11-15 09:43:11 -0500
commit5234ec1826825db9964b365f21d3952484f08846 (patch)
tree0ae41e1139b2ad2ef54a3f24b2b1d375562c1280 /dev-qt
parentdev-db/postgresql: drop 12.20, 13.16, 14.13, 15.8, 16.4, 17.0-r1 (diff)
downloadgentoo-5234ec1826825db9964b365f21d3952484f08846.tar.gz
gentoo-5234ec1826825db9964b365f21d3952484f08846.tar.bz2
gentoo-5234ec1826825db9964b365f21d3952484f08846.zip
dev-qt/qtdeclarative: backport 6.8 branch fix for QTBUG-130767
Currently fix seems to be only in 6.8.2 so we may need this for 6.8.1 as well. Leaving it out of the live ebuild given that is currently building 6.8.2 Signed-off-by: Ionen Wolkens <ionen@gentoo.org>
Diffstat (limited to 'dev-qt')
-rw-r--r--dev-qt/qtdeclarative/files/qtdeclarative-6.8.0-QTBUG-130767.patch255
-rw-r--r--dev-qt/qtdeclarative/qtdeclarative-6.8.0-r7.ebuild (renamed from dev-qt/qtdeclarative/qtdeclarative-6.8.0-r6.ebuild)1
2 files changed, 256 insertions, 0 deletions
diff --git a/dev-qt/qtdeclarative/files/qtdeclarative-6.8.0-QTBUG-130767.patch b/dev-qt/qtdeclarative/files/qtdeclarative-6.8.0-QTBUG-130767.patch
new file mode 100644
index 000000000000..aefc46bd3604
--- /dev/null
+++ b/dev-qt/qtdeclarative/files/qtdeclarative-6.8.0-QTBUG-130767.patch
@@ -0,0 +1,255 @@
+https://bugreports.qt.io/browse/QTBUG-130767
+https://bugs.kde.org/show_bug.cgi?id=494804
+https://codereview.qt-project.org/c/qt/qtdeclarative/+/604180
+(+required https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=104b0d6e88)
+--- a/src/qml/jsruntime/qv4qobjectwrapper_p.h
++++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h
+@@ -224,2 +224,15 @@
+
++// We generally musn't pass ReturnedValue as arguments to other functions.
++// In this case, we do it solely for marking purposes so it's fine.
++inline void markIfPastMarkWeakValues(ExecutionEngine *engine, ReturnedValue rv)
++{
++ const auto gcState = engine->memoryManager->gcStateMachine->state;
++ if (gcState != GCStateMachine::Invalid && gcState >= GCState::MarkWeakValues) {
++ QV4::WriteBarrier::markCustom(engine, [rv](QV4::MarkStack *ms) {
++ auto *m = StaticValue::fromReturnedValue(rv).m();
++ m->mark(ms);
++ });
++ }
++}
++
+ inline ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object)
+@@ -235,3 +248,5 @@
+
+- return wrap_slowPath(engine, object);
++ const auto rv = wrap_slowPath(engine, object);
++ markIfPastMarkWeakValues(engine, rv);
++ return rv;
+ }
+@@ -244,3 +259,5 @@
+
+- return wrapConst_slowPath(engine, object);
++ const auto rv = wrapConst_slowPath(engine, object);
++ markIfPastMarkWeakValues(engine, rv);
++ return rv;
+ }
+--- a/src/qml/memory/qv4mm.cpp
++++ b/src/qml/memory/qv4mm.cpp
+@@ -62,2 +62,4 @@
+ Q_DECLARE_LOGGING_CATEGORY(lcGcAllocatorStats)
++Q_LOGGING_CATEGORY(lcGcStateTransitions, "qt.qml.gc.stateTransitions")
++Q_DECLARE_LOGGING_CATEGORY(lcGcStateTransitions)
+
+@@ -682,3 +684,3 @@
+ that->mm->engine->isGCOngoing = true;
+- return MarkGlobalObject;
++ return GCState::MarkGlobalObject;
+ }
+@@ -688,3 +690,3 @@
+ that->mm->engine->markObjects(that->mm->m_markStack.get());
+- return MarkJSStack;
++ return GCState::MarkJSStack;
+ }
+@@ -694,3 +696,3 @@
+ that->mm->collectFromJSStack(that->mm->markStack());
+- return InitMarkPersistentValues;
++ return GCState::InitMarkPersistentValues;
+ }
+@@ -700,5 +702,5 @@
+ if (!that->mm->m_persistentValues)
+- return InitMarkWeakValues; // no persistent values to mark
++ return GCState::InitMarkWeakValues; // no persistent values to mark
+ stateData = GCIteratorStorage { that->mm->m_persistentValues->begin() };
+- return MarkPersistentValues;
++ return GCState::MarkPersistentValues;
+ }
+@@ -719,3 +721,3 @@
+ if (wasDrainNecessary(markStack, that->deadline) && that->deadline.hasExpired())
+- return MarkPersistentValues;
++ return GCState::MarkPersistentValues;
+ PersistentValueStorage::Iterator& it = get<GCIteratorStorage>(stateData).it;
+@@ -724,3 +726,3 @@
+ if (!it.p)
+- return InitMarkWeakValues;
++ return GCState::InitMarkWeakValues;
+ if (Managed *m = (*it).as<Managed>())
+@@ -729,3 +731,3 @@
+ }
+- return MarkPersistentValues;
++ return GCState::MarkPersistentValues;
+ }
+@@ -735,3 +737,3 @@
+ stateData = GCIteratorStorage { that->mm->m_weakValues->begin() };
+- return MarkWeakValues;
++ return GCState::MarkWeakValues;
+ }
+@@ -742,3 +744,3 @@
+ if (wasDrainNecessary(markStack, that->deadline) && that->deadline.hasExpired())
+- return MarkWeakValues;
++ return GCState::MarkWeakValues;
+ PersistentValueStorage::Iterator& it = get<GCIteratorStorage>(stateData).it;
+@@ -747,3 +749,3 @@
+ if (!it.p)
+- return MarkDrain;
++ return GCState::MarkDrain;
+ QObjectWrapper *qobjectWrapper = (*it).as<QObjectWrapper>();
+@@ -768,3 +770,3 @@
+ }
+- return MarkWeakValues;
++ return GCState::MarkWeakValues;
+ }
+@@ -775,3 +777,3 @@
+ that->mm->markStack()->drain();
+- return MarkReady;
++ return GCState::MarkReady;
+ }
+@@ -779,4 +781,4 @@
+ return drainState == MarkStack::DrainState::Complete
+- ? MarkReady
+- : MarkDrain;
++ ? GCState::MarkReady
++ : GCState::MarkDrain;
+ }
+@@ -786,3 +788,3 @@
+ //Possibility to do some clean up, stat printing, etc...
+- return InitCallDestroyObjects;
++ return GCState::InitCallDestroyObjects;
+ }
+@@ -803,5 +805,5 @@
+ if (!that->mm->m_weakValues)
+- return FreeWeakMaps; // no need to call destroy objects
++ return GCState::FreeWeakMaps; // no need to call destroy objects
+ stateData = GCIteratorStorage { that->mm->m_weakValues->begin() };
+- return CallDestroyObjects;
++ return GCState::CallDestroyObjects;
+ }
+@@ -818,3 +820,3 @@
+ if (!it.p)
+- return FreeWeakMaps;
++ return GCState::FreeWeakMaps;
+ Managed *m = (*it).managed();
+@@ -828,3 +830,3 @@
+ }
+- return CallDestroyObjects;
++ return GCState::CallDestroyObjects;
+ }
+@@ -845,3 +847,3 @@
+ freeWeakMaps(that->mm);
+- return FreeWeakSets;
++ return GCState::FreeWeakSets;
+ }
+@@ -863,3 +865,3 @@
+ freeWeakSets(that->mm);
+- return HandleQObjectWrappers;
++ return GCState::HandleQObjectWrappers;
+ }
+@@ -869,3 +871,3 @@
+ that->mm->cleanupDeletedQObjectWrappersInSweep();
+- return DoSweep;
++ return GCState::DoSweep;
+ }
+@@ -893,3 +895,3 @@
+
+- return Invalid;
++ return GCState::Invalid;
+ }
+@@ -1493,4 +1495,8 @@
+ }
++ qCDebug(lcGcStateTransitions) << "Preparing to execute the"
++ << QMetaEnum::fromType<GCState>().key(state) << "state";
+ GCStateInfo& stateInfo = stateInfoMap[int(state)];
+ state = stateInfo.execute(this, stateData);
++ qCDebug(lcGcStateTransitions) << "Transitioning to the"
++ << QMetaEnum::fromType<GCState>().key(state) << "state";
+ if (stateInfo.breakAfter)
+@@ -1507,4 +1513,8 @@
+ while (state != GCState::Invalid) {
++ qCDebug(lcGcStateTransitions) << "Preparing to execute the"
++ << QMetaEnum::fromType<GCState>().key(state) << "state";
+ GCStateInfo& stateInfo = stateInfoMap[int(state)];
+ state = stateInfo.execute(this, stateData);
++ qCDebug(lcGcStateTransitions) << "Transitioning to the"
++ << QMetaEnum::fromType<GCState>().key(state) << "state";
+ }
+@@ -1516 +1526,3 @@
+ QT_END_NAMESPACE
++
++#include "moc_qv4mm_p.cpp"
+--- a/src/qml/memory/qv4mm_p.h
++++ b/src/qml/memory/qv4mm_p.h
+@@ -30,22 +30,2 @@
+
+-enum GCState {
+- MarkStart = 0,
+- MarkGlobalObject,
+- MarkJSStack,
+- InitMarkPersistentValues,
+- MarkPersistentValues,
+- InitMarkWeakValues,
+- MarkWeakValues,
+- MarkDrain,
+- MarkReady,
+- InitCallDestroyObjects,
+- CallDestroyObjects,
+- FreeWeakMaps,
+- FreeWeakSets,
+- HandleQObjectWrappers,
+- DoSweep,
+- Invalid,
+- Count,
+-};
+-
+ struct GCData { virtual ~GCData(){};};
+@@ -55,11 +35,39 @@
+ };
+-struct GCStateMachine;
+-
+-struct GCStateInfo {
+- using ExtraData = std::variant<std::monostate, GCIteratorStorage>;
+- GCState (*execute)(GCStateMachine *, ExtraData &) = nullptr; // Function to execute for this state, returns true if ready to transition
+- bool breakAfter{false};
+-};
+
+ struct GCStateMachine {
++ Q_GADGET_EXPORT(Q_QML_EXPORT)
++
++public:
++ enum GCState {
++ MarkStart = 0,
++ MarkGlobalObject,
++ MarkJSStack,
++ InitMarkPersistentValues,
++ MarkPersistentValues,
++ InitMarkWeakValues,
++ MarkWeakValues,
++ MarkDrain,
++ MarkReady,
++ InitCallDestroyObjects,
++ CallDestroyObjects,
++ FreeWeakMaps,
++ FreeWeakSets,
++ HandleQObjectWrappers,
++ DoSweep,
++ Invalid,
++ Count,
++ };
++ Q_ENUM(GCState)
++
++ struct StepTiming {
++ qint64 rolling_sum = 0;
++ qint64 count = 0;
++ };
++
++ struct GCStateInfo {
++ using ExtraData = std::variant<std::monostate, GCIteratorStorage>;
++ GCState (*execute)(GCStateMachine *, ExtraData &) = nullptr; // Function to execute for this state, returns true if ready to transition
++ bool breakAfter{false};
++ };
++
+ using ExtraData = GCStateInfo::ExtraData;
+@@ -96,2 +104,4 @@
+
++using GCState = GCStateMachine::GCState;
++using GCStateInfo = GCStateMachine::GCStateInfo;
+
diff --git a/dev-qt/qtdeclarative/qtdeclarative-6.8.0-r6.ebuild b/dev-qt/qtdeclarative/qtdeclarative-6.8.0-r7.ebuild
index 7f4c05e68b3e..21baad2c9b84 100644
--- a/dev-qt/qtdeclarative/qtdeclarative-6.8.0-r6.ebuild
+++ b/dev-qt/qtdeclarative/qtdeclarative-6.8.0-r7.ebuild
@@ -39,6 +39,7 @@ PATCHES=(
"${FILESDIR}"/${PN}-6.8.0-QTBUG-125053.patch
"${FILESDIR}"/${PN}-6.8.0-QTBUG-129797.patch
"${FILESDIR}"/${PN}-6.8.0-QTBUG-129500.patch
+ "${FILESDIR}"/${PN}-6.8.0-QTBUG-130767.patch
)
src_configure() {