diff --git a/ChangeLog b/ChangeLog index c38be22ede..f8b06d2fd1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Sep 8 11:53:58 2009 Koichi Sasada + + * iseq.c (iseq_mark): no need to mark inline cache entries. + + * insns.def (onceinlinecache, setinlinecache): save a value + to mark cached value. + Tue Sep 8 08:32:30 2009 Nobuyoshi Nakada * test/dl/test_{cfunc,ptr}.rb: added tests from Aaron Patterson. diff --git a/insns.def b/insns.def index 426f101632..4acbcef1cb 100644 --- a/insns.def +++ b/insns.def @@ -1200,6 +1200,7 @@ onceinlinecache } else { /* none */ + ic->ic_value = Qundef; val = Qnil; } } @@ -1217,6 +1218,9 @@ setinlinecache { IC ic = GET_CONST_INLINE_CACHE(dst); + if (ic->ic_value == Qundef) { + rb_ary_push(GET_ISEQ()->mark_ary, val); + } ic->ic_value = val; ic->ic_vmstat = GET_VM_STATE_VERSION() - ruby_vm_const_missing_count; ruby_vm_const_missing_count = 0; diff --git a/iseq.c b/iseq.c index 5bbd2f1db6..b348925567 100644 --- a/iseq.c +++ b/iseq.c @@ -90,7 +90,6 @@ iseq_mark(void *ptr) RUBY_MARK_ENTER("iseq"); if (ptr) { - int i; rb_iseq_t *iseq = ptr; RUBY_GC_INFO("%s @ %s\n", RSTRING_PTR(iseq->name), RSTRING_PTR(iseq->filename)); @@ -104,16 +103,6 @@ iseq_mark(void *ptr) /* RUBY_MARK_UNLESS_NULL(iseq->cached_special_block); */ RUBY_MARK_UNLESS_NULL(iseq->orig); - for (i=0; iic_size; i++) { - struct iseq_inline_cache_entry *const ic = &iseq->ic_entries[i]; - RUBY_MARK_UNLESS_NULL(ic->ic_class); - RUBY_MARK_UNLESS_NULL(ic->ic_value); - if (ic->ic_vmstat != GET_VM_STATE_VERSION()) continue; - if (ic->ic_method) { - rb_gc_mark_method_entry(ic->ic_method); - } - } - if (iseq->compile_data != 0) { struct iseq_compile_data *const compile_data = iseq->compile_data; RUBY_MARK_UNLESS_NULL(compile_data->mark_ary);