summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-22 06:18:48 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-22 06:18:48 +0000
commita040f505305c855efec5a89725d8d507ee7ff6e2 (patch)
treee73094a5dcd67ef3a5d5af53873a4d7619fedd17 /gc.c
parentd7da07cd2cda7868df47ec4670b91b4c7f077bf9 (diff)
merge revision(s) 19078,20097:
* gc.c (rb_mark_set): new function to mark keys. * marshal.c (struct dump_arg, struct load_arg): added wrappers to mark data entries. backport from trunk r13527,r13528,r13961,r16533. [ruby-dev:36082] * marshal.c (marshal_load): arg.data is no longer a VALUE but a st_table, and freed in load_ensure. pointed out by pegacorn. [ruby-dev:37008] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@21729 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index b3e1f3bb2c..7f9ad06611 100644
--- a/gc.c
+++ b/gc.c
@@ -684,6 +684,31 @@ rb_mark_tbl(tbl)
}
static int
+mark_key(key, value, lev)
+ VALUE key, value;
+ int lev;
+{
+ gc_mark(key, lev);
+ return ST_CONTINUE;
+}
+
+static void
+mark_set(tbl, lev)
+ st_table *tbl;
+ int lev;
+{
+ if (!tbl) return;
+ st_foreach(tbl, mark_key, lev);
+}
+
+void
+rb_mark_set(tbl)
+ st_table *tbl;
+{
+ mark_set(tbl, 0);
+}
+
+static int
mark_keyvalue(key, value, lev)
VALUE key;
VALUE value;