diff --git a/ChangeLog b/ChangeLog index 356a6e0a40..41a8cbaa71 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Oct 1 15:17:48 2007 Nobuyoshi Nakada + + * gc.c (id2ref): T_VALUES is less than T_BLOCK. [ruby-dev:31911] + Mon Oct 1 10:58:42 2007 Nobuyoshi Nakada * ruby.c (require_libraries): use require method instead of calling diff --git a/bootstraptest/test_knownbug.rb b/bootstraptest/test_knownbug.rb index f75a714590..5ac0cd11fd 100644 --- a/bootstraptest/test_knownbug.rb +++ b/bootstraptest/test_knownbug.rb @@ -33,20 +33,6 @@ assert_normal_exit %q{ Marshal.load(Marshal.dump({"k"=>"v"}), lambda {|v| }) } -assert_normal_exit %q{ - eval("", TOPLEVEL_BINDING) - minobj = ObjectSpace.to_enum(:each_object).min {|a,b| a.object_id <=> b.object_id } - maxobj = ObjectSpace.to_enum(:each_object).max {|a,b| a.object_id <=> b.object_id } - minobj.object_id.upto(maxobj.object_id) {|id| - begin - o = ObjectSpace._id2ref(id) - rescue RangeError - next - end - o.inspect - } -}, '[ruby-dev:31911]' - assert_normal_exit %q{ require 'continuation' Fiber.new{ callcc{|c| @c = c } }.resume diff --git a/bootstraptest/test_objectspace.rb b/bootstraptest/test_objectspace.rb new file mode 100644 index 0000000000..f138ac5f6c --- /dev/null +++ b/bootstraptest/test_objectspace.rb @@ -0,0 +1,13 @@ +assert_normal_exit %q{ + eval("", TOPLEVEL_BINDING) + minobj = ObjectSpace.to_enum(:each_object).min_by {|a| a.object_id } + maxobj = ObjectSpace.to_enum(:each_object).max_by {|a| a.object_id } + minobj.object_id.upto(maxobj.object_id) {|id| + begin + o = ObjectSpace._id2ref(id) + rescue RangeError + next + end + o.inspect if defined?(o.inspect) + } +}, '[ruby-dev:31911]' diff --git a/gc.c b/gc.c index 7dd5c4e681..4b239b634a 100644 --- a/gc.c +++ b/gc.c @@ -2069,7 +2069,7 @@ id2ref(VALUE obj, VALUE objid) return ID2SYM(symid); } - if (!is_pointer_to_heap((void *)ptr)|| BUILTIN_TYPE(ptr) >= T_BLOCK) { + if (!is_pointer_to_heap((void *)ptr) || BUILTIN_TYPE(ptr) >= T_VALUES) { rb_raise(rb_eRangeError, "%p is not id value", p0); } if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) {