Skip to content

Commit 9a8b2fd

Browse files
antoine-levittJeffBezanson
authored andcommitted
Duplicate include(::String) for nicer stacktraces (#33087)
1 parent e9c6c42 commit 9a8b2fd

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

base/client.jl

+23-1
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,29 @@ end
429429

430430
# MainInclude exists to hide Main.include and eval from `names(Main)`.
431431
baremodule MainInclude
432-
include(fname::AbstractString) = Main.Base.include(Main, fname)
432+
# We inline the definition of include from loading.jl/include_relative to get one-frame stacktraces.
433+
# include(fname::AbstractString) = Main.Base.include(Main, fname)
434+
function include(fname::AbstractString)
435+
mod = Main
436+
isa(fname, String) || (fname = String(fname))
437+
path, prev = Main.Base._include_dependency(mod, fname)
438+
for callback in Main.Base.include_callbacks # to preserve order, must come before Core.include
439+
Main.Base.invokelatest(callback, mod, path)
440+
end
441+
tls = Main.Base.task_local_storage()
442+
tls[:SOURCE_PATH] = path
443+
local result
444+
try
445+
result = ccall(:jl_load_, Any, (Any, Any), mod, path)
446+
finally
447+
if prev === nothing
448+
Main.Base.delete!(tls, :SOURCE_PATH)
449+
else
450+
tls[:SOURCE_PATH] = prev
451+
end
452+
end
453+
return result
454+
end
433455
eval(x) = Core.eval(Main, x)
434456
end
435457

base/loading.jl

+2
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,8 @@ function source_dir()
10921092
return p === nothing ? pwd() : dirname(p)
10931093
end
10941094

1095+
# These functions are duplicated in client.jl/include(::String) for
1096+
# nicer stacktraces. Modifications here have to be backported there
10951097
include_relative(mod::Module, path::AbstractString) = include_relative(mod, String(path))
10961098
function include_relative(mod::Module, _path::String)
10971099
path, prev = _include_dependency(mod, _path)

test/cmdlineargs.jl

+3-6
Original file line numberDiff line numberDiff line change
@@ -561,15 +561,12 @@ let exename = `$(Base.julia_cmd()) --startup-file=no`
561561
"Bool(Base.JLOptions().use_sysimage_native_code)"`) == "false"
562562
end
563563

564-
# backtrace contains type and line number info (esp. on windows #17179)
564+
# backtrace contains line number info (esp. on windows #17179)
565565
for precomp in ("yes", "no")
566-
succ, out, bt = readchomperrors(`$(Base.julia_cmd()) --startup-file=no --sysimage-native-code=$precomp -E 'include("____nonexistent_file")'`)
566+
succ, out, bt = readchomperrors(`$(Base.julia_cmd()) --startup-file=no --sysimage-native-code=$precomp -E 'sqrt(-2)'`)
567567
@test !succ
568568
@test out == ""
569-
@test occursin("include_relative(::Module, ::String) at $(joinpath(".", "loading.jl"))", bt)
570-
lno = match(r"at \.[\/\\]loading\.jl:(\d+)", bt)
571-
@test length(lno.captures) == 1
572-
@test parse(Int, lno.captures[1]) > 0
569+
@test occursin(r"\.jl:(\d+)", bt)
573570
end
574571

575572
# PR #23002

0 commit comments

Comments
 (0)