ruby-changes:2037
From: ko1@a...
Date: 27 Sep 2007 04:42:07 +0900
Subject: [ruby-changes:2037] nobu - Ruby:r13528 (trunk): * gc.c (rb_mark_set): new function to mark keys.
nobu 2007-09-27 04:40:49 +0900 (Thu, 27 Sep 2007)
New Revision: 13528
Modified files:
trunk/ChangeLog
trunk/gc.c
trunk/include/ruby/intern.h
trunk/marshal.c
Log:
* 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]
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13528&r2=13527
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/gc.c?r1=13528&r2=13527
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/marshal.c?r1=13528&r2=13527
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/intern.h?r1=13528&r2=13527
Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h (revision 13527)
+++ include/ruby/intern.h (revision 13528)
@@ -307,6 +307,7 @@
char *rb_source_filename(const char*);
void rb_gc_mark_locations(VALUE*, VALUE*);
void rb_mark_tbl(struct st_table*);
+void rb_mark_set(struct st_table*);
void rb_mark_hash(struct st_table*);
void rb_gc_mark_maybe(VALUE);
void rb_gc_mark(VALUE);
Index: ChangeLog
===================================================================
--- ChangeLog (revision 13527)
+++ ChangeLog (revision 13528)
@@ -1,7 +1,9 @@
-Thu Sep 27 04:12:01 2007 Nobuyoshi Nakada <nobu@r...>
+Thu Sep 27 04:40:47 2007 Nobuyoshi Nakada <nobu@r...>
+ * gc.c (rb_mark_set): new function to mark keys.
+
* marshal.c (struct dump_arg, struct load_arg): added wrappers to mark
- compat_tbl entries. [ruby-dev:31870]
+ data and compat_tbl entries. [ruby-dev:31870]
Thu Sep 27 03:17:41 2007 Nobuyoshi Nakada <nobu@r...>
Index: gc.c
===================================================================
--- gc.c (revision 13527)
+++ gc.c (revision 13528)
@@ -784,6 +784,26 @@
}
static int
+mark_key(VALUE key, VALUE value, int lev)
+{
+ gc_mark(key, lev);
+ return ST_CONTINUE;
+}
+
+static void
+mark_set(st_table *tbl, int lev)
+{
+ if (!tbl) return;
+ st_foreach(tbl, mark_key, lev);
+}
+
+void
+rb_mark_set(st_table *tbl)
+{
+ mark_set(tbl, 0);
+}
+
+static int
mark_keyvalue(VALUE key, VALUE value, int lev)
{
gc_mark(key, lev);
Index: marshal.c
===================================================================
--- marshal.c (revision 13527)
+++ marshal.c (revision 13528)
@@ -89,8 +89,6 @@
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 @@
st_table *data;
int taint;
st_table *compat_tbl;
- VALUE compat_tbl_wrapper;
+ VALUE wrapper;
};
struct dump_call_arg {
@@ -147,6 +145,14 @@
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 @@
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 @@
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 @@
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);
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml