Skip to content

Commit d49f829

Browse files
committed
Fix LimitedAccuracy
1 parent 0c4f0f8 commit d49f829

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

src/lowered.jl

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,7 @@ function methods_by_execution!(@nospecialize(recurse), methodinfo, docexprs, fra
255255
if isa(stmt, Expr)
256256
head = stmt.head
257257
if head === :toplevel
258-
local value
259-
for ex in stmt.args
260-
ex isa Expr || continue
261-
value = methods_by_execution!(recurse, methodinfo, docexprs, mod, ex; mode=mode, disablebp=false, skip_include=skip_include)
262-
end
258+
value = handle_toplevel(recurse, methodinfo, docexprs, mod, stmt, mode, skip_include)
263259
isassign(frame, pc) && assign_this!(frame, value)
264260
pc = next_or_nothing!(frame)
265261
# elseif head === :thunk && isanonymous_typedef(stmt.args[1])
@@ -385,7 +381,7 @@ function methods_by_execution!(@nospecialize(recurse), methodinfo, docexprs, fra
385381
end
386382
newex = unwrap(newex)
387383
push_expr!(methodinfo, newmod, newex)
388-
value = methods_by_execution!(recurse, methodinfo, docexprs, newmod, newex; mode=mode, skip_include=skip_include, disablebp=false)
384+
value = handle_eval(recurse, methodinfo, docexprs, newmod, newex, mode, skip_include)
389385
pop_expr!(methodinfo)
390386
end
391387
assign_this!(frame, value)
@@ -443,3 +439,18 @@ function methods_by_execution!(@nospecialize(recurse), methodinfo, docexprs, fra
443439
end
444440
return isrequired[frame.pc] ? get_return(frame) : nothing
445441
end
442+
443+
# These are separated out to limit the impact of LimitedAccuracy inference problems
444+
# (moving them into short method bodies) which prevent serialization of the inferred code
445+
446+
@noinline function handle_toplevel(@nospecialize(recurse), methodinfo, docexprs, mod, stmt::Expr, mode, skip_include)
447+
local value
448+
for ex in stmt.args
449+
ex isa Expr || continue
450+
value = Base.invoke_in_world(Base.get_world_counter(), methods_by_execution!, recurse, methodinfo, docexprs, mod, ex; mode, skip_include, disablebp=false)
451+
end
452+
return value
453+
end
454+
455+
@noinline handle_eval(@nospecialize(recurse), methodinfo, docexprs, newmod, newex::Expr, mode, skip_include) =
456+
Base.invoke_in_world(Base.get_world_counter(), methods_by_execution!, recurse, methodinfo, docexprs, newmod, newex; mode, skip_include, disablebp=false)

0 commit comments

Comments
 (0)