summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-26 19:40:49 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-26 19:40:49 +0000
commitb416cc6f3f843fd17cef94bdb10eb6af63fd5b18 (patch)
treef719a4464d14c893f0e22317f3a08df7476e1cb7 /marshal.c
parent71341b814a863ffd95f9fc640c1d62ae83b668f8 (diff)
* gc.c (rb_mark_set): new function to mark keys.
* marshal.c (struct dump_arg, struct load_arg): added wrappers to mark data and compat_tbl entries. [ruby-dev:31870] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13528 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/marshal.c b/marshal.c
index f776ed1ccf..6b7108e4df 100644
--- a/marshal.c
+++ b/marshal.c
@@ -89,8 +89,6 @@ typedef struct {
VALUE (*loader)(VALUE, VALUE);
} marshal_compat_t;
-#define make_compat_tbl_wrapper(tbl) Data_Wrap_Struct(rb_cData, rb_mark_tbl, 0, tbl)
-
static st_table *compat_allocator_tbl;
static VALUE compat_allocator_tbl_wrapper;
@@ -138,7 +136,7 @@ struct dump_arg {
st_table *data;
int taint;
st_table *compat_tbl;
- VALUE compat_tbl_wrapper;
+ VALUE wrapper;
};
struct dump_call_arg {
@@ -147,6 +145,14 @@ struct dump_call_arg {
int limit;
};
+static void
+mark_dump_arg(void *ptr)
+{
+ struct dump_arg *p = ptr;
+ rb_mark_set(p->data);
+ rb_mark_hash(p->compat_tbl);
+}
+
static VALUE
class2path(VALUE klass)
{
@@ -722,8 +728,8 @@ dump_ensure(struct dump_arg *arg)
st_free_table(arg->symbols);
st_free_table(arg->data);
st_free_table(arg->compat_tbl);
- DATA_PTR(arg->compat_tbl_wrapper) = 0;
- arg->compat_tbl_wrapper = 0;
+ DATA_PTR(arg->wrapper) = 0;
+ arg->wrapper = 0;
if (arg->taint) {
OBJ_TAINT(arg->str);
}
@@ -797,7 +803,7 @@ marshal_dump(int argc, VALUE *argv)
arg.data = st_init_numtable();
arg.taint = Qfalse;
arg.compat_tbl = st_init_numtable();
- arg.compat_tbl_wrapper = make_compat_tbl_wrapper(arg.compat_tbl);
+ arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
c_arg.obj = obj;
c_arg.arg = &arg;
c_arg.limit = limit;
@@ -1499,7 +1505,7 @@ marshal_load(int argc, VALUE *argv)
arg.src = port;
arg.offset = 0;
arg.compat_tbl = st_init_numtable();
- arg.compat_tbl_wrapper = make_compat_tbl_wrapper(arg.compat_tbl);
+ arg.compat_tbl_wrapper = Data_Wrap_Struct(rb_cData, rb_mark_tbl, 0, arg.compat_tbl);
major = r_byte(&arg);
minor = r_byte(&arg);