Skip to content

Commit f612188

Browse files
authored
remove more legacy code (#509)
We can eliminate this code since `:struct_type`/`:abstract_type`/`:primitive_type` expressions no longer exist in v1.6 and higher.
1 parent 94aadb9 commit f612188

File tree

5 files changed

+31
-82
lines changed

5 files changed

+31
-82
lines changed

docs/src/internals.md

+26-18
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ JuliaInterpreter.finish_and_return!(frame)
160160
# output
161161
162162
Test Passed
163+
Expression: x + y == 3
164+
Evaluated: 3 == 3
163165
```
164166

165167
## Toplevel code and world age
@@ -189,32 +191,38 @@ The reason for this error becomes clearer if we examine `frame` or look directly
189191
```julia
190192
julia> Meta.lower(Main, ex)
191193
:($(Expr(:thunk, CodeInfo(
194+
@ none within `top-level scope`
192195
1$(Expr(:thunk, CodeInfo(
193-
1global ##17#18
194-
const ##17#18
195-
$(Expr(:struct_type, Symbol("##17#18"), :((Core.svec)()), :((Core.svec)()), :(Core.Function), :((Core.svec)()), false, 0))
196-
└── return
196+
@ none within `top-level scope`
197+
1global var"#3#4"
198+
const var"#3#4"
199+
%3 = Core._structtype(Main, Symbol("#3#4"), Core.svec(), Core.svec(), Core.svec(), false, 0)
200+
var"#3#4" = %3
201+
│ Core._setsuper!(var"#3#4", Core.Function)
202+
│ Core._typebody!(var"#3#4", Core.svec())
203+
└── return nothing
197204
)))
198-
%2 = (Core.svec)(##17#18, Core.Any)
199-
%3 = (Core.svec)()
200-
%4 = (Core.svec)(%2, %3)
201-
$(Expr(:method, false, :(%4), CodeInfo(quote
202-
(Core.apply_type)(Base.Val, 2)
203-
(%1)()
204-
(Base.literal_pow)(^, x, %2)
205-
return %3
206-
end)))
207-
#17 = %new(##17#18)
208-
%7 = #17
209-
%8 = (Base.vect)(1, 2, 3)
205+
%2 = Core.svec(var"#3#4", Core.Any)
206+
%3 = Core.svec()
207+
%4 = Core.svec(%2, %3, $(QuoteNode(:(#= REPL[18]:1 =#))))
208+
$(Expr(:method, false, :(%4), CodeInfo(
209+
@ REPL[18]:1 within `none`
210+
1%1 = Core.apply_type(Base.Val, 2)
211+
%2 = (%1)()
212+
%3 = Base.literal_pow(^, x, %2)
213+
└── return %3
214+
)))
215+
#3 = %new(var"#3#4")
216+
%7 = #3
217+
%8 = Base.vect(1, 2, 3)
210218
%9 = map(%7, %8)
211219
└── return %9
212220
))))
213221
```
214222

215223
All of the code before the `%7` line is devoted to defining the anonymous function `x->x^2`:
216-
it creates a new "anonymous type" (here written as `##17#18`), and then defines a "call
217-
function" for this type, equivalent to `(##17#18)(x) = x^2`.
224+
it creates a new "anonymous type" (here written as `var"#3#4"`), and then defines a "call
225+
function" for this type, equivalent to `(var"#3#4")(x) = x^2`.
218226

219227
In some cases one can fix this simply by indicating that we want to run this frame at top level:
220228

src/interpret.jl

-38
Original file line numberDiff line numberDiff line change
@@ -320,38 +320,6 @@ function inplace_lookup!(ex, i, frame)
320320
return ex
321321
end
322322

323-
function evaluate_structtype(@nospecialize(recurse), frame, node)
324-
grsvec!(ex::Expr) = (ex.args[1] = GlobalRef(Core, :svec); return ex)
325-
326-
name, mod = structname(frame, node)
327-
supertype = lookup_or_eval(recurse, frame, node.args[4])::Type
328-
ismutable = node.args[6]::Bool
329-
ninit = node.args[7]::Int
330-
newstructexpr = Expr(:struct_type, name, nothing, nothing, supertype, nothing, ismutable, ninit)
331-
for idx in (2, 3, 5)
332-
ex = newstructexpr.args[idx] = grsvec!(copy(node.args[idx]::Expr))
333-
for i = 2:length(ex.args)
334-
inplace_lookup!(ex, i, frame)
335-
end
336-
end
337-
Core.eval(mod, newstructexpr)
338-
end
339-
340-
function evaluate_abstracttype(@nospecialize(recurse), frame, node)
341-
name, mod = structname(frame, node)
342-
params = lookup_or_eval(recurse, frame, node.args[2])::SimpleVector
343-
supertype = lookup_or_eval(recurse, frame, node.args[3])::Type
344-
Core.eval(mod, Expr(:abstract_type, name, params, supertype))
345-
end
346-
347-
function evaluate_primitivetype(@nospecialize(recurse), frame, node)
348-
name, mod = structname(frame, node)
349-
params = lookup_or_eval(recurse, frame, node.args[2])::SimpleVector
350-
nbits = node.args[3]::Int
351-
supertype = lookup_or_eval(recurse, frame, node.args[4])::Type
352-
Core.eval(mod, Expr(:primitive_type, name, params, nbits, supertype))
353-
end
354-
355323
function do_assignment!(frame, @nospecialize(lhs), @nospecialize(rhs))
356324
code, data = frame.framecode, frame.framedata
357325
if isa(lhs, SSAValue)
@@ -503,12 +471,6 @@ function step_expr!(@nospecialize(recurse), frame, @nospecialize(node), istoplev
503471
elseif istoplevel
504472
if node.head === :method && length(node.args) > 1
505473
evaluate_methoddef(frame, node)
506-
elseif node.head === :struct_type
507-
evaluate_structtype(recurse, frame, node)
508-
elseif node.head === :abstract_type
509-
evaluate_abstracttype(recurse, frame, node)
510-
elseif node.head === :primitive_type
511-
evaluate_primitivetype(recurse, frame, node)
512474
elseif node.head === :module
513475
error("this should have been handled by split_expressions")
514476
elseif node.head === :using || node.head === :import || node.head === :export

src/optimize.jl

+5-7
Original file line numberDiff line numberDiff line change
@@ -218,14 +218,12 @@ function optimize!(code::CodeInfo, scope)
218218
for (i, stmt) in enumerate(old_code)
219219
loc = old_codelocs[i]
220220
if isa(stmt, Expr)
221-
if !is_type_definition(stmt) # https://github.com/timholy/Revise.jl/issues/417
221+
inner = extract_inner_call!(stmt, length(new_code)+1)
222+
while inner !== nothing
223+
push!(new_code, inner)
224+
push!(new_codelocs, loc)
225+
ssainc[i] += 1
222226
inner = extract_inner_call!(stmt, length(new_code)+1)
223-
while inner !== nothing
224-
push!(new_code, inner)
225-
push!(new_codelocs, loc)
226-
ssainc[i] += 1
227-
inner = extract_inner_call!(stmt, length(new_code)+1)
228-
end
229227
end
230228
end
231229
push!(new_code, stmt)

src/precompile.jl

-5
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ function _precompile_()
55
@assert precompile(Tuple{typeof(get_call_framecode), Vector{Any}, FrameCode, Int})
66
@assert precompile(evaluate_call_recurse!, (Function, Frame, Expr))
77
@assert precompile(evaluate_call_compiled!, (Compiled, Frame, Expr))
8-
for f in (evaluate_structtype,
9-
evaluate_abstracttype,
10-
evaluate_primitivetype)
11-
@assert precompile(Tuple{typeof(f), Any, Frame, Expr})
12-
end
138
@assert precompile(Tuple{typeof(evaluate_foreigncall), Any, Frame, Expr})
149
@assert precompile(Tuple{typeof(evaluate_methoddef), Frame, Expr})
1510
@assert precompile(Tuple{typeof(lookup_global_refs!), Expr})

src/utils.jl

-14
Original file line numberDiff line numberDiff line change
@@ -58,25 +58,11 @@ pc_expr(framecode::FrameCode, pc) = pc_expr(framecode.src, pc)
5858
pc_expr(frame::Frame, pc) = pc_expr(frame.framecode, pc)
5959
pc_expr(frame::Frame) = pc_expr(frame, frame.pc)
6060

61-
function is_type_definition(stmt)
62-
if isa(stmt, Expr)
63-
head = stmt.head
64-
return head === :struct_type || head === :abstract_type || head === :primitive_type
65-
end
66-
return false
67-
end
68-
6961
function find_used(code::CodeInfo)
7062
used = BitSet()
7163
stmts = code.code
7264
for stmt in stmts
7365
scan_ssa_use!(used, stmt)
74-
if is_type_definition(stmt)
75-
# these are missed by Core.Compiler.userefs, see https://github.com/JuliaLang/julia/pull/30936
76-
for a in stmt.args
77-
scan_ssa_use!(used, a)
78-
end
79-
end
8066
end
8167
return used
8268
end

0 commit comments

Comments
 (0)