まつもと ゆきひろです

ruby-listからもってきました.

In message "[ruby-list:6762] Re: Mutex/ConditionVariable/Queue"
    on 98/02/25, Yukihiro Matsumoto <matz / netlab.co.jp> writes:

|まつもと ゆきひろです

|前田さんに最新のeval.cを送り付けてみましょう.

ええと,送り付けた後分かったことがいくつかあります

  * (私信)前田さんに送ったものには統計用の妙なコードがくっつ
    いてます.実行後変なものが出力されますが,無視して下さい.

  * 公開していないreturn_value(cf.[ruby-list:6701])パッチを
    当てないとこの問題は解決しないようです.

というわけで,このパッチも当ててみて下さい.

diff -u -1 -r1.1.1.2.2.12 eval.c
--- eval.c	1998/02/18 01:56:34	1.1.1.2.2.12
+++ eval.c	1998/02/25 09:04:06
@@ -453,2 +453,4 @@
 #define POP_TAG()			\
+    if (_tag.prev)			\
+        _tag.prev->retval = _tag.retval;\
     prot_tag = _tag.prev;		\
@@ -1396,3 +1398,5 @@
 
-static void return_value _((VALUE val));
+static void return_check _((void));
+#define return_value(v) prot_tag->retval = (v)
+
 static VALUE
@@ -1762,2 +1771,3 @@
 	}
+	return_check();
 	JUMP_TAG(TAG_RETURN);
@@ -5930,10 +5968,8 @@
 static void
-return_value(val)
-    VALUE val;
+return_check()
 {
     struct tag *tt = prot_tag;
-	    
+
     while (tt) {
 	if (tt->tag == PROT_FUNC) {
-	    tt->retval = val;
 	    break;
@@ -5942,3 +5978,3 @@
 	if (tt->tag == PROT_THREAD) {
-	    Raise(eThreadError, "return from within thread 0x%x\n",
+	    Raise(eThreadError, "return from within thread 0x%x",
 		  curr_thread);
@@ -5949,2 +5985 @@
 }
-