Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/injectdestructors.nim
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ proc genOp(c: var Con; op: PSym; dest: PNode): PNode =
else:
addrExp = newNodeIT(nkHiddenAddr, dest.info, makePtrType(c, dest.typ))
addrExp.add(dest)
result = newTree(nkCall, newSymNode(op), addrExp)
result = newTree(nkCall, newSymNode(op, dest.info), addrExp)

proc genOp(c: var Con; t: PType; kind: TTypeAttachedOp; dest, ri: PNode): PNode =
var op = getAttachedOp(c.graph, t, kind)
Expand Down
3 changes: 1 addition & 2 deletions lib/pure/asyncfutures.nim
Original file line number Diff line number Diff line change
Expand Up @@ -302,8 +302,7 @@ proc isInternal(entry: StackTraceEntry): bool =
# --excessiveStackTrace:off
const internals = [
"asyncdispatch.nim",
"asyncfutures.nim",
"threadimpl.nim", # XXX ?
"asyncfutures.nim"
]
let (filename, procname) = getFilenameProcname(entry)
for line in internals:
Expand Down
6 changes: 4 additions & 2 deletions lib/pure/asyncmacro.nim
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,12 @@ template await*[T](f: Future[T]): auto {.used.} =
template yieldFuture {.redefine.} = yield FutureBase()

when compiles(yieldFuture):
var internalTmpFuture: FutureBase = f
{.line: instantiationInfo(fullPaths = true).}:
let internalTmpFuture: FutureBase = f
yield internalTmpFuture
{.line: instantiationInfo(fullPaths = true).}:
(cast[typeof(f)](internalTmpFuture)).read()
let ff = cast[typeof(f)](internalTmpFuture)
ff.read()
else:
macro errorAsync(futureError: Future[T]) =
error(
Expand Down
161 changes: 161 additions & 0 deletions tests/arc/t24670.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
discard """
output: '''
2
1
2
1
2
1
'''
matrix: "--mm:arc; --mm:orc; --gc:refc"
"""

proc read() =
if true:
raise newException(ValueError, "foo")

block:
iterator count1(): int {.closure.} =
yield 1
read()

iterator count0(): int {.closure.} =
try:
yield 2
for x in count1(): echo x
except Exception:
raise

proc main =
for x in count0(): echo x

try:
main()
doAssert false
except ValueError as err:
let expected = """
t24670.nim(33) t24670
t24670.nim(30) main
t24670.nim(25) count0
t24670.nim(20) count1
t24670.nim(15) read
[[reraised from:
t24670.nim(33) t24670
t24670.nim(30) main
t24670.nim(22) count0
]]
"""
doAssert err.getStackTrace() == expected, err.getStackTrace()

block:
iterator count1(): int {.closure.} =
yield 1
read()

iterator count0(): int {.closure.} =
try:
yield 2
var it = count1
echo it()
echo it()
except Exception:
raise

proc main =
var it = count0
echo it()
echo it()

try:
main()
doAssert false
except ValueError as err:
let expected = """
t24670.nim(70) t24670
t24670.nim(67) main
t24670.nim(60) count0
t24670.nim(53) count1
t24670.nim(15) read
[[reraised from:
t24670.nim(70) t24670
t24670.nim(67) main
t24670.nim(55) count0
]]
"""
doAssert err.getStackTrace() == expected, err.getStackTrace()

block:
iterator count1(): int {.closure.} =
yield 1
read()

iterator count0(): int {.closure.} =
try:
yield 2
var foo = count1
while true:
echo foo()
if finished(foo): break
except Exception:
raise

proc main =
var foo = count0
while true:
echo foo()
if finished(foo): break

try:
main()
doAssert false
except ValueError as err:
let expected = """
t24670.nim(109) t24670
t24670.nim(105) main
t24670.nim(97) count0
t24670.nim(90) count1
t24670.nim(15) read
[[reraised from:
t24670.nim(109) t24670
t24670.nim(105) main
t24670.nim(92) count0
]]
"""
doAssert err.getStackTrace() == expected, err.getStackTrace()

block:
iterator count1(): int {.closure.} =
yield 1
read()

iterator count0(): int {.closure.} =
try:
var it = count1
yield it()
yield it()
finally:
var it = count1
yield it()
yield it()

proc main =
for x in count0():
discard x

try:
main()
doAssert false
except ValueError as err:
let expected = """
t24670.nim(146) t24670
t24670.nim(143) main
t24670.nim(139) count0
t24670.nim(129) count1
t24670.nim(15) read
[[reraised from:
t24670.nim(146) t24670
t24670.nim(143) main
t24670.nim(131) count0
]]
"""
doAssert err.getStackTrace() == expected, err.getStackTrace()