@@ -128,11 +128,25 @@ function fn(x)
128
128
end
129
129
```
130
130
"""
131
- macro trace (expr)
131
+ macro trace (args... )
132
+ track_numbers = true
133
+ expr = first (args)
134
+ if length (args) > 1 && Meta. isexpr (args[1 ], :(= ))
135
+ tn_expr = args[1 ]
136
+ tn_expr. args[1 ] == :track_numbers ||
137
+ error (" @trace supports setting track_numbers, but got $(tn_expr) " )
138
+
139
+ track_numbers = tn_expr. args[2 ]
140
+ expr = only (args[2 : end ])
141
+ else
142
+ expr = only (args)
143
+ end
144
+ track_numbers = track_numbers ? Number : Union{}
132
145
expr = macroexpand (__module__, expr)
146
+
133
147
if Meta. isexpr (expr, :(= ))
134
148
if Meta. isexpr (expr. args[2 ], :if )
135
- return esc (trace_if_with_returns (__module__, expr))
149
+ return esc (trace_if_with_returns (__module__, expr; track_numbers ))
136
150
end
137
151
end
138
152
Meta. isexpr (expr, :call ) && return esc (trace_call (__module__, expr))
@@ -142,12 +156,12 @@ macro trace(expr)
142
156
call = Expr (:call , fname, args... )
143
157
return esc (trace_call (__module__, call))
144
158
end
145
- Meta. isexpr (expr, :if ) && return esc (trace_if (__module__, expr))
146
- Meta. isexpr (expr, :for ) && return (esc (trace_for (__module__, expr)))
159
+ Meta. isexpr (expr, :if ) && return esc (trace_if (__module__, expr; track_numbers ))
160
+ Meta. isexpr (expr, :for ) && return (esc (trace_for (__module__, expr; track_numbers )))
147
161
return error (" Only `if-elseif-else` blocks are currently supported by `@trace`" )
148
162
end
149
163
150
- function trace_for (mod, expr)
164
+ function trace_for (mod, expr; track_numbers )
151
165
Meta. isexpr (expr, :for , 2 ) || error (" expected for expr" )
152
166
assign, body = expr. args
153
167
@@ -216,7 +230,9 @@ function trace_for(mod, expr)
216
230
($ counter + 1 , results_... )
217
231
end
218
232
219
- $ (ReactantCore). traced_while (cond_fn, body_fn, args)
233
+ $ (ReactantCore). traced_while (
234
+ cond_fn, body_fn, args; track_numbers= $ (track_numbers)
235
+ )
220
236
end
221
237
end
222
238
@@ -232,9 +248,9 @@ function trace_for(mod, expr)
232
248
end
233
249
234
250
# ... = if ... style expressions
235
- function trace_if_with_returns (mod, expr)
251
+ function trace_if_with_returns (mod, expr; track_numbers )
236
252
new_expr, _, all_check_vars = trace_if (
237
- mod, expr. args[2 ]; store_last_line= expr. args[1 ], depth= 1
253
+ mod, expr. args[2 ]; store_last_line= expr. args[1 ], depth= 1 , track_numbers
238
254
)
239
255
cond_name = first (all_check_vars)
240
256
original_cond = expr. args[2 ]. args[1 ]
@@ -249,7 +265,7 @@ function trace_if_with_returns(mod, expr)
249
265
end
250
266
end
251
267
252
- function trace_if (mod, expr; store_last_line= nothing , depth= 0 )
268
+ function trace_if (mod, expr; store_last_line= nothing , depth= 0 , track_numbers )
253
269
discard_vars_from_expansion = []
254
270
original_expr = expr
255
271
@@ -260,7 +276,9 @@ function trace_if(mod, expr; store_last_line=nothing, depth=0)
260
276
expr = MacroTools. prewalk (expr) do x
261
277
counter += 1
262
278
if x isa Expr && x. head == :if && counter > 1
263
- ex_new, dv, _ = trace_if (mod, x; store_last_line, depth= depth + 1 )
279
+ ex_new, dv, _ = trace_if (
280
+ mod, x; store_last_line, depth= depth + 1 , track_numbers
281
+ )
264
282
append! (discard_vars_from_expansion, dv)
265
283
return ex_new
266
284
end
@@ -300,7 +318,7 @@ function trace_if(mod, expr; store_last_line=nothing, depth=0)
300
318
if ! (expr. args[3 ] isa Expr) || expr. args[3 ]. head != :elseif
301
319
expr. args[3 ], [], nothing
302
320
else
303
- trace_if (mod, expr. args[3 ]; store_last_line, depth= depth + 1 )
321
+ trace_if (mod, expr. args[3 ]; store_last_line, depth= depth + 1 , track_numbers )
304
322
end
305
323
elseif length (expr. args) == 2
306
324
tmp_expr = []
@@ -388,7 +406,8 @@ function trace_if(mod, expr; store_last_line=nothing, depth=0)
388
406
$ (cond_name),
389
407
$ (true_branch_fn_name),
390
408
$ (false_branch_fn_name),
391
- ($ (all_input_vars... ),),
409
+ ($ (all_input_vars... ),);
410
+ track_numbers= $ (track_numbers),
392
411
)
393
412
end
394
413
@@ -458,7 +477,7 @@ function remove_shortcircuiting(expr)
458
477
end
459
478
460
479
# Generate this dummy function and later we remove it during tracing
461
- function traced_if (cond, true_fn, false_fn, args)
480
+ function traced_if (cond, true_fn, false_fn, args; track_numbers )
462
481
return cond ? true_fn (args) : false_fn (args)
463
482
end
464
483
0 commit comments