From: "Conrad.Irwin (Conrad Irwin)" Date: 2012-12-09T09:43:12+09:00 Subject: [ruby-core:50701] [ruby-trunk - Bug #7536][Open] local variables added to TOPLEVEL_BINDING in -r are broken Issue #7536 has been reported by Conrad.Irwin (Conrad Irwin). ---------------------------------------- Bug #7536: local variables added to TOPLEVEL_BINDING in -r are broken https://bugs.ruby-lang.org/issues/7536 Author: Conrad.Irwin (Conrad Irwin) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: 2.0.0dev (2012-12-09 trunk 38278) [x86_64-linux] 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. -- http://bugs.ruby-lang.org/