ruby-changes:21170
From: nobu <ko1@a...>
Date: Thu, 8 Sep 2011 07:37:03 +0900 (JST)
Subject: [ruby-changes:21170] nobu:r33219 (trunk): * gc.c (id2ref): unmarked object is already dead while lazy
nobu 2011-09-08 07:33:14 +0900 (Thu, 08 Sep 2011) New Revision: 33219 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33219 Log: * gc.c (id2ref): unmarked object is already dead while lazy sweeping, and to it cannot come back since other objects referred from it might have been freed already. Modified files: trunk/ChangeLog trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 33218) +++ ChangeLog (revision 33219) @@ -1,3 +1,9 @@ +Thu Sep 8 07:33:12 2011 Nobuyoshi Nakada <nobu@r...> + + * gc.c (id2ref): unmarked object is already dead while lazy + sweeping, and to it cannot come back since other objects + referred from it might have been freed already. + Wed Sep 8 03:48:00 2011 Ayumu AIZAWA <ayumu.aizawa@g...> * ext/readline/README.ja: Index: gc.c =================================================================== --- gc.c (revision 33218) +++ gc.c (revision 33219) @@ -390,6 +390,8 @@ #define global_List objspace->global_list #define ruby_gc_stress objspace->gc_stress +#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0) + static void rb_objspace_call_finalizer(rb_objspace_t *objspace); #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE @@ -3130,7 +3132,8 @@ BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) { rb_raise(rb_eRangeError, "%p is not id value", p0); } - if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) { + if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0 || + (is_lazy_sweeping(objspace) && !(RBASIC(ptr)->flags & FL_MARK))) { rb_raise(rb_eRangeError, "%p is recycled object", p0); } return (VALUE)ptr; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/