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