summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-22 06:22:00 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-22 06:22:00 +0000
commit8837f5948551444299fe5a13d06fa210dce01c65 (patch)
tree216cbc3dab14a166b6faff8fbcc51dfdc0469a3a /gc.c
parent48df11da1c6a53a34881649d49fa1bfaf9abdb61 (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_7@21731 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 6edd5b433f..111220eb76 100644
--- a/gc.c
+++ b/gc.c
@@ -724,6 +724,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;