Skip to content

Commit 6c2e56b

Browse files
committed
Fix #24670; Closure iterator wrong line info traceback under ORC
1 parent 6656084 commit 6c2e56b

File tree

3 files changed

+168
-6
lines changed

3 files changed

+168
-6
lines changed

compiler/injectdestructors.nim

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,9 @@ proc genOp(c: var Con; op: PSym; dest: PNode): PNode =
233233
else:
234234
addrExp = newNodeIT(nkHiddenAddr, dest.info, makePtrType(c, dest.typ))
235235
addrExp.add(dest)
236-
result = newTree(nkCall, newSymNode(op), addrExp)
236+
result = newTreeI(nkCall, dest.info)
237+
result.add newSymNode(op)
238+
result.add addrExp
237239

238240
proc genOp(c: var Con; t: PType; kind: TTypeAttachedOp; dest, ri: PNode): PNode =
239241
var op = getAttachedOp(c.graph, t, kind)

lib/pure/asyncmacro.nim

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,15 @@ template await*(f: typed): untyped {.used.} =
162162
static:
163163
error "await expects Future[T], got " & $typeof(f)
164164

165-
template await*[T](f: Future[T]): auto {.used.} =
165+
template await*[T](f: Future[T]): auto {.used, callsite.} =
166166
when not defined(nimHasTemplateRedefinitionPragma):
167167
{.pragma: redefine.}
168168
template yieldFuture {.redefine.} = yield FutureBase()
169169

170170
when compiles(yieldFuture):
171-
var internalTmpFuture: FutureBase = f
172-
yield internalTmpFuture
173-
{.line: instantiationInfo(fullPaths = true).}:
174-
(cast[typeof(f)](internalTmpFuture)).read()
171+
let fut = f
172+
yield FutureBase(fut)
173+
fut.read()
175174
else:
176175
macro errorAsync(futureError: Future[T]) =
177176
error(

tests/arc/t24670.nim

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
discard """
2+
output: '''
3+
2
4+
1
5+
2
6+
1
7+
2
8+
1
9+
'''
10+
matrix: "--mm:arc; --mm:orc; --gc:refc"
11+
"""
12+
13+
proc read() =
14+
if true:
15+
raise newException(ValueError, "foo")
16+
17+
block:
18+
iterator count1(): int {.closure.} =
19+
yield 1
20+
read()
21+
22+
iterator count0(): int {.closure.} =
23+
try:
24+
yield 2
25+
for x in count1(): echo x
26+
except Exception:
27+
raise
28+
29+
proc main =
30+
for x in count0(): echo x
31+
32+
try:
33+
main()
34+
doAssert false
35+
except ValueError as err:
36+
let expected = """
37+
t24670.nim(33) t24670
38+
t24670.nim(30) main
39+
t24670.nim(25) count0
40+
t24670.nim(20) count1
41+
t24670.nim(15) read
42+
[[reraised from:
43+
t24670.nim(33) t24670
44+
t24670.nim(30) main
45+
t24670.nim(22) count0
46+
]]
47+
"""
48+
doAssert err.getStackTrace() == expected, err.getStackTrace()
49+
50+
block:
51+
iterator count1(): int {.closure.} =
52+
yield 1
53+
read()
54+
55+
iterator count0(): int {.closure.} =
56+
try:
57+
yield 2
58+
var it = count1
59+
echo it()
60+
echo it()
61+
except Exception:
62+
raise
63+
64+
proc main =
65+
var it = count0
66+
echo it()
67+
echo it()
68+
69+
try:
70+
main()
71+
doAssert false
72+
except ValueError as err:
73+
let expected = """
74+
t24670.nim(70) t24670
75+
t24670.nim(67) main
76+
t24670.nim(60) count0
77+
t24670.nim(53) count1
78+
t24670.nim(15) read
79+
[[reraised from:
80+
t24670.nim(70) t24670
81+
t24670.nim(67) main
82+
t24670.nim(55) count0
83+
]]
84+
"""
85+
doAssert err.getStackTrace() == expected, err.getStackTrace()
86+
87+
block:
88+
iterator count1(): int {.closure.} =
89+
yield 1
90+
read()
91+
92+
iterator count0(): int {.closure.} =
93+
try:
94+
yield 2
95+
var foo = count1
96+
while true:
97+
echo foo()
98+
if finished(foo): break
99+
except Exception:
100+
raise
101+
102+
proc main =
103+
var foo = count0
104+
while true:
105+
echo foo()
106+
if finished(foo): break
107+
108+
try:
109+
main()
110+
doAssert false
111+
except ValueError as err:
112+
let expected = """
113+
t24670.nim(109) t24670
114+
t24670.nim(105) main
115+
t24670.nim(97) count0
116+
t24670.nim(90) count1
117+
t24670.nim(15) read
118+
[[reraised from:
119+
t24670.nim(109) t24670
120+
t24670.nim(105) main
121+
t24670.nim(92) count0
122+
]]
123+
"""
124+
doAssert err.getStackTrace() == expected, err.getStackTrace()
125+
126+
block:
127+
iterator count1(): int {.closure.} =
128+
yield 1
129+
read()
130+
131+
iterator count0(): int {.closure.} =
132+
try:
133+
var it = count1
134+
yield it()
135+
yield it()
136+
finally:
137+
var it = count1
138+
yield it()
139+
yield it()
140+
141+
proc main =
142+
for x in count0():
143+
discard x
144+
145+
try:
146+
main()
147+
doAssert false
148+
except ValueError as err:
149+
let expected = """
150+
t24670.nim(146) t24670
151+
t24670.nim(143) main
152+
t24670.nim(139) count0
153+
t24670.nim(129) count1
154+
t24670.nim(15) read
155+
[[reraised from:
156+
t24670.nim(146) t24670
157+
t24670.nim(143) main
158+
t24670.nim(131) count0
159+
]]
160+
"""
161+
doAssert err.getStackTrace() == expected, err.getStackTrace()

0 commit comments

Comments
 (0)