diff options
-rw-r--r-- | compiler/injectdestructors.nim | 2 | ||||
-rw-r--r-- | lib/pure/asyncfutures.nim | 32 | ||||
-rw-r--r-- | lib/pure/asyncmacro.nim | 4 |
3 files changed, 27 insertions, 11 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index c2d135e86..7893db61d 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -154,7 +154,7 @@ type uninit: IntSet # set of uninit'ed vars uninitComputed: bool -const toDebug = "" +const toDebug = "" # "server_continue" template dbg(body) = when toDebug.len > 0: diff --git a/lib/pure/asyncfutures.nim b/lib/pure/asyncfutures.nim index 4a80056e2..1243a17f2 100644 --- a/lib/pure/asyncfutures.nim +++ b/lib/pure/asyncfutures.nim @@ -144,16 +144,32 @@ proc checkFinished[T](future: Future[T]) = raise err proc call(callbacks: var CallbackList) = - var current = callbacks + when not defined(nimV2): + # strictly speaking a little code duplication here, but we strive + # to minimize regressions and I'm not sure I got the 'nimV2' logic + # right: + var current = callbacks + while true: + if not current.function.isNil: + callSoon(current.function) + + if current.next.isNil: + break + else: + current = current.next[] + else: + var currentFunc = unown callbacks.function + var currentNext = unown callbacks.next - while true: - if not current.function.isNil: - callSoon(current.function) + while true: + if not currentFunc.isNil: + callSoon(currentFunc) - if current.next.isNil: - break - else: - current = current.next[] + if currentNext.isNil: + break + else: + currentFunc = currentNext.function + currentNext = unown currentNext.next # callback will be called only once, let GC collect them now callbacks.next = nil diff --git a/lib/pure/asyncmacro.nim b/lib/pure/asyncmacro.nim index f48a18afb..8e537ac25 100644 --- a/lib/pure/asyncmacro.nim +++ b/lib/pure/asyncmacro.nim @@ -31,10 +31,10 @@ template createCb(retFutureSym, iteratorNameSym, proc identName {.closure.} = try: if not nameIterVar.finished: - var next = nameIterVar() + var next = unown nameIterVar() # Continue while the yielded future is already finished. while (not next.isNil) and next.finished: - next = nameIterVar() + next = unown nameIterVar() if nameIterVar.finished: break |