diff --git a/ChangeLog b/ChangeLog index 4059630cd6..11f95d4887 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Mon Dec 3 18:29:27 2012 Koichi Sasada + + * iseq.h: iseq_catch_table_entry::catch_type should be + Fixnum because they are pushed into Array in a compiler. + [Bug #7502] + + * test/ruby/test_objectspace.rb: add a test of this issue. + Mon Dec 3 18:25:16 2012 Nobuyoshi Nakada * template/id.h.tmpl (preserved_ids): "empty?" is not an attribute name. diff --git a/iseq.h b/iseq.h index 1b51d2a14d..47aaa1a7c8 100644 --- a/iseq.h +++ b/iseq.h @@ -55,12 +55,12 @@ struct iseq_line_info_entry { struct iseq_catch_table_entry { enum catch_type { - CATCH_TYPE_RESCUE, - CATCH_TYPE_ENSURE, - CATCH_TYPE_RETRY, - CATCH_TYPE_BREAK, - CATCH_TYPE_REDO, - CATCH_TYPE_NEXT + CATCH_TYPE_RESCUE = INT2FIX(1), + CATCH_TYPE_ENSURE = INT2FIX(2), + CATCH_TYPE_RETRY = INT2FIX(3), + CATCH_TYPE_BREAK = INT2FIX(4), + CATCH_TYPE_REDO = INT2FIX(5), + CATCH_TYPE_NEXT = INT2FIX(6) } type; VALUE iseq; unsigned long start; diff --git a/test/ruby/test_objectspace.rb b/test/ruby/test_objectspace.rb index 24731a7a50..921de84c0b 100644 --- a/test/ruby/test_objectspace.rb +++ b/test/ruby/test_objectspace.rb @@ -65,4 +65,17 @@ End END assert_raise(ArgumentError) { ObjectSpace.define_finalizer([], Object.new) } end + + def test_each_object + GC.disable + eval('begin; 1.times{}; rescue; ensure; end') + arys = [] + ObjectSpace.each_object(Array){|ary| + arys << ary + } + GC.enable + arys.each{|ary| + assert_equal(String, ary.inspect.class) # should not cause SEGV + } + end end