Big problem with debian ruby 1.8.0-1


F

Ferenc Engard

Hello,

I have just upgraded ruby on my debian unstable to ruby 1.8.0-1
(2003-10-05), and my program has crashed. Here is the stripped down
version of my code:

----------------------------------------------------------------------
#!/usr/bin/ruby1.8

class Action < Proc
attr_accessor :name
def initialize
puts "Action#init"
@name='not defined'
super
end
end

class Actions
def initialize
@actions=Hash.new
end

#~ def register(name,action=nil)
def register(name,action=nil,&bl)
if action.nil? && block_given?
puts "Before Action.new"
action=Action.new(&bl)
#~ action=Action.new
puts "After Action.new"
end
puts action.inspect
action.name=name
@actions[name]=action
action
end
end

actions=Actions.new
actions.register('exit') {puts "yes"}
----------------------------------------------------------------------

This program now outputs the following:

[email protected]:~/work/tudomany/implementation$ ./gui_test.rb
Before Action.new
After Action.new
#<Proc:[email protected]/gui_test.rb:32>
../gui_test.rb:25:in `register': undefined method `name=' for
#<Proc:[email protected]/gui_test.rb:32> (NoMethodError)
from ./gui_test.rb:32
[email protected]:~/work/tudomany/implementation$


So, instead of Action, action is a Proc! :-O

Note, if I remove the &bl from the Actions#register(), then this code do
not show this behavior, although, there is not so much sense using a
Proc-derived class without a proc... :-((

What is the problem?

Thanks:
Ferenc

PS: The previous ruby version was also 1.8.0 (I do not remember the
exact date). :(
 
Ad

Advertisements

Y

Yukihiro Matsumoto

Hi,

In message "Big problem with debian ruby 1.8.0-1"

|I have just upgraded ruby on my debian unstable to ruby 1.8.0-1
|(2003-10-05), and my program has crashed. Here is the stripped down
|version of my code:

A bug.

--- eval.c 5 Oct 2003 14:07:07 -0000 1.549
+++ eval.c 6 Oct 2003 00:33:39 -0000
@@ -6930,3 +6930,3 @@ proc_alloc(klass, proc)

- if (!proc && ruby_block->block_obj) {
+ if (!proc && ruby_block->block_obj && CLASS_OF(ruby_block->block_obj) == klass) {
return ruby_block->block_obj;
 

Top