mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-20 07:51:32 +00:00
ARC: fixes cycle detection and move the .cursor attribute into closures (#12872)
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
54
tests/destructor/tasync_prototype.nim
Normal file
54
tests/destructor/tasync_prototype.nim
Normal 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
|
||||
Reference in New Issue
Block a user