ARC: fixes cycle detection and move the .cursor attribute into closures (#12872)

This commit is contained in:
Andreas Rumpf
2019-12-11 06:57:00 +01:00
committed by GitHub
parent e61d702206
commit 3524944e21
3 changed files with 57 additions and 1 deletions

View File

@@ -422,7 +422,8 @@ proc cycleCheck(n: PNode; c: var Con) =
var field: PNode = nil
while true:
if x.kind == nkDotExpr:
if field == nil: field = x[1]
field = x[1]
if field.kind == nkSym and sfCursor in field.sym.flags: return
x = x[0]
elif x.kind in {nkBracketExpr, nkCheckedFieldExpr, nkDerefExpr, nkHiddenDeref}:
x = x[0]

View File

@@ -215,6 +215,7 @@ proc addField*(obj: PType; s: PSym; cache: IdentCache) =
assert t.kind != tyTyped
propagateToOwner(obj, t)
field.position = obj.n.len
field.flags = s.flags * {sfCursor}
obj.n.add newSymNode(field)
fieldCheck()

View File

@@ -0,0 +1,54 @@
discard """
output: '''asdas
processClient end
false
MEMORY 0
'''
cmd: '''nim c --gc:arc $file'''
"""
type
PAsyncHttpServer = ref object
value: string
PFutureBase {.acyclic.} = ref object
callback: proc () {.closure.}
value: string
failed: bool
proc accept(server: PAsyncHttpServer): PFutureBase =
new(result)
result.callback = proc () =
discard
server.value = "hahaha"
proc processClient(): PFutureBase =
new(result)
proc serve(server: PAsyncHttpServer): PFutureBase =
iterator serveIter(): PFutureBase {.closure.} =
echo server.value
while true:
var acceptAddrFut = server.accept()
yield acceptAddrFut
var fut = acceptAddrFut.value
var f {.cursor.} = processClient()
when true:
f.callback =
proc () =
echo("processClient end")
echo(f.failed)
yield f
var x = serveIter
for i in 0 .. 1:
result = x()
if result.callback != nil:
result.callback()
let mem = getOccupiedMem()
proc main =
discard serve(PAsyncHttpServer(value: "asdas"))
main()
echo "MEMORY ", getOccupiedMem() - mem