diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-26 17:27:32 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-26 17:27:32 +0000 |
commit | a11576816197d75fa17d959e74cabb612ba8b8be (patch) | |
tree | 22614a970841b61b3ac1bac4dca118b5561e4ed2 /gc.c | |
parent | e169ea0cacc981c506f75a2d3e093558e599d21d (diff) |
* 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
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 37 |
1 files changed, 35 insertions, 2 deletions
@@ -19,6 +19,7 @@ #include "eval_intern.h" #include "vm_core.h" #include "gc.h" +#include "constant.h" #include <stdio.h> #include <setjmp.h> #include <sys/types.h> @@ -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)); |