Index: eval.c
===================================================================
RCS file: //sharui/cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.481
diff -u -2 -p -r1.481 eval.c
--- eval.c	16 Jul 2003 07:11:27 -0000	1.481
+++ eval.c	16 Jul 2003 08:39:56 -0000
@@ -3995,4 +3993,92 @@ rb_jump_tag(tag)
 }
 
+static inline VALUE
+call_cfunc(func, recv, len, argc, argv)
+    VALUE (*func)();
+    VALUE recv;
+    int len, argc;
+    VALUE *argv;
+{
+    if (len >= 0 && argc != len) {
+	rb_raise(rb_eArgError, "wrong number of arguments(%d for %d)",
+		 argc, len);
+    }
+
+    switch (len) {
+      case -2:
+	return (*func)(recv, rb_ary_new4(argc, argv));
+	break;
+      case -1:
+	return (*func)(argc, argv, recv);
+	break;
+      case 0:
+	return (*func)(recv);
+	break;
+      case 1:
+	return (*func)(recv, argv[0]);
+	break;
+      case 2:
+	return (*func)(recv, argv[0], argv[1]);
+	break;
+      case 3:
+	return (*func)(recv, argv[0], argv[1], argv[2]);
+	break;
+      case 4:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3]);
+	break;
+      case 5:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4]);
+	break;
+      case 6:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5]);
+	break;
+      case 7:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6]);
+	break;
+      case 8:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7]);
+	break;
+      case 9:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7], argv[8]);
+	break;
+      case 10:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7], argv[8], argv[9]);
+	break;
+      case 11:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]);
+	break;
+      case 12:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7], argv[8], argv[9],
+		       argv[10], argv[11]);
+	break;
+      case 13:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
+		       argv[11], argv[12]);
+	break;
+      case 14:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
+		       argv[11], argv[12], argv[13]);
+	break;
+      case 15:
+	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
+		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
+		       argv[11], argv[12], argv[13], argv[14]);
+	break;
+      default:
+	rb_raise(rb_eArgError, "too many arguments(%d)", len);
+	break;
+    }
+    return Qnil;		/* not reached */
+}
+
 int
 rb_block_given_p()
@@ -4122,10 +4208,37 @@ rb_yield_0(val, self, klass, flags, aval
 	    result = Qnil;
 	}
-	else if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
-	    if (avalue) val = avalue_to_svalue(val);
-	    result = (*node->nd_cfnc)(val, node->nd_tval, self);
-	}
 	else {
-	    result = rb_eval(self, node);
+	    switch (nd_type(node)) {
+	      case NODE_CFUNC:
+		{
+		    int argc = 1;
+		    VALUE *argv = &val;
+		    VALUE ary = Qnil;
+		    if (avalue) {
+			ary = rb_check_array_type(val);
+			if (!NIL_P(ary)) {
+			    val = ary;
+			    argc = RARRAY(val)->len;
+			    argv = RARRAY(val)->ptr;
+			}
+		    }
+		    if (node->nd_argc == -2) {
+			if (NIL_P(ary)) ary = rb_ary_new4(1, &val);
+			result = (*node->nd_cfnc)(ary, node->nd_cval);
+		    }
+		    else {
+			result = call_cfunc(node->nd_cfnc, node->nd_cval,
+					    node->nd_argc, argc, argv);
+		    }
+		}
+		break;
+	      case NODE_IFUNC:
+		if (avalue) val = avalue_to_svalue(val);
+		result = (*node->nd_cfnc)(val, node->nd_tval, self);
+		break;
+	      default:
+		result = rb_eval(self, node);
+		break;
+	    }
 	}
     }
@@ -4733,92 +4846,4 @@ rb_undefined(obj, id, argc, argv, call_s
 }
 
-static inline VALUE
-call_cfunc(func, recv, len, argc, argv)
-    VALUE (*func)();
-    VALUE recv;
-    int len, argc;
-    VALUE *argv;
-{
-    if (len >= 0 && argc != len) {
-	rb_raise(rb_eArgError, "wrong number of arguments(%d for %d)",
-		 argc, len);
-    }
-
-    switch (len) {
-      case -2:
-	return (*func)(recv, rb_ary_new4(argc, argv));
-	break;
-      case -1:
-	return (*func)(argc, argv, recv);
-	break;
-      case 0:
-	return (*func)(recv);
-	break;
-      case 1:
-	return (*func)(recv, argv[0]);
-	break;
-      case 2:
-	return (*func)(recv, argv[0], argv[1]);
-	break;
-      case 3:
-	return (*func)(recv, argv[0], argv[1], argv[2]);
-	break;
-      case 4:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3]);
-	break;
-      case 5:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4]);
-	break;
-      case 6:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5]);
-	break;
-      case 7:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6]);
-	break;
-      case 8:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7]);
-	break;
-      case 9:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7], argv[8]);
-	break;
-      case 10:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7], argv[8], argv[9]);
-	break;
-      case 11:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]);
-	break;
-      case 12:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7], argv[8], argv[9],
-		       argv[10], argv[11]);
-	break;
-      case 13:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
-		       argv[11], argv[12]);
-	break;
-      case 14:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
-		       argv[11], argv[12], argv[13]);
-	break;
-      case 15:
-	return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4],
-		       argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
-		       argv[11], argv[12], argv[13], argv[14]);
-	break;
-      default:
-	rb_raise(rb_eArgError, "too many arguments(%d)", len);
-	break;
-    }
-    return Qnil;		/* not reached */
-}
-
 static VALUE
 rb_call0(klass, recv, id, oid, argc, argv, body, nosuper)
@@ -7562,6 +7673,29 @@ rb_proc_new(func, val)
 }
 
-static VALUE
-method_proc(method)
+VALUE
+rb_block_new(val, func, argc)
+    VALUE val;
+    VALUE (*func)(ANYARGS);
+    int argc;
+{
+    struct BLOCK *data;
+    VALUE block;
+
+    block = Data_Make_Struct(rb_cProc, struct BLOCK, blk_mark, blk_free, data);
+
+    data->orig_thread = rb_thread_current();
+    data->wrapper = ruby_wrapper;
+    data->flags |= BLOCK_DYNAMIC;
+
+    proc_save_safe_level(block);
+    data->flags |= BLOCK_LAMBDA;
+    data->body = NEW_CFUNC(func, argc);
+    data->body->nd_cval = val;
+
+    return block;
+}
+
+VALUE
+rb_method_proc(method)
     VALUE method;
 {
