Bug #6038

#instance_eval bug

Added by Denis de Bernardy about 2 years ago. Updated over 1 year ago.

[ruby-core:42688]
Status:Assigned
Priority:Normal
Assignee:Yukihiro Matsumoto
Category:core
Target version:Next Major
ruby -v:1.9.3 Backport:

Description

instanceeval seems to change the objectid in some cases:

begin
stack = []
dostuff = lambda do |&chain|
puts "Actual: #{chain.object
id}"
chain.call
end

chain = lambda do
if filter = stack.shift
filter.call(&chain)
end
end

puts "Expected: #{chain.objectid}"
stack << do
stuff
chain.instance_eval { @completed = false }
chain.call
end

RUBYVERSION
=> "1.9.3"
begin
?> stack = []
do
stuff = lambda do |&chain|
?> puts "Actual: #{chain.object_id}"
chain.call
end

?> chain = lambda do
?> if filter = stack.shift
filter.call(&chain)
end
end

?> puts "Expected: #{chain.objectid}"
stack << do
stuff
chain.instance_eval { @completed = false }
chain.call
end
Expected: 2152379740
Actual: 2152379520

History

#1 Updated by Marc-Andre Lafortune about 2 years ago

Might be a good idea to keep things simple:

do_stuff = lambda do |&block|
  puts "Object id is #{block.object_id}"
end

chain = lambda{}

do_stuff.call(&chain)
chain.instance_eval{}
do_stuff.call(&chain)

Prints out:
Block's object id is 2152284220
Block's object id is 2152284140

Using an equivalent method to do_stuff doesn't exhibit the same problem. Here's a complete example:

def stuff(&block)
  puts "Object id is #{block.object_id}"
end
do_stuff = method(:stuff).to_proc  

chain = lambda{}

stuff(&chain)
do_stuff.call(&chain)
chain.instance_eval{}
stuff(&chain)
do_stuff.call(&chain)

Object id is 2156158200
Object id is 2156158200
Object id is 2156158200
Object id is 2156157980

#2 Updated by Koichi Sasada about 2 years ago

  • Assignee set to Nobuyoshi Nakada

#3 Updated by Shyouhei Urabe about 2 years ago

  • Status changed from Open to Assigned

#4 Updated by Nobuyoshi Nakada over 1 year ago

=begin
I don't think ((|pr2|)) is not guaranteed to be the same object as ((|pr1|)) where
pr1 = proc {}
pr2 = proc {|&pr| pr}.call(&pr1)
=end

#5 Updated by Nobuyoshi Nakada over 1 year ago

  • Category set to core
  • Assignee changed from Nobuyoshi Nakada to Yukihiro Matsumoto
  • Target version set to Next Major

Also available in: Atom PDF