ruby-changes:21310
From: nobu <ko1@a...>
Date: Thu, 29 Sep 2011 20:10:55 +0900 (JST)
Subject: [ruby-changes:21310] nobu:r33359 (trunk): * gc.c (is_id_value, is_live_object): extract from id2ref().
nobu 2011-09-29 20:10:46 +0900 (Thu, 29 Sep 2011) New Revision: 33359 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33359 Log: * gc.c (is_id_value, is_live_object): extract from id2ref(). Modified files: trunk/ChangeLog trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 33358) +++ ChangeLog (revision 33359) @@ -1,5 +1,7 @@ -Thu Sep 29 20:09:42 2011 Nobuyoshi Nakada <nobu@r...> +Thu Sep 29 20:10:42 2011 Nobuyoshi Nakada <nobu@r...> + * gc.c (is_id_value, is_live_object): extract from id2ref(). + * gc.c (run_finalizer): use object instead of object id. Thu Sep 29 20:07:36 2011 Nobuyoshi Nakada <nobu@r...> Index: gc.c =================================================================== --- gc.c (revision 33358) +++ gc.c (revision 33359) @@ -3094,6 +3094,15 @@ } static inline int +is_id_value(rb_objspace_t *objspace, VALUE ptr) +{ + if (!is_pointer_to_heap(objspace, (void *)ptr)) return FALSE; + if (BUILTIN_TYPE(ptr) > T_FIXNUM) return FALSE; + if (BUILTIN_TYPE(ptr) == T_ICLASS) return FALSE; + return TRUE; +} + +static inline int is_dead_object(rb_objspace_t *objspace, VALUE ptr) { struct heaps_slot *slot = objspace->heap.sweep_slots; @@ -3107,6 +3116,15 @@ return FALSE; } +static inline int +is_live_object(rb_objspace_t *objspace, VALUE ptr) +{ + if (BUILTIN_TYPE(ptr) == 0) return FALSE; + if (RBASIC(ptr)->klass == 0) return FALSE; + if (is_dead_object(objspace, ptr)) return FALSE; + return TRUE; +} + /* * call-seq: * ObjectSpace._id2ref(object_id) -> an_object @@ -3149,12 +3167,10 @@ return ID2SYM(symid); } - if (!is_pointer_to_heap(objspace, (void *)ptr) || - BUILTIN_TYPE(ptr) > T_FIXNUM || BUILTIN_TYPE(ptr) == T_ICLASS) { + if (!is_id_value(objspace, ptr)) { rb_raise(rb_eRangeError, "%p is not id value", p0); } - if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0 || - is_dead_object(objspace, ptr)) { + if (!is_live_object(objspace, ptr)) { rb_raise(rb_eRangeError, "%p is recycled object", p0); } return (VALUE)ptr; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/