diff options
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -480,7 +480,6 @@ rb_gc_mark(ptr) case NODE_OP_ASGN_AND: rb_gc_mark(obj->as.node.u1.node); /* fall through */ - case NODE_IFUNC: case NODE_METHOD: /* 2 */ case NODE_NOT: case NODE_GASGN: @@ -1232,7 +1231,8 @@ rb_gc_call_finalizer_at_exit() p = heaps[i]; pend = p + HEAP_SLOTS; while (p < pend) { if (FL_TEST(p, FL_FINALIZE)) { - p->as.free.flag = 0; + FL_UNSET(p, FL_FINALIZE); + p->as.basic.klass = 0; run_final((VALUE)p); } p++; @@ -1260,21 +1260,22 @@ static VALUE id2ref(obj, id) VALUE obj, id; { - unsigned long ptr; + unsigned long ptr, p0; rb_secure(4); - ptr = NUM2UINT(id); + p0 = ptr = NUM2UINT(id); if (FIXNUM_P(ptr)) return (VALUE)ptr; + if (SYMBOL_P(ptr)) return (VALUE)ptr; if (ptr == Qtrue) return Qtrue; if (ptr == Qfalse) return Qfalse; if (ptr == Qnil) return Qnil; ptr = id ^ FIXNUM_FLAG; /* unset FIXNUM_FLAG */ if (!is_pointer_to_heap(ptr)) { - rb_raise(rb_eRangeError, "0x%x is not id value", ptr); + rb_raise(rb_eRangeError, "0x%x is not id value", p0); } if (BUILTIN_TYPE(ptr) == 0) { - rb_raise(rb_eRangeError, "0x%x is recycled object", ptr); + rb_raise(rb_eRangeError, "0x%x is recycled object", p0); } return (VALUE)ptr; } |