mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-08 05:53:22 +00:00
Fix infinite recursion when await is in except body.
This commit is contained in:
@@ -1273,7 +1273,7 @@ proc processBody(node, retFutureSym: NimNode,
|
||||
else: discard
|
||||
|
||||
for i in 0 .. <result.len:
|
||||
result[i] = processBody(result[i], retFutureSym, subTypeIsVoid, tryStmt)
|
||||
result[i] = processBody(result[i], retFutureSym, subTypeIsVoid, nil)
|
||||
|
||||
proc getName(node: NimNode): string {.compileTime.} =
|
||||
case node.kind
|
||||
@@ -1378,8 +1378,8 @@ macro async*(prc: stmt): stmt {.immediate.} =
|
||||
result[6] = outerProcBody
|
||||
|
||||
#echo(treeRepr(result))
|
||||
if prc[0].getName == "test3":
|
||||
echo(toStrLit(result))
|
||||
#if prc[0].getName == "test":
|
||||
# echo(toStrLit(result))
|
||||
|
||||
proc recvLine*(socket: TAsyncFD): Future[string] {.async.} =
|
||||
## Reads a line of data from ``socket``. Returned future will complete once
|
||||
|
||||
@@ -82,6 +82,15 @@ proc test3(): Future[int] {.async.} =
|
||||
result = 2
|
||||
return
|
||||
|
||||
proc test4(): Future[int] {.async.} =
|
||||
try:
|
||||
discard await foo()
|
||||
raise newException(ValueError, "Test4")
|
||||
except OSError:
|
||||
result = 1
|
||||
except:
|
||||
result = 2
|
||||
|
||||
var x = test()
|
||||
assert x.read
|
||||
|
||||
@@ -90,3 +99,6 @@ assert x.read
|
||||
|
||||
var y = test3()
|
||||
assert y.read == 2
|
||||
|
||||
y = test4()
|
||||
assert y.read == 2
|
||||
|
||||
16
tests/async/tasynctry2.nim
Normal file
16
tests/async/tasynctry2.nim
Normal file
@@ -0,0 +1,16 @@
|
||||
discard """
|
||||
file: "tasynctry2.nim"
|
||||
errormsg: "\'yield\' cannot be used within \'try\' in a non-inlined iterator"
|
||||
line: 15
|
||||
"""
|
||||
import asyncdispatch
|
||||
|
||||
proc foo(): Future[bool] {.async.} = discard
|
||||
|
||||
proc test5(): Future[int] {.async.} =
|
||||
try:
|
||||
discard await foo()
|
||||
raise newException(ValueError, "Test5")
|
||||
except:
|
||||
discard await foo()
|
||||
result = 0
|
||||
Reference in New Issue
Block a user