Project

General

Profile

Actions

Bug #20175

closed

Broken File.dirname(__FILE__) in eval blocks

Added by kiskoza (Zsolt Kozaroczy) over 1 year ago. Updated over 1 year ago.

Status:
Feedback
Assignee:
-
Target version:
-
ruby -v:
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
[ruby-core:116140]

Description

Since #19755 eval use caller location by default, however, it broke File.dirname(__FILE__) in some cases.

# 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

## 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 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.

## 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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0