summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-10-26 17:27:32 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-10-26 17:27:32 +0000
commita11576816197d75fa17d959e74cabb612ba8b8be (patch)
tree22614a970841b61b3ac1bac4dca118b5561e4ed2 /gc.c
parente169ea0cacc981c506f75a2d3e093558e599d21d (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.c37
1 files changed, 35 insertions, 2 deletions
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 <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));