From b1461540280203554ffac0fec12ad45a84079588 Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 21 Feb 2026 23:29:49 +0100 Subject: [PATCH] maybe now --- compiler/liftdestructors.nim | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index ef787723f5..f0a5acc78c 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -1286,24 +1286,15 @@ proc produceSym(g: ModuleGraph; c: PContext; typ: PType; kind: TTypeAttachedOp; tk = tyNone # no special casing for strings and seqs case tk of tySequence: - fillSeqOp(a, typ, result.ast[bodyPos], d, src) - # YRC: topology-changing seq ops must hold the mutator (read) lock - if g.config.selectedGC == gcYrc and + let needsYrcLock = g.config.selectedGC == gcYrc and kind in {attachedDestructor, attachedSink, attachedAsgn, attachedDeepCopy, attachedDup} and - types.canFormAcycle(g, skipped.elementType): - let acquireSym = getSysSym(g, info, "acquireMutatorLock") - let releaseSym = getSysSym(g, info, "releaseMutatorLock") - if acquireSym != nil and releaseSym != nil and acquireSym.kind != skError and releaseSym.kind != skError: - let acquireCall = newNodeI(nkCall, info) - acquireCall.add newSymNode(acquireSym) - let releaseCall = newNodeI(nkCall, info) - releaseCall.add newSymNode(releaseSym) - let oldBody = result.ast[bodyPos] - result.ast[bodyPos] = newTree(nkStmtList, - acquireCall, - newTree(nkTryStmt, - oldBody, - newTree(nkFinally, newTree(nkStmtList, releaseCall)))) + types.canFormAcycle(g, skipped.elementType) + # YRC: topology-changing seq ops must hold the mutator (read) lock + if needsYrcLock: + result.ast[bodyPos].add callCodegenProc(g, "acquireMutatorLock", info) + fillSeqOp(a, typ, result.ast[bodyPos], d, src) + if needsYrcLock: + result.ast[bodyPos].add callCodegenProc(g, "releaseMutatorLock", info) of tyString: fillStrOp(a, typ, result.ast[bodyPos], d, src) else: