[#56333] [CommonRuby - Feature #8723][Open] Array.any? predicate returns true for empty array. — "nurettin (Nurettin Onur TUGCU)" <onurtugcu@...>

12 messages 2013/08/02

[#56368] [ruby-trunk - Bug #8730][Open] "rescue Exception" rescues Timeout::ExitException — "takiuchi (Genki Takiuchi)" <genki@...21g.com>

15 messages 2013/08/04

[#56407] [ruby-trunk - misc #8741][Open] email notification on bugs.ruby-lang.org is broken — "rits (First Last)" <redmine@...>

18 messages 2013/08/05

[#56524] [ruby-trunk - Bug #8770][Open] [PATCH] process.c: avoid EINTR from Process.spawn — "normalperson (Eric Wong)" <normalperson@...>

19 messages 2013/08/10

[#56536] [ruby-trunk - Feature #8772][Open] Hash alias #| merge, and the case for Hash and Array polymorphism — "trans (Thomas Sawyer)" <redmine@...>

24 messages 2013/08/11

[#56544] [ruby-trunk - Bug #8774][Open] rb_file_dirname return wrong encoding string when dir is "." — jiayp@... (贾 延平) <jiayp@...>

10 messages 2013/08/11

[#56569] [ruby-trunk - Feature #8781][Open] Use require_relative() instead of require() if possible — "ko1 (Koichi Sasada)" <redmine@...>

31 messages 2013/08/12
[#56582] [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — "drbrain (Eric Hodel)" <drbrain@...7.net> 2013/08/12

[#56584] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — SASADA Koichi <ko1@...> 2013/08/12

(2013/08/13 2:25), drbrain (Eric Hodel) wrote:

[#56636] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — Aaron Patterson <tenderlove@...> 2013/08/16

On Tue, Aug 13, 2013 at 07:38:01AM +0900, SASADA Koichi wrote:

[#56634] [ruby-trunk - Feature #8788][Open] use eventfd on newer Linux instead of pipe for timer thread — "normalperson (Eric Wong)" <normalperson@...>

11 messages 2013/08/16

[#56648] [ruby-trunk - Bug #8795][Open] "Null byte in string error" on Marshal.load — "mml (McClain Looney)" <m@...>

17 messages 2013/08/16

[#56824] [ruby-trunk - Feature #8823][Open] Run trap handler in an independent thread called "Signal thread" — "ko1 (Koichi Sasada)" <redmine@...>

14 messages 2013/08/27

[#56878] [ruby-trunk - misc #8835][Open] Introducing a semantic versioning scheme and branching policy — "knu (Akinori MUSHA)" <knu@...>

11 messages 2013/08/30

[#56890] [ruby-trunk - Feature #8839][Open] Class and module should return the class or module that was opened — "headius (Charles Nutter)" <headius@...>

26 messages 2013/08/30

[#56894] [ruby-trunk - Feature #8840][Open] Yielder#state — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>

14 messages 2013/08/30

[ruby-core:56546] [ruby-trunk - Bug #8773] Binding#local_variables should work like #local_variable_set and #local_variable_get

From: "jackdanger (Jack Danger)" <ruby@...>
Date: 2013-08-11 06:52:28 UTC
List: ruby-core #56546
Issue #8773 has been updated by jackdanger (Jack Danger).

File 0001-Allowing-binding-to-list-its-local-variables.patch added

With the addition of Binding#local_variable_get and Binding#local_variable_set the following seemed reasonable:

    def get_all_local_variables(bind)
      lvars = bind.send(:local_variables)
      # `lvars` should equal [:x, :y], but equals [:bind, :lvars]
      lvars.map {|name| bind.local_variable_get name }
    end
    x = 1
    y = 2
    get_all_local_variables(binding) # NameError: local variable `bind' not defined for #<Binding:0x0>

This is because `local_variables' is global and uses the current stack frame. That was not obvious to me. I could have just used binding.eval("local_variables") but that looked very strange when used alongside binding.local_variable_set and binding.local_variable_get.

Attached is a patch that gives Binding an instance method that properly lists the local variables defined in the binding. It now works like this:

    def get_all_local_variables(bind)
      lvars = bind.local_variables
      # `lvars` equals [:x, :y]
      lvars.map {|name| bind.local_variable_get name }
    end
    x = 1
    y = 2
    get_all_local_variables(binding) #=> [1, 2]

Here's a GitHub link if you want to see it with colors: https://github.com/JackDanger/ruby/pull/1/files
----------------------------------------
Bug #8773: Binding#local_variables should work like #local_variable_set and #local_variable_get
https://bugs.ruby-lang.org/issues/8773#change-41084

Author: jackdanger (Jack Danger)
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-08-11 trunk 42507) [x86_64-darwin12.4.0]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


With the addition of Binding#local_variable_get and Binding#local_variable_set the following seemed reasonable:

    def get_all_local_variables(bind)
      lvars = bind.send(:local_variables)
      # `lvars` should equal [:x, :y], but equals [:bind, :lvars]
      lvars.map {|name| bind.local_variable_get name }
    end
    x = 1
    y = 2
    get_all_local_variables(binding) # NameError: local variable `bind' not defined for #<Binding:0x0>

This is because `local_variables' is global and uses the current stack frame. That was not obvious to me. I could have just used binding.eval("local_variables") but that looked very strange when used alongside binding.local_variable_set and binding.local_variable_get.

Attached is a patch that gives Binding an instance method that properly lists the local variables defined in the binding. It now works like this:

    def get_all_local_variables(bind)
      lvars = bind.local_variables
      # `lvars` equals [:x, :y]
      lvars.map {|name| bind.local_variable_get name }
    end
    x = 1
    y = 2
    set_everything_but_x_to_5(binding) # => [1, 1]

Here's a GitHub link if you want to see it with colors: https://github.com/JackDanger/ruby/pull/1/files


-- 
http://bugs.ruby-lang.org/

In This Thread