Skip to content

Commit 7d21908

Browse files
authored
Fix invalidations from extending ==(::Any, ::SomeType) (#408)
1 parent 27be397 commit 7d21908

File tree

10 files changed

+123
-116
lines changed

10 files changed

+123
-116
lines changed

bin/generate_builtins.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
200200
fva = []
201201
minmin, maxmax = typemax(Int), 0
202202
for fsym in names(Core.Intrinsics)
203-
fsym == :Intrinsics && continue
203+
fsym === :Intrinsics && continue
204204
isdefined(Base, fsym) || continue
205205
f = getfield(Base, fsym)
206206
id = reinterpret(Int32, f) + 1

src/breakpoints.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,9 @@ The supported states are:
336336
"""
337337
function break_on(states::Vararg{Symbol})
338338
for state in states
339-
if state == :error
339+
if state === :error
340340
break_on_error[] = true
341-
elseif state == :throw
341+
elseif state === :throw
342342
break_on_throw[] = true
343343
else
344344
throw(ArgumentError(string("unsupported state :", state)))
@@ -354,9 +354,9 @@ See [`break_on`](@ref) for a description of valid states.
354354
"""
355355
function break_off(states::Vararg{Symbol})
356356
for state in states
357-
if state == :error
357+
if state === :error
358358
break_on_error[] = false
359-
elseif state == :throw
359+
elseif state === :throw
360360
break_on_throw[] = false
361361
else
362362
throw(ArgumentError(string("unsupported state :", state)))

src/builtins.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
8080
if !expand
8181
return Some{Any}(Core._apply_iterate(argswrapped...))
8282
end
83-
@assert argswrapped[1] == Core.iterate || argswrapped[1] === Core.Compiler.iterate || argswrapped[1] == Base.iterate "cannot handle `_apply_iterate` with non iterate as first argument, got $(argswrapped[1]), $(typeof(argswrapped[1]))"
83+
@assert argswrapped[1] === Core.iterate || argswrapped[1] === Core.Compiler.iterate || argswrapped[1] === Base.iterate "cannot handle `_apply_iterate` with non iterate as first argument, got $(argswrapped[1]), $(typeof(argswrapped[1]))"
8484
new_expr = Expr(:call, argswrapped[2])
8585
popfirst!(argswrapped) # pop the iterate
8686
popfirst!(argswrapped) # pop the function

src/commands.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ end
380380

381381
function maybe_step_through_nkw_meta!(frame)
382382
stmt = pc_expr(frame)
383-
if stmt === nothing || (isexpr(stmt, :meta) && stmt.args[1] == :nkw)
383+
if stmt === nothing || (isexpr(stmt, :meta) && (stmt::Expr).args[1] === :nkw)
384384
@assert frame.pc == 1
385385
frame.pc += 1
386386
end
@@ -421,23 +421,23 @@ function debug_command(@nospecialize(recurse), frame::Frame, cmd::Symbol, rootis
421421
istoplevel = rootistoplevel && frame.caller === nothing
422422
cmd0 = cmd
423423
is_si = false
424-
if cmd == :si
424+
if cmd === :si
425425
stmt = pc_expr(frame)
426426
cmd = is_call(stmt) ? :s : :se
427427
is_si = true
428428
end
429429
try
430-
cmd == :nc && return nicereturn!(recurse, frame, next_call!(recurse, frame, istoplevel), rootistoplevel)
431-
cmd == :n && return maybe_reset_frame!(recurse, frame, next_line!(recurse, frame, istoplevel), rootistoplevel)
432-
cmd == :se && return maybe_reset_frame!(recurse, frame, step_expr!(recurse, frame, istoplevel), rootistoplevel)
433-
cmd == :until && return maybe_reset_frame!(recurse, frame, until_line!(recurse, frame, line, istoplevel), rootistoplevel)
430+
cmd === :nc && return nicereturn!(recurse, frame, next_call!(recurse, frame, istoplevel), rootistoplevel)
431+
cmd === :n && return maybe_reset_frame!(recurse, frame, next_line!(recurse, frame, istoplevel), rootistoplevel)
432+
cmd === :se && return maybe_reset_frame!(recurse, frame, step_expr!(recurse, frame, istoplevel), rootistoplevel)
433+
cmd === :until && return maybe_reset_frame!(recurse, frame, until_line!(recurse, frame, line, istoplevel), rootistoplevel)
434434

435435
enter_generated = false
436-
if cmd == :sg
436+
if cmd === :sg
437437
enter_generated = true
438438
cmd = :s
439439
end
440-
if cmd == :s
440+
if cmd === :s
441441
pc = maybe_next_call!(recurse, frame, istoplevel)
442442
(isa(pc, BreakpointRef) || pc === nothing) && return maybe_reset_frame!(recurse, frame, pc, rootistoplevel)
443443
is_si || maybe_step_through_kwprep!(recurse, frame, istoplevel)
@@ -456,7 +456,7 @@ function debug_command(@nospecialize(recurse), frame::Frame, cmd::Symbol, rootis
456456
end
457457
if isa(ret, BreakpointRef)
458458
newframe = leaf(frame)
459-
cmd0 == :si && return newframe, ret
459+
cmd0 === :si && return newframe, ret
460460
is_si || (newframe = maybe_step_through_wrapper!(recurse, newframe))
461461
is_si || maybe_step_through_kwprep!(recurse, newframe, istoplevel)
462462
return newframe, BreakpointRef(newframe.framecode, 0)
@@ -466,15 +466,15 @@ function debug_command(@nospecialize(recurse), frame::Frame, cmd::Symbol, rootis
466466
frame.pc += 1
467467
return frame, frame.pc
468468
end
469-
if cmd == :c
469+
if cmd === :c
470470
r = root(frame)
471471
ret = finish_stack!(recurse, r, rootistoplevel)
472472
return isa(ret, BreakpointRef) ? (leaf(r), ret) : nothing
473473
end
474-
cmd == :finish && return maybe_reset_frame!(recurse, frame, finish!(recurse, frame, istoplevel), rootistoplevel)
474+
cmd === :finish && return maybe_reset_frame!(recurse, frame, finish!(recurse, frame, istoplevel), rootistoplevel)
475475
catch err
476476
frame = unwind_exception(frame, err)
477-
if cmd == :c
477+
if cmd === :c
478478
return debug_command(recurse, frame, :c, istoplevel)
479479
else
480480
return debug_command(recurse, frame, :nc, istoplevel)

src/construct.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,9 @@ function prepare_framecode(method::Method, @nospecialize(argtypes); enter_genera
182182
code = code::CodeInfo
183183
# Currenly, our strategy to deal with llvmcall can't handle parametric functions
184184
# (the "mini interpreter" runs in module scope, not method scope)
185-
if (!isempty(lenv) && (hasarg(isequal(:llvmcall), code.code) ||
185+
if (!isempty(lenv) && (hasarg(isidentical(:llvmcall), code.code) ||
186186
hasarg(a->is_global_ref(a, Base, :llvmcall), code.code))) ||
187-
hasarg(isequal(:iolock_begin), code.code)
187+
hasarg(isidentical(:iolock_begin), code.code)
188188
return Compiled()
189189
end
190190
framecode = FrameCode(method, code; generator=generator)
@@ -433,9 +433,9 @@ split_expressions!(modexs, docexprs, mod::Module, ex::Expr; kwargs...) =
433433
function split_expressions!(modexs, docexprs, lex::Expr, mod::Module, ex::Expr; extract_docexprs=false, filename="toplevel")
434434
# lex is the expression we'll lower; it will accumulate LineNumberNodes and a
435435
# single top-level expression. We split blocks, module defs, etc.
436-
if ex.head == :toplevel || ex.head == :block
436+
if ex.head === :toplevel || ex.head === :block
437437
split_expressions!(modexs, docexprs, lex, mod, ex.args; extract_docexprs=extract_docexprs, filename=filename)
438-
elseif ex.head == :module
438+
elseif ex.head === :module
439439
newname = ex.args[2]::Symbol
440440
if isdefined(mod, newname)
441441
newmod = getfield(mod, newname)
@@ -625,9 +625,9 @@ function extract_args(__module__, ex0)
625625
$args, $kwargs = $separate_kwargs($(ex0.args[2:end]...))
626626
tuple(Core.kwfunc($arg1), $kwargs, $arg1, $args...)
627627
end
628-
elseif ex0.head == :.
628+
elseif ex0.head === :.
629629
return Expr(:tuple, :getproperty, ex0.args...)
630-
elseif ex0.head == :(<:)
630+
elseif ex0.head === :(<:)
631631
return Expr(:tuple, :(<:), ex0.args...)
632632
else
633633
return Expr(:tuple,
@@ -640,14 +640,14 @@ function extract_args(__module__, ex0)
640640
ex = Meta.lower(__module__, ex0)
641641
if !isa(ex, Expr)
642642
return error("expression is not a function call or symbol")
643-
elseif ex.head == :call
643+
elseif ex.head === :call
644644
return Expr(:tuple,
645645
map(x->isexpr(x, :parameters) ? QuoteNode(x) : x, ex.args)...)
646-
elseif ex.head == :body
646+
elseif ex.head === :body
647647
a1 = ex.args[1]
648648
if isexpr(a1, :call)
649649
a11 = a1.args[1]
650-
if a11 == :setindex!
650+
if a11 === :setindex!
651651
return Expr(:tuple,
652652
map(x->isexpr(x, :parameters) ? QuoteNode(x) : x, arg.args)...)
653653
end

src/interpret.jl

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ end
1111

1212
function lookup_expr(frame, e::Expr)
1313
head = e.head
14-
head == :the_exception && return frame.framedata.last_exception[]
15-
if head == :static_parameter
14+
head === :the_exception && return frame.framedata.last_exception[]
15+
if head === :static_parameter
1616
arg = e.args[1]::Int
1717
if isassigned(frame.framedata.sparams, arg)
1818
return frame.framedata.sparams[arg]
@@ -21,7 +21,7 @@ function lookup_expr(frame, e::Expr)
2121
throw(UndefVarError(syms[arg]))
2222
end
2323
end
24-
head == :boundscheck && length(e.args) == 0 && return true
24+
head === :boundscheck && length(e.args) == 0 && return true
2525
error("invalid lookup expr ", e)
2626
end
2727

@@ -86,7 +86,7 @@ function lookup_or_eval(@nospecialize(recurse), frame, @nospecialize(node))
8686
for arg in node.args
8787
push!(ex.args, lookup_or_eval(recurse, frame, arg))
8888
end
89-
if ex.head == :call
89+
if ex.head === :call
9090
f = ex.args[1]
9191
if f === Core.svec
9292
return Core.svec(ex.args[2:end]...)
@@ -124,9 +124,9 @@ function resolvefc(frame, @nospecialize(expr))
124124
isa(expr, Tuple{Symbol,String}) && return expr
125125
isa(expr, Tuple{String,Symbol}) && return expr
126126
if isexpr(expr, :call)
127-
a = expr.args[1]
128-
(isa(a, QuoteNode) && a.value == Core.tuple) || error("unexpected ccall to ", expr)
129-
return Expr(:call, GlobalRef(Core, :tuple), expr.args[2:end]...)
127+
a = (expr::Expr).args[1]
128+
(isa(a, QuoteNode) && a.value === Core.tuple) || error("unexpected ccall to ", expr)
129+
return Expr(:call, GlobalRef(Core, :tuple), (expr::Expr).args[2:end]...)
130130
end
131131
error("unexpected ccall to ", expr)
132132
end
@@ -154,7 +154,7 @@ function evaluate_foreigncall(frame::Frame, call_expr::Expr)
154154
arg = args[i]
155155
args[i] = isa(arg, Symbol) ? QuoteNode(arg) : arg
156156
end
157-
head == :cfunction && (args[2] = QuoteNode(args[2]))
157+
head === :cfunction && (args[2] = QuoteNode(args[2]))
158158
scope = frame.framecode.scope
159159
data = frame.framedata
160160
if !isempty(data.sparams) && scope isa Method
@@ -369,35 +369,35 @@ maybe_assign!(frame, @nospecialize(val)) = maybe_assign!(frame, pc_expr(frame),
369369

370370
function eval_rhs(@nospecialize(recurse), frame, node::Expr)
371371
head = node.head
372-
if head == :new
372+
if head === :new
373373
mod = moduleof(frame)
374374
args = [@lookup(mod, frame, arg) for arg in node.args]
375375
T = popfirst!(args)
376376
rhs = ccall(:jl_new_structv, Any, (Any, Ptr{Any}, UInt32), T, args, length(args))
377377
return rhs
378-
elseif head == :splatnew # Julia 1.2+
378+
elseif head === :splatnew # Julia 1.2+
379379
mod = moduleof(frame)
380380
rhs = ccall(:jl_new_structt, Any, (Any, Any), @lookup(mod, frame, node.args[1]), @lookup(mod, frame, node.args[2]))
381381
return rhs
382-
elseif head == :isdefined
382+
elseif head === :isdefined
383383
return check_isdefined(frame, node.args[1])
384-
elseif head == :call
384+
elseif head === :call
385385
# here it's crucial to avoid dynamic dispatch
386386
isa(recurse, Compiled) && return evaluate_call_compiled!(recurse, frame, node)
387387
return evaluate_call_recurse!(recurse, frame, node)
388-
elseif head == :foreigncall || head == :cfunction
388+
elseif head === :foreigncall || head === :cfunction
389389
return evaluate_foreigncall(frame, node)
390-
elseif head == :copyast
390+
elseif head === :copyast
391391
val = (node.args[1]::QuoteNode).value
392392
return isa(val, Expr) ? copy(val) : val
393-
elseif head == :enter
393+
elseif head === :enter
394394
return length(frame.framedata.exception_frames)
395-
elseif head == :boundscheck
395+
elseif head === :boundscheck
396396
return true
397-
elseif head == :meta || head == :inbounds || head == (@static VERSION >= v"1.2.0-DEV.462" ? :loopinfo : :simdloop) ||
398-
head == :gc_preserve_begin || head == :gc_preserve_end
397+
elseif head === :meta || head === :inbounds || head == (@static VERSION >= v"1.2.0-DEV.462" ? :loopinfo : :simdloop) ||
398+
head === :gc_preserve_begin || head === :gc_preserve_end
399399
return nothing
400-
elseif head == :method && length(node.args) == 1
400+
elseif head === :method && length(node.args) == 1
401401
return evaluate_methoddef(frame, node)
402402
end
403403
return lookup_expr(frame, node)
@@ -437,7 +437,7 @@ function step_expr!(@nospecialize(recurse), frame, @nospecialize(node), istoplev
437437
# _location[location_key] = get(_location, location_key, 0) + 1
438438
try
439439
if isa(node, Expr)
440-
if node.head == :(=)
440+
if node.head === :(=)
441441
lhs, rhs = node.args
442442
if isa(rhs, Expr)
443443
rhs = eval_rhs(recurse, frame, rhs)
@@ -446,40 +446,40 @@ function step_expr!(@nospecialize(recurse), frame, @nospecialize(node), istoplev
446446
end
447447
isa(rhs, BreakpointRef) && return rhs
448448
do_assignment!(frame, lhs, rhs)
449-
elseif node.head == :gotoifnot
449+
elseif node.head === :gotoifnot
450450
arg = @lookup(frame, node.args[1])
451451
if !isa(arg, Bool)
452452
throw(TypeError(nameof(frame), "if", Bool, node.args[1]))
453453
end
454454
if !arg
455455
return (frame.pc = node.args[2]::Int)
456456
end
457-
elseif node.head == :enter
457+
elseif node.head === :enter
458458
rhs = node.args[1]
459459
push!(data.exception_frames, rhs)
460-
elseif node.head == :leave
460+
elseif node.head === :leave
461461
for _ = 1:node.args[1]
462462
pop!(data.exception_frames)
463463
end
464-
elseif node.head == :pop_exception
464+
elseif node.head === :pop_exception
465465
n = lookup_var(frame, node.args[1])
466466
deleteat!(data.exception_frames, n+1:length(data.exception_frames))
467-
elseif node.head == :return
467+
elseif node.head === :return
468468
return nothing
469469
elseif istoplevel
470-
if node.head == :method && length(node.args) > 1
470+
if node.head === :method && length(node.args) > 1
471471
evaluate_methoddef(frame, node)
472-
elseif node.head == :struct_type
472+
elseif node.head === :struct_type
473473
evaluate_structtype(recurse, frame, node)
474-
elseif node.head == :abstract_type
474+
elseif node.head === :abstract_type
475475
evaluate_abstracttype(recurse, frame, node)
476-
elseif node.head == :primitive_type
476+
elseif node.head === :primitive_type
477477
evaluate_primitivetype(recurse, frame, node)
478-
elseif node.head == :module
478+
elseif node.head === :module
479479
error("this should have been handled by split_expressions")
480-
elseif node.head == :using || node.head == :import || node.head == :export
480+
elseif node.head === :using || node.head === :import || node.head === :export
481481
Core.eval(moduleof(frame), node)
482-
elseif node.head == :const
482+
elseif node.head === :const
483483
g = node.args[1]
484484
if isa(g, GlobalRef)
485485
mod, name = g.module, g.name
@@ -489,7 +489,7 @@ function step_expr!(@nospecialize(recurse), frame, @nospecialize(node), istoplev
489489
if VERSION >= v"1.2.0-DEV.239" # depends on https://github.com/JuliaLang/julia/pull/30893
490490
Core.eval(mod, Expr(:const, name))
491491
end
492-
elseif node.head == :thunk
492+
elseif node.head === :thunk
493493
newframe = prepare_thunk(moduleof(frame), node)
494494
if isa(recurse, Compiled)
495495
finish!(recurse, newframe, true)
@@ -500,9 +500,9 @@ function step_expr!(@nospecialize(recurse), frame, @nospecialize(node), istoplev
500500
frame.callee = nothing
501501
end
502502
return_from(newframe)
503-
elseif node.head == :global
503+
elseif node.head === :global
504504
Core.eval(moduleof(frame), node)
505-
elseif node.head == :toplevel
505+
elseif node.head === :toplevel
506506
mod = moduleof(frame)
507507
modexs, _ = split_expressions(mod, node)
508508
rhs = Core.eval(mod, Expr(:toplevel,
@@ -514,14 +514,14 @@ function step_expr!(@nospecialize(recurse), frame, @nospecialize(node), istoplev
514514
end
515515
$return_from(newframe)
516516
end)))
517-
elseif node.head == :error
517+
elseif node.head === :error
518518
error("unexpected error statement ", node)
519-
elseif node.head == :incomplete
519+
elseif node.head === :incomplete
520520
error("incomplete statement ", node)
521521
else
522522
rhs = eval_rhs(recurse, frame, node)
523523
end
524-
elseif node.head == :thunk || node.head == :toplevel
524+
elseif node.head === :thunk || node.head === :toplevel
525525
error("this frame needs to be run at top level")
526526
else
527527
rhs = eval_rhs(recurse, frame, node)

0 commit comments

Comments
 (0)