From 3020e49b7554c1bd465811864cb781abdd89ec0b Mon Sep 17 00:00:00 2001 From: Araq Date: Wed, 13 Nov 2019 11:23:07 +0100 Subject: ARC: use the new .cursor annotation for 'up' pointers --- compiler/lambdalifting.nim | 8 ++++++-- compiler/liftdestructors.nim | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim index ebd884324..a3535010d 100644 --- a/compiler/lambdalifting.nim +++ b/compiler/lambdalifting.nim @@ -347,8 +347,7 @@ proc createUpField(c: var DetectionPass; dest, dep: PSym; info: TLineInfo) = # with cycles properly, so it's better to produce a weak ref (=ptr) here. # This seems to be generally correct but since it's a bit risky it's disabled # for now. - let fieldType = if isDefined(c.graph.config, "nimCycleBreaker") or - c.graph.config.selectedGC == gcDestructors: + let fieldType = if isDefined(c.graph.config, "nimCycleBreaker"): c.getEnvTypeForOwnerUp(dep, info) #getHiddenParam(dep).typ else: c.getEnvTypeForOwner(dep, info) @@ -360,9 +359,14 @@ proc createUpField(c: var DetectionPass; dest, dep: PSym; info: TLineInfo) = if upField != nil: if upField.typ.skipTypes({tyOwned, tyRef, tyPtr}) != fieldType.skipTypes({tyOwned, tyRef, tyPtr}): localError(c.graph.config, dep.info, "internal error: up references do not agree") + + if c.graph.config.selectedGC == gcDestructors and sfCursor notin upField.flags: + localError(c.graph.config, dep.info, "internal error: up reference is not a .cursor") else: let result = newSym(skField, upIdent, obj.owner, obj.owner.info) result.typ = fieldType + if c.graph.config.selectedGC == gcDestructors: + result.flags.incl sfCursor rawAddField(obj, result) discard """ diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 3787fe6a7..5ef62f531 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -66,7 +66,7 @@ proc fillBodyObj(c: var TLiftCtx; n, body, x, y: PNode) = of nkSym: let f = n.sym if sfCursor in f.flags and f.typ.skipTypes(abstractInst).kind in {tyRef, tyProc} and - c.g.config.selectedGC == gcDestructors: + c.g.config.selectedGC in {gcDestructors, gcHooks}: defaultOp(c, f.typ, body, x.dotField(f), y.dotField(f)) else: fillBody(c, f.typ, body, x.dotField(f), y.dotField(f)) -- cgit 1.4.1-2-gfad0