Skip nested procedures in .async. macro

Fixes #3075
This commit is contained in:
LemonBoy
2018-09-22 15:59:47 +02:00
parent 6b5e2adfd0
commit 75a981cf80
2 changed files with 32 additions and 0 deletions

View File

@@ -177,6 +177,9 @@ proc processBody(node, retFutureSym: NimNode,
var newDiscard = node
result.createVar("futureDiscard_" & $toStrLit(node[0][1]), node[0][1],
newDiscard[0], newDiscard, node)
of RoutineNodes:
# skip all the nested procedure definitions
return
else: discard
for i in 0 ..< result.len:

29
tests/async/t3075.nim Normal file
View File

@@ -0,0 +1,29 @@
import asyncnet, asyncdispatch, strtabs
type
WebSocketCallback = proc (client: WebSocket, message: WebSocketMessage) {.closure, gcsafe.}
WebSocketRecvClosure = proc (ws: WebSocket): Future[string] {.gcsafe.}
WebSocketMessage = ref object
msg: string
WebSocket = ref object
socket: AsyncSocket
header: StringTableRef
onOpen: WebSocketCallback
onMessage: WebSocketCallback
onClose: WebSocketCallback
proc recv(ws: WebSocket, p: WebSocketRecvClosure): Future[string] {.async.}=
if not ws.socket.isClosed():
result = await ws.p()
if result == "":
ws.socket.close()
if ws.onClose != nil:
ws.onClose(ws, nil)
return result
proc reсvSize(ws: WebSocket, size: int): Future[string] {.async.} =
proc recvSizeClosure(ws: WebSocket): Future[string] {.async.} =
return await ws.socket.recv(size)
return await ws.recv(recvSizeClosure)