Bug #6038
closed#instance_eval bug
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) almost 13 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
Updated by ko1 (Koichi Sasada) over 12 years ago
- Assignee set to nobu (Nobuyoshi Nakada)
Updated by shyouhei (Shyouhei Urabe) over 12 years ago
- Status changed from Open to Assigned
Updated by nobu (Nobuyoshi Nakada) almost 12 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) almost 12 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) almost 6 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.