Project

General

Profile

Actions

Bug #6038

closed

#instance_eval bug

Added by ddebernardy (Denis de Bernardy) about 12 years ago. Updated over 5 years ago.

Status:
Closed
Target version:
[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

Updated by marcandre (Marc-Andre Lafortune) about 12 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

Actions #2

Updated by ko1 (Koichi Sasada) about 12 years ago

  • Assignee set to nobu (Nobuyoshi Nakada)
Actions #3

Updated by shyouhei (Shyouhei Urabe) about 12 years ago

  • Status changed from Open to Assigned

Updated by nobu (Nobuyoshi Nakada) over 11 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

Updated by nobu (Nobuyoshi Nakada) about 11 years ago

  • Category set to core
  • Assignee changed from nobu (Nobuyoshi Nakada) to matz (Yukihiro Matsumoto)
  • Target version set to 3.0

Updated by mame (Yusuke Endoh) over 5 years ago

  • Status changed from Assigned to Closed

It looks already fixed. I'm unsure if this behavior is guaranteed, though. Whether it is guaranteed or not, I think we can close this issue.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0