Project

General

Profile

Bug #6038

#instance_eval bug

Added by Denis de Bernardy almost 5 years ago. Updated almost 4 years ago.

Status:
Assigned
Priority:
Normal
[ruby-core:42688]

Description

instance_eval seems to change the object_id in some cases:

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.object_id}"
stack << do_stuff
chain.instance_eval { @completed = false }
chain.call
end

RUBY_VERSION
=> "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.object_id}"
stack << do_stuff
chain.instance_eval { @completed = false }
chain.call
end
Expected: 2152379740
Actual: 2152379520

History

#1 [ruby-core:42694] Updated by Marc-Andre Lafortune almost 5 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 over 4 years ago

  • Assignee set to Nobuyoshi Nakada

#3 Updated by Shyouhei Urabe over 4 years ago

  • Status changed from Open to Assigned

#4 [ruby-core:50654] Updated by Nobuyoshi Nakada almost 4 years 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 [ruby-core:51198] Updated by Nobuyoshi Nakada almost 4 years ago

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

Also available in: Atom PDF