1
1
using LoweredCodeUtils
2
2
using LoweredCodeUtils. JuliaInterpreter
3
+ using LoweredCodeUtils: caller_matches
3
4
using JuliaInterpreter: is_global_ref, is_quotenode
4
5
using Test
5
6
@@ -17,21 +18,15 @@ function hastrackedexpr(stmt; heads=LoweredCodeUtils.trackedheads)
17
18
haseval = false
18
19
if isa (stmt, Expr)
19
20
if stmt. head === :call
20
- haseval = JuliaInterpreter. hasarg (isequal (:eval ), stmt. args)
21
21
f = stmt. args[1 ]
22
- is_global_ref (f, Core, :_typebody! ) && return true , haseval
23
- if isdefined (Core, :_typebody! )
24
- is_quotenode (f, Core. _typebody!) && return true , haseval
25
- end
26
- is_global_ref (f, Core, :_setsuper! ) && return true , haseval
27
- if isdefined (Core, :_setsuper! )
28
- is_quotenode (f, Core. _setsuper!) && return true , haseval
29
- end
22
+ haseval = f === :eval || (caller_matches (f, Base, :getproperty ) && is_quotenode (stmt. args[2 ], :eval ))
23
+ caller_matches (f, Core, :_typebody! ) && return true , haseval
24
+ caller_matches (f, Core, :_setsuper! ) && return true , haseval
30
25
f === :include && return true , haseval
31
- end
32
- stmt. head ∈ heads && return true , haseval
33
- if stmt. head == :thunk
26
+ elseif stmt. head === :thunk
34
27
any (s-> any (hastrackedexpr (s; heads= heads)), stmt. args[1 ]. code) && return true , haseval
28
+ elseif stmt. head ∈ heads
29
+ return true , haseval
35
30
end
36
31
end
37
32
return false , haseval
87
82
k = rand ()
88
83
b = 2 * a + 5
89
84
end
90
- lwr = Meta. lower (ModSelective, ex)
91
- frame = JuliaInterpreter. prepare_thunk (ModSelective, lwr)
85
+ frame = JuliaInterpreter. prepare_thunk (ModSelective, ex)
92
86
src = frame. framecode. src
93
87
edges = CodeEdges (src)
94
88
# Check that the result of direct evaluation agrees with selective evaluation
127
121
a2 = 2
128
122
end
129
123
end
130
- lwr = Meta. lower (ModSelective, ex)
131
- frame = JuliaInterpreter. prepare_thunk (ModSelective, lwr)
124
+ frame = JuliaInterpreter. prepare_thunk (ModSelective, ex)
132
125
src = frame. framecode. src
133
126
edges = CodeEdges (src)
134
127
isrequired = lines_required (:a2 , src, edges)
149
142
y3 = 7
150
143
end
151
144
end
152
- lwr = Meta. lower (ModSelective, ex)
153
- frame = JuliaInterpreter. prepare_thunk (ModSelective, lwr)
145
+ frame = JuliaInterpreter. prepare_thunk (ModSelective, ex)
154
146
src = frame. framecode. src
155
147
edges = CodeEdges (src)
156
148
isrequired = lines_required (:a3 , src, edges)
171
163
Core. eval (ModEval, ex)
172
164
@test ModEval. foo () == 0
173
165
@test ModEval. bar () == 1
174
- lwr = Meta. lower (ModSelective, ex)
175
- frame = JuliaInterpreter. prepare_thunk (ModSelective, lwr)
166
+ frame = JuliaInterpreter. prepare_thunk (ModSelective, ex)
176
167
src = frame. framecode. src
177
168
edges = CodeEdges (src)
178
169
# Mark just the load of Core.eval
293
284
else
294
285
@test occursin (" No IR statement printer" , str)
295
286
end
287
+ # Works with Frames too
288
+ frame = JuliaInterpreter. prepare_thunk (ModSelective, ex)
289
+ edges = CodeEdges (frame. framecode. src)
290
+ LoweredCodeUtils. print_with_code (io, frame, edges)
291
+ str = String (take! (io))
292
+ if isdefined (Base. IRShow, :show_ir_stmt )
293
+ @test occursin (r" s: assigned on \[\d , \d +\] , depends on \[\d +\] , and used by \[\d +, \d +, \d +\] " , str)
294
+ @test count (occursin (" preds: [1, $(i- 1 ) , $(i+ 1 ) ], succs: [1, $(i+ 1 ) ]" , str) for i = 1 : length (src. code)) == 1
295
+ else
296
+ @test occursin (" No IR statement printer" , str)
297
+ end
296
298
end
297
299
end
0 commit comments