[前][次][番号順一覧][スレッド一覧]

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

[前][次][番号順一覧][スレッド一覧]