[#14922] alias $gvar — Koji Arai <JCA02266@...>

新井です。

19 messages 2001/10/14

[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error — Shugo Maeda <shugo@...> 2001/10/26

前田です。

[ruby-dev:14995] Re: [PATCH] stack overflow while GC marking.

From: nobu.nakada@...
Date: 2001-10-24 14:20:03 UTC
List: ruby-dev #14995
なかだです。

At Wed, 24 Oct 2001 22:50:03 +0900,
Nobuyoshi-Nakada wrote:
>  単純にrb_gc_mark()の回数を数えるだけじゃあんまり意味がないの
> で、ネストレベルを数えるようにしてみました。マークの最中にエラー
> が起きたときに実行を継続できるものかどうか、いささか疑問ですが。

 すいません、これはコンパイルが通りません。[ruby-dev:14986]か
らのパッチです。


--- gc.c-	Wed Oct 24 22:39:25 2001
+++ gc.c	Wed Oct 24 23:10:16 2001
@@ -445,14 +445,19 @@ rb_gc_mark(ptr)
     register RVALUE *obj = RANY(ptr);
 
-  Top:
-    if (rb_special_const_p((VALUE)obj)) return; /* special const not marked */
-    if (obj->as.basic.flags == 0) return;       /* free cell */
-    if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
-
-    if ((during_gc++ & 0xff) == 0 && rb_stack_overflow_p()) {
+    if ((during_gc & 0xff) == 0 && rb_stack_overflow_p()) {
 	if (!gc_deffered) gc_deffered = rb_ary_new2(256);
 	rb_ary_push(gc_deffered, (VALUE)obj);
 	return;
     }
+    during_gc++;
+
+  Top:
+    if (rb_special_const_p((VALUE)obj) ||	/* special const not marked */
+	(obj->as.basic.flags == 0) ||		/* free cell */
+	(obj->as.basic.flags & FL_MARK))	/* already marked */
+    {
+	--during_gc;
+	return;
+    }
 
     obj->as.basic.flags |= FL_MARK;
@@ -465,4 +470,5 @@ rb_gc_mark(ptr)
       case T_NIL:
       case T_FIXNUM:
+	--during_gc;
 	rb_bug("rb_gc_mark() called for broken object");
 	break;
@@ -600,4 +606,5 @@ rb_gc_mark(ptr)
 	    }
 	}
+	--during_gc;
 	return;			/* no need to mark class. */
     }
@@ -686,8 +693,10 @@ rb_gc_mark(ptr)
 
       default:
+	--during_gc;
 	rb_bug("rb_gc_mark(): unknown data type 0x%x(0x%x) %s",
 	       obj->as.basic.flags & T_MASK, obj,
 	       is_pointer_to_heap(obj)?"corrupted object":"non object");
     }
+    --during_gc;
 }
 
@@ -966,6 +975,6 @@ rb_gc_mark_deferred()
 }
 
-void
-rb_gc()
+static VALUE
+rb_gc_internal()
 {
     struct gc_list *list;
@@ -1059,4 +1068,16 @@ rb_gc()
     }
 
+    return Qnil;
+}
+
+void
+rb_gc()
+{
+    int state = 0;
+    rb_protect(rb_gc_internal, Qnil, &state);
+    if (state) {
+	during_gc = 0;
+	rb_jump_tag(state);
+    }
     gc_sweep();
 }


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread