
Issue #20175 has been reported by kiskoza (Zsolt Kozaroczy). ---------------------------------------- Bug #20175: Broken File.dirname(__FILE__) in eval blocks https://bugs.ruby-lang.org/issues/20175 * Author: kiskoza (Zsolt Kozaroczy) * Status: Open * Priority: Normal * ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux] * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- Since #19755 eval use caller location by default, however, it broke `File.dirname(__FILE__)` in some cases. ```ruby # eval.rb eval('puts file: __FILE__, dirname: File.dirname(__FILE__)') ``` Up to Ruby 3.2.2 it gave back the same results, even if it wasn't technically correct in some cases ```bash ## Ruby 3.2.2 ruby eval.rb # {:file=>"(eval)", :dirname=>"."} ruby ./eval.rb # {:file=>"(eval)", :dirname=>"."} cd folder && ruby ../eval.rb # {:file=>"(eval)", :dirname=>"."} # This one is not pointing to the right directory, but still returns a valid path ruby /Codes/eval.rb # {:file=>"(eval)", :dirname=>"."} # This one is not pointing to the right directory, but still returns a valid path ``` In Ruby 3.3.0 (introduced in commit:43a5c19135), it gives back different paths, trying to point to the right directory, but it has the `(eval at ` prefix which makes it broken for codes expecting a valid path. ```bash ## Ruby 3.3.0 ruby eval.rb # {:file=>"(eval at eval.rb:1)", :dirname=>"."} ruby ./eval.rb # {:file=>"(eval at ./eval.rb:1)", :dirname=>"(eval at ."} # Broken path cd folder && ruby ../eval.rb # {:file=>"(eval at ../eval.rb:1)", :dirname=>"(eval at .."} # This one is trying to point to the right directory, but it has a broken syntax ruby /Codes/eval.rb # {:file=>"(eval at /Codes/eval.rb:1)", :dirname=>"(eval at /Codes"} # This one is trying to point to the right directory, but it has a broken syntax ``` I was able to reproduce it on current master as well. -- https://bugs.ruby-lang.org/