File tree Expand file tree Collapse file tree 3 files changed +168
-6
lines changed
Expand file tree Collapse file tree 3 files changed +168
-6
lines changed Original file line number Diff line number Diff 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
238240proc genOp (c: var Con ; t: PType ; kind: TTypeAttachedOp ; dest, ri: PNode ): PNode =
239241 var op = getAttachedOp (c.graph, t, kind)
Original file line number Diff line number Diff 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 (
Original file line number Diff line number Diff line change 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 ()
You can’t perform that action at this time.
0 commit comments