From a11576816197d75fa17d959e74cabb612ba8b8be Mon Sep 17 00:00:00 2001 From: mame Date: Tue, 26 Oct 2010 17:27:32 +0000 Subject: * class.c, constant.h, gc.c, method.h, object.c, variable.c, vm_insnhelper.c: use struct rb_constant_entry_t as entry of RCLASS_CONST_TBL. RCLASS_CONST_TBL has contained VALUE of constant directly. Now instead rb_const_entry_t is contained in RCLASS_CONST_TBL, rb_const_entry_t is managed by malloc, and have not only the value itself but also visibility flag. This is another preparation for private constant (see [ruby-dev:39685][ruby-core:32698]). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29602 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- gc.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'gc.c') diff --git a/gc.c b/gc.c index dbb432b980..36e7696610 100644 --- a/gc.c +++ b/gc.c @@ -19,6 +19,7 @@ #include "eval_intern.h" #include "vm_core.h" #include "gc.h" +#include "constant.h" #include #include #include @@ -1504,6 +1505,38 @@ rb_free_m_table(st_table *tbl) st_free_table(tbl); } +static int +mark_const_entry_i(ID key, const rb_const_entry_t *ce, st_data_t data) +{ + struct mark_tbl_arg *arg = (void*)data; + gc_mark(arg->objspace, ce->value, arg->lev); + return ST_CONTINUE; +} + +static void +mark_const_tbl(rb_objspace_t *objspace, st_table *tbl, int lev) +{ + struct mark_tbl_arg arg; + if (!tbl) return; + arg.objspace = objspace; + arg.lev = lev; + st_foreach(tbl, mark_const_entry_i, (st_data_t)&arg); +} + +static int +free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data) +{ + xfree(ce); + return ST_CONTINUE; +} + +void +rb_free_const_table(st_table *tbl) +{ + st_foreach(tbl, free_const_entry_i, 0); + st_free_table(tbl); +} + void rb_mark_tbl(st_table *tbl) { @@ -1718,7 +1751,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev) case T_MODULE: mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev); mark_tbl(objspace, RCLASS_IV_TBL(obj), lev); - mark_tbl(objspace, RCLASS_CONST_TBL(obj), lev); + mark_const_tbl(objspace, RCLASS_CONST_TBL(obj), lev); ptr = RCLASS_SUPER(obj); goto again; @@ -2181,7 +2214,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj) st_free_table(RCLASS_IV_TBL(obj)); } if (RCLASS_CONST_TBL(obj)) { - st_free_table(RCLASS_CONST_TBL(obj)); + rb_free_const_table(RCLASS_CONST_TBL(obj)); } if (RCLASS_IV_INDEX_TBL(obj)) { st_free_table(RCLASS_IV_INDEX_TBL(obj)); -- cgit v1.2.3