Bug #7536
closedlocal variables added to TOPLEVEL_BINDING in -r are broken
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]
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.