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

ruby-changes:1988

From: ko1@a...
Date: 21 Sep 2007 14:52:07 +0900
Subject: [ruby-changes:1988] nobu - Ruby:r13479 (trunk): * gc.c (gc_mark_rest): copy just used part.

nobu	2007-09-21 14:51:43 +0900 (Fri, 21 Sep 2007)

  New Revision: 13479

  Modified files:
    trunk/ChangeLog
    trunk/gc.c

  Log:
    * gc.c (gc_mark_rest): copy just used part.
    
    * gc.c (gc_mark_children): mark u1 and u2 of NODE_ARGSCAT.
    
    * gc.c (os_obj_of): hide T_VALUES too.  [ruby-dev:31804]
    
    * gc.c (run_final): freeze temporary argument array.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13479&r2=13478
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/gc.c?r1=13479&r2=13478

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 13478)
+++ ChangeLog	(revision 13479)
@@ -1,3 +1,13 @@
+Fri Sep 21 14:51:40 2007  Nobuyoshi Nakada  <nobu@r...>
+
+	* gc.c (gc_mark_rest): copy just used part.
+
+	* gc.c (gc_mark_children): mark u1 and u2 of NODE_ARGSCAT.
+
+	* gc.c (os_obj_of): hide T_VALUES too.  [ruby-dev:31804]
+
+	* gc.c (run_final): freeze temporary argument array.
+
 Fri Sep 21 04:58:39 2007  Nobuyoshi Nakada  <nobu@r...>
 
 	* misc/ruby-style.el (ruby-style-label-indent): fix for function top
Index: gc.c
===================================================================
--- gc.c	(revision 13478)
+++ gc.c	(revision 13479)
@@ -712,10 +712,10 @@
     VALUE *p;
 
     p = (mark_stack_ptr - mark_stack) + tmp_arry;
-    MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX);
+    MEMCPY(tmp_arry, mark_stack, VALUE, p - tmp_arry);
 
     init_mark_stack();
-    while(p != tmp_arry){
+    while (p != tmp_arry) {
 	p--;
 	gc_mark_children(*p, 0);
     }
@@ -924,6 +924,7 @@
 	  case NODE_MODULE:
 	  case NODE_ALIAS:
 	  case NODE_VALIAS:
+	  case NODE_ARGSCAT:
 	    gc_mark((VALUE)obj->as.node.u1.node, lev);
 	    /* fall through */
 	  case NODE_FBODY:	/* 2 */
@@ -1736,6 +1737,7 @@
 		switch (TYPE(p)) {
 		  case T_ICLASS:
 		  case T_NODE:
+		  case T_VALUES:
 		    continue;
 		  case T_CLASS:
 		    if (FL_TEST(p, FL_SINGLETON)) continue;
@@ -1921,8 +1923,9 @@
 }
 
 static VALUE
-run_single_final(VALUE *args)
+run_single_final(VALUE arg)
 {
+    VALUE *args = (VALUE *)arg;
     rb_eval_cmd(args[0], args[1], (int)args[2]);
     return Qnil;
 }
@@ -1937,19 +1940,23 @@
     objid = rb_obj_id(obj);	/* make obj into id */
     rb_thread_critical = Qtrue;
     args[1] = 0;
+    if (RARRAY_LEN(finalizers) > 0) {
+	args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
+    }
     args[2] = (VALUE)rb_safe_level();
     for (i=0; i<RARRAY_LEN(finalizers); i++) {
 	args[0] = RARRAY_PTR(finalizers)[i];
-	if (!args[1]) args[1] = rb_ary_new3(1, objid);
-	rb_protect((VALUE(*)(VALUE))run_single_final, (VALUE)args, &status);
+	rb_protect(run_single_final, (VALUE)args, &status);
     }
     if (finalizer_table && st_delete(finalizer_table, (st_data_t*)&obj, &table)) {
+	if (!args[1] && RARRAY_LEN(table) > 0) {
+	    args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
+	}
 	for (i=0; i<RARRAY_LEN(table); i++) {
 	    VALUE final = RARRAY_PTR(table)[i];
 	    args[0] = RARRAY_PTR(final)[1];
-	    if (!args[1]) args[1] = rb_ary_new3(1, objid);
 	    args[2] = FIX2INT(RARRAY_PTR(final)[0]);
-	    rb_protect((VALUE(*)(VALUE))run_single_final, (VALUE)args, &status);
+	    rb_protect(run_single_final, (VALUE)args, &status);
 	}
     }
     rb_thread_critical = critical_save;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

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