Forum: Ruby-core [ruby-trunk - Bug #7536][Open] local variables added to TOPLEVEL_BINDING in -r are broken

Posted by Conrad.Irwin (Conrad Irwin) (Guest)
on 2012-12-09 01:49
(Received via mailing list)
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]
<main>:in `<main>': undefined local variable or method `lib' for 
main:Object (NameError)
        from a.rb:2:in `eval'
        from a.rb:2:in `<main>'

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.
Posted by charliesome (Charlie Somerville) (Guest)
on 2012-12-13 11:35
(Received via mailing list)
Issue #7536 has been updated by charliesome (Charlie Somerville).

Status changed from Open to Assigned
Assignee set to ko1 (Koichi Sasada)
Priority changed from Normal to High
Target version set to 2.0.0


----------------------------------------
Bug #7536: local variables added to TOPLEVEL_BINDING in -r are broken
https://bugs.ruby-lang.org/issues/7536#change-34699

Author: Conrad.Irwin (Conrad Irwin)
Status: Assigned
Priority: High
Assignee: ko1 (Koichi Sasada)
Category:
Target version: 2.0.0
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]
<main>:in `<main>': undefined local variable or method `lib' for 
main:Object (NameError)
        from a.rb:2:in `eval'
        from a.rb:2:in `<main>'

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.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.