Actions
Bug #20856
closedIncorrect and inconsistent multi-thread eval execution with Prism compiler
Description
Consider example:
s = Thread.new {
a = 5
puts eval("a == b")
x = 6
}
s.join
b = 11
As far as I see it, it should not work. Because at the moment of eval, b is unknown and not even declared (it can even be in condition).
But it may be available because file iseq
already compiled and we know that there is b.
So, this works in ruby 3.3 in a script we running, wrapped into the method, or required by other file.
But in 3.4-preview2:
- it works in file
- it works in method
- it fails if required from other file with:
#<Thread:0x00007725530d6a98 /home/hurricup/Projects/ruby-debugger/rdi30/test2.rb:1 run> terminated with exception (report_on_exception is true):
(eval at /home/hurricup/Projects/ruby-debugger/rdi30/test2.rb:3):1:in 'block in <top (required)>': undefined local variable or method 'b' for main (NameError)
from /home/hurricup/Projects/ruby-debugger/rdi30/test2.rb:3:in 'Kernel#eval'
from /home/hurricup/Projects/ruby-debugger/rdi30/test2.rb:3:in 'block in <top (required)>'
(eval at /home/hurricup/Projects/ruby-debugger/rdi30/test2.rb:3):1:in 'block in <top (required)>': undefined local variable or method 'b' for main (NameError)
from /home/hurricup/Projects/ruby-debugger/rdi30/test2.rb:3:in 'Kernel#eval'
from /home/hurricup/Projects/ruby-debugger/rdi30/test2.rb:3:in 'block in <top (required)>'
And this ^^ is correct behavior if you ask me :) but atm it is inconsistent between the ruby versions and even in the scope of 3.4-preview2
Actions
Like0
Like0Like0Like0Like0Like0