Project

General

Profile

Actions

Bug #7536

closed

local variables added to TOPLEVEL_BINDING in -r are broken

Added by Conrad.Irwin (Conrad Irwin) over 11 years ago. Updated over 11 years ago.

Status:
Closed
Target version:
ruby -v:
2.0.0dev (2012-12-09 trunk 38278) [x86_64-linux]
Backport:
[ruby-core:50701]

Description

If a library that you require in the -r flag of ruby evals things in TOPLEVEL_BINDING (e.g. RUBY_OPT=-rbundler/setup), then the local variables will show up in TOPLEVEL_BINDING.eval("local_variables"), but they raise a NameError if you try to use them.

A minimal test case is:

$ cat b.rb
TOPLEVEL_BINDING.eval("lib = 2")

$ cat a.rb
puts TOPLEVEL_BINDING.eval("local_variables").inspect
puts TOPLEVEL_BINDING.eval("lib").inspect

$ ruby -r./b.rb a.rb
[:lib]

:in `': undefined local variable or method `lib' for main:Object (NameError) from a.rb:2:in `eval' from a.rb:2:in `'

This affects ruby 1.9.3 and ruby 2.0.0, I tested with:
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
ruby 2.0.0dev (2012-12-09 trunk 38278) [x86_64-linux]

Ruby 1.8.7 works fine:
$ ruby -v
ruby 1.8.7 (2012-06-29 patchlevel 370) [x86_64-linux]
$ ruby -r./b.rb a.rb
["lib"]
2

This breaks debugging tools like pry or https://github.com/charliesome/better_errors, which rightly assume that it's safe to do:

any_binding.eval("local_variables").map{ |x| any_binding.eval("#{x}") }

There are two possible solutions; either remove the variable names from the list of "local_variables", make sure they don't raise a NameError.

Actions

Also available in: Atom PDF

Like0
Like0Like0