Elixir and Erlang/OTP versions
Erlang/OTP 28 [erts-16.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit]
Elixir 1.20.0-rc.4 (808075d) (compiled with Erlang/OTP 28)
Operating system
any
Current behavior
Repro in iex:
Nested eval:
Code.eval_string("""
Code.eval_string("1 + 1")
IO.inspect(:erlang.get({:elixir, :eval_env}), label: :inside_after_inner)
raise "boom"
""", [], %{Code.env_for_eval([]) | file: "foo"})
inside_after_inner: :undefined
** (RuntimeError) boom
(elixir 1.20.0-rc.4) src/elixir.erl:369: :elixir.eval_external_handler/3
(stdlib 7.2) erl_eval.erl:924: :erl_eval.do_apply/7
(elixir 1.20.0-rc.4) src/elixir.erl:355: :elixir.erl_eval/3
(elixir 1.20.0-rc.4) src/elixir.erl:326: :elixir.eval_forms/4
(elixir 1.20.0-rc.4) lib/module/parallel_checker.ex:156: Module.ParallelChecker.verify/1
(elixir 1.20.0-rc.4) lib/code.ex:649: Code.validated_eval_string/4
No nested eval - works as expected
Code.eval_string("""
IO.inspect(:erlang.get({:elixir, :eval_env}), label: :inside)
raise "boom"
""", [], %{Code.env_for_eval([]) | file: "foo"})
inside: #Macro.Env<...
** (RuntimeError) boom
foo:3: (file)
Notice after nested eval eval_env gets cleaned up and stacktrace on error is wrong.
Reason: unconditional process dict erase in
|
erlang:erase(?elixir_eval_env) |
The same behavior affects dbg_callback
|
erlang:erase({elixir, dbg_callback}) |
Expected behavior
Three alternatives:
- The code fixed to store nested evals on stack
Code.eval_* documented that reentrancy is not supported and leads to broken behavior
- Hard error/warning on nested eval in runtime
Elixir and Erlang/OTP versions
Erlang/OTP 28 [erts-16.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit]
Elixir 1.20.0-rc.4 (808075d) (compiled with Erlang/OTP 28)
Operating system
any
Current behavior
Repro in iex:
Nested eval:
No nested eval - works as expected
Notice after nested eval
eval_envgets cleaned up and stacktrace on error is wrong.Reason: unconditional process dict erase in
elixir/lib/elixir/src/elixir.erl
Line 357 in 2d6e61c
The same behavior affects
dbg_callbackelixir/lib/elixir/src/elixir.erl
Line 335 in 2d6e61c
Expected behavior
Three alternatives:
Code.eval_*documented that reentrancy is not supported and leads to broken behavior