diff options
| author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-13 09:30:23 +0000 |
|---|---|---|
| committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-13 09:30:23 +0000 |
| commit | 321a2a0920a349bdccac0bb31e3f1ca0126acdd3 (patch) | |
| tree | 4a46ed32d9918e8fdbf3d63cdda79a6526032b5b /iseq.c | |
| parent | 2b1ca5addb362954f5009995b37147e95d5a328f (diff) | |
| download | ruby-321a2a0920a349bdccac0bb31e3f1ca0126acdd3.tar.gz ruby-321a2a0920a349bdccac0bb31e3f1ca0126acdd3.tar.xz ruby-321a2a0920a349bdccac0bb31e3f1ca0126acdd3.zip | |
* vm_core.h, compile.c: declare struct iseq_inline_cache_entry.
Inline cache (IC) entries are no longer GC managed object.
IC entries are freed when ISeq is freed.
* iseq.c: fix mark, free, memsize functions for above change.
* insns.def: remove rb_gc_write_barrier().
* vm_insnhelper.c (vm_method_search): ditto.
* tool/instruction.rb, template/insns_info.inc.tmpl (insn_iclen):
added.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@24085 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'iseq.c')
| -rw-r--r-- | iseq.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -74,6 +74,7 @@ iseq_free(void *ptr) RUBY_FREE_UNLESS_NULL(iseq->iseq); RUBY_FREE_UNLESS_NULL(iseq->insn_info_table); RUBY_FREE_UNLESS_NULL(iseq->local_table); + RUBY_FREE_UNLESS_NULL(iseq->ic_entries); RUBY_FREE_UNLESS_NULL(iseq->catch_table); RUBY_FREE_UNLESS_NULL(iseq->arg_opt_table); compile_data_free(iseq->compile_data); @@ -86,11 +87,12 @@ iseq_free(void *ptr) static void iseq_mark(void *ptr) { - rb_iseq_t *iseq; RUBY_MARK_ENTER("iseq"); if (ptr) { - iseq = ptr; + int i; + rb_iseq_t *iseq = ptr; + RUBY_GC_INFO("%s @ %s\n", RSTRING_PTR(iseq->name), RSTRING_PTR(iseq->filename)); RUBY_MARK_UNLESS_NULL(iseq->mark_ary); RUBY_MARK_UNLESS_NULL(iseq->name); @@ -102,6 +104,11 @@ iseq_mark(void *ptr) /* RUBY_MARK_UNLESS_NULL(iseq->cached_special_block); */ RUBY_MARK_UNLESS_NULL(iseq->orig); + for (i=0; i<iseq->ic_size; i++) { + RUBY_MARK_UNLESS_NULL(iseq->ic_entries[i].ic_class); + RUBY_MARK_UNLESS_NULL(iseq->ic_entries[i].ic_value); + } + if (iseq->compile_data != 0) { RUBY_MARK_UNLESS_NULL(iseq->compile_data->mark_ary); RUBY_MARK_UNLESS_NULL(iseq->compile_data->err_info); @@ -129,6 +136,7 @@ iseq_memsize(void *ptr) size += iseq->local_table_size * sizeof(ID); size += iseq->catch_table_size * sizeof(struct iseq_catch_table_entry); size += iseq->arg_opts * sizeof(VALUE); + size += iseq->ic_size * sizeof(struct iseq_inline_cache_entry); if (iseq->compile_data) { struct iseq_compile_data_storage *cur; |
