It is probably a bit silly what I am doing. (I tried to somehow introduce a new scope block using AST and saw that an empty let-Block with no variables is translated to a :thunk-Expression, which I tried.)
Expr(:thunk, Meta.parse("x=17"))
Main.eval(Expr(:thunk, Meta.parse("x=17")))
This results in a crash of Julia the following error (with a fresh Julia session with version 1.1.1 on Windows 10):
Exception: EXCEPTION_ACCESS_VIOLATION at 0x6b5ccba9 -- jl_array_ptr_ref at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\julia.h:807 [inlined]
body_attributes at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:364 [inlined]
jl_toplevel_eval_flex at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:739
in expression starting at no file:0
jl_array_ptr_ref at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\julia.h:807 [inlined]
body_attributes at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:364 [inlined]
jl_toplevel_eval_flex at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:739
jl_toplevel_eval at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:773 [inlined]
jl_toplevel_eval_in at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:793
eval at .\boot.jl:328 [inlined]
eval at .\client.jl:404
jl_fptr_trampoline at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\gf.c:1842
jl_apply_generic at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\gf.c:2197
do_call at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\interpreter.c:323
eval_value at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\interpreter.c:411
eval_stmt_value at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\interpreter.c:362 [inlined]
eval_body at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\interpreter.c:759
jl_interpret_toplevel_thunk_callback at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\interpreter.c:885
unknown function (ip: FFFFFFFFFFFFFFFE)
unknown function (ip: 00000000105E168F)
unknown function (ip: 0000000000000003)
jl_toplevel_eval_flex at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:764
jl_toplevel_eval at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:773 [inlined]
jl_toplevel_eval_in at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\toplevel.c:793
eval at .\boot.jl:328
jl_apply_generic at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\gf.c:2197
eval_user_input at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\REPL\src\REPL.jl:85
macro expansion at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\REPL\src\REPL.jl:117 [inlined]
#26 at .\task.jl:259
jl_apply_generic at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\gf.c:2197
jl_apply at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\julia.h:1571 [inlined]
start_task at /home/Administrator/buildbot/worker/package_win64/build/src/home/Administrator/buildbot/worker/package_win64/build/src\task.c:572
Allocations: 944350 (Pool: 943830; Big: 520); GC: 1
Versioninfo:
julia> versioninfo()
Julia Version 1.1.1
Commit 55e36cc308 (2019-05-16 04:10 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-6.0.1 (ORCJIT, haswell)
Environment:
JULIA_PKGDIR = C:\.julia
That is an internal representation; it's part of the "IR" (intermediate representation), not the AST. eval accepts ASTs, which come from parse or quoted expressions. For example, to see the structure of a let:
julia> dump(:(let
end))
Expr
head: Symbol let
args: Array{Any}((2,))
1: Expr
head: Symbol block
args: Array{Any}((0,))
2: Expr
head: Symbol block
args: Array{Any}((0,))
But, we could add an error check here to avoid a crash.
Thank you very much for the tip! I hope this issue wasn't a complete waste of your time.
It's not a waste of time; ideally the runtime would never segfault unless someone incorrectly uses one of the unsafe_* family of functions (+related things like ccall). Thanks for the bug report.
Most helpful comment
It's not a waste of time; ideally the runtime would never segfault unless someone incorrectly uses one of the
unsafe_*family of functions (+related things likeccall). Thanks for the bug report.