[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:250

From: ko1 atdot.net
Date: 14 Feb 2006 03:51:35 -0000
Subject: [yarv-diff:250] r413 - in trunk: . test

Author: ko1
Date: 2006-02-14 12:51:35 +0900 (Tue, 14 Feb 2006)
New Revision: 413

Modified:
   trunk/
   trunk/ChangeLog
   trunk/eval.c
   trunk/eval_proc.c
   trunk/runruby.rb
   trunk/test.rb
   trunk/test/runner.rb
   trunk/vm.c
Log:
 r617@lermite:  ko1 | 2006-02-14 12:03:55 +0900
 	* eval.c : fix to check passed block at block_given_p
 
 	* eval_proc.c : fix to pass block at Method#call
 
 	* runruby.rb : fix to apply ruby
 
 	* test/runner.rb : GC.stress (comment out)
 
 	* vm.c : fix indnet
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:613
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:617

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/ChangeLog	2006-02-14 03:51:35 UTC (rev 413)
@@ -4,6 +4,19 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-14(Tue) 12:01:06 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* eval.c : fix to check passed block at block_given_p
+
+	* eval_proc.c : fix to pass block at Method#call
+
+	* runruby.rb : fix to apply ruby
+
+	* test/runner.rb : GC.stress (comment out)
+
+	* vm.c : fix indnet
+
+
 2006-02-14(Tue) 08:04:33 +0900  Minero Aoki  <aamine loveruby.net>
 
 	* lib/tempfile.rb: use Mutex instead of Thread.critical.

Modified: trunk/eval.c
===================================================================
--- trunk/eval.c	2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/eval.c	2006-02-14 03:51:35 UTC (rev 413)
@@ -1093,7 +1093,9 @@
 int
 rb_block_given_p()
 {
-    if (GC_GUARDED_PTR_REF(GET_THREAD()->cfp->lfp[0])) {
+    yarv_thread_t *th = GET_THREAD();
+    if (GC_GUARDED_PTR_REF(th->cfp->lfp[0]) ||
+	th->passed_block) {
 	return Qtrue;
     }
     else {
@@ -1135,7 +1137,8 @@
     yarv_thread_t *th = GET_THREAD();
     yarv_control_frame_t *cfp = th->cfp;
     cfp = th_get_ruby_level_cfp(th, YARV_PREVIOUS_CONTROL_FRAME(cfp));
-    if (GC_GUARDED_PTR_REF(cfp->lfp[0])) {
+    if (GC_GUARDED_PTR_REF(cfp->lfp[0]) ||
+	th->passed_block) {
 	return Qtrue;
     }
     else {
@@ -1361,15 +1364,8 @@
 }
 
 VALUE
-#ifdef HAVE_STDARG_PROTOTYPES
 rb_rescue2(VALUE (*b_proc) (ANYARGS), VALUE data1, VALUE (*r_proc) (ANYARGS),
 	   VALUE data2, ...)
-#else
-rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
-    VALUE (*b_proc) (ANYARGS), (*r_proc) (ANYARGS);
-    VALUE data1, data2;
-    va_dcl
-#endif
 {
     int state;
     volatile VALUE result;

Modified: trunk/eval_proc.c
===================================================================
--- trunk/eval_proc.c	2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/eval_proc.c	2006-02-14 03:51:35 UTC (rev 413)
@@ -438,7 +438,7 @@
     ID oid = id;
 
   again:
-    if ((body = rb_get_method_body(klass, id, &id)) == 0) {
+    if ((body = rb_get_method_body(klass, id, 0)) == 0) {
 	print_undef(rklass, oid);
     }
 
@@ -459,6 +459,7 @@
     method = Data_Make_Struct(mklass, struct METHOD, bm_mark, -1, data);
     data->klass = klass;
     data->recv = obj;
+
     data->id = id;
     data->body = body;
     data->rklass = rklass;
@@ -807,6 +808,7 @@
 	    ruby_safe_level = 4;
     }
     if ((state = EXEC_TAG()) == 0) {
+	PASS_PASSED_BLOCK();
 	result = th_call0(GET_THREAD(),
 			  data->klass, data->recv, data->id, data->oid,
 			  argc, argv, data->body, 0);

Modified: trunk/runruby.rb
===================================================================
--- trunk/runruby.rb	2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/runruby.rb	2006-02-14 03:51:35 UTC (rev 413)
@@ -56,4 +56,7 @@
   end
 end
 
-exec ruby, *ARGV
+# ruby = "gdb --args #{ruby}"
+cmd = [ruby, *ARGV].join(' ')
+p cmd
+exec cmd

Modified: trunk/test/runner.rb
===================================================================
--- trunk/test/runner.rb	2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/test/runner.rb	2006-02-14 03:51:35 UTC (rev 413)
@@ -5,5 +5,5 @@
 rcsid = %w$Id: runner.rb,v 1.14 2005/02/17 04:50:49 ntalbott Exp $
 Version = rcsid[2].scan(/\d+/).collect!(&method(:Integer)).freeze
 Release = rcsid[3].freeze
-
+# GC.stress = true
 exit Test::Unit::AutoRunner.run(true, File.dirname($0))

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/test.rb	2006-02-14 03:51:35 UTC (rev 413)
@@ -1,3 +1,10 @@
+[].each.each
+__END__
+a = [1].each
+a.each{|e| p e}
+__END__
+
+
 BEGIN{a = 1}
 p defined?(a) #=> 
 

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/vm.c	2006-02-14 03:51:35 UTC (rev 413)
@@ -392,7 +392,7 @@
     VALUE val;
     yarv_block_t *blockptr = 0;
 
-    //printf("id: %s, argc: %d\n", rb_id2name(id), argc);
+    if (0) printf("id: %s (%p), nd: %s, argc: %d, passed: %p\n", rb_id2name(id), id, node_name(nd_type(body)), argc, th->passed_block);
     //SDR2(th->cfp);
 
     if (th->passed_block) {
@@ -400,67 +400,67 @@
 	th->passed_block = 0;
     }
     switch (nd_type(body)) {
-    case YARV_METHOD_NODE:{
-	    yarv_control_frame_t *reg_cfp;
-	    int i;
-	    const int flag = 0;
+      case YARV_METHOD_NODE:{
+	  yarv_control_frame_t *reg_cfp;
+	  int i;
+	  const int flag = 0;
 
-	    th_set_finish_env(th);
-	    reg_cfp = th->cfp;
-	    for (i = 0; i < argc; i++) {
-		*reg_cfp->sp++ = argv[i];
-	    }
-	    macro_eval_invoke_func(body->nd_body, recv, klass, blockptr,
-				   argc);
-	    val = th_eval_body(th);
-	    break;
-	}
-    case NODE_CFUNC:{
-	    yarv_control_frame_t *reg_cfp = th->cfp;
-	    struct yarv_cmethod_info cmi = { 0, id, klass };
+	  th_set_finish_env(th);
+	  reg_cfp = th->cfp;
+	  for (i = 0; i < argc; i++) {
+	      *reg_cfp->sp++ = argv[i];
+	  }
+	  macro_eval_invoke_func(body->nd_body, recv, klass, blockptr,
+				 argc);
+	  val = th_eval_body(th);
+	  break;
+      }
+      case NODE_CFUNC:{
+	  yarv_control_frame_t *reg_cfp = th->cfp;
+	  struct yarv_cmethod_info cmi = { 0, id, klass };
 
-	    th_set_env(th, (yarv_iseq_t *)&cmi,
-		       FRAME_MAGIC_CFUNC, recv, (VALUE)blockptr,
-		       0, reg_cfp->sp, 0, 0, 0, 0);
+	  th_set_env(th, (yarv_iseq_t *)&cmi,
+		     FRAME_MAGIC_CFUNC, recv, (VALUE)blockptr,
+		     0, reg_cfp->sp, 0, 0, 0, 0);
 
-	    val = call_cfunc(body->nd_cfnc, recv, body->nd_argc, argc, argv);
+	  val = call_cfunc(body->nd_cfnc, recv, body->nd_argc, argc, argv);
 
-	    th->cfp = reg_cfp;	/* pop control stack frame */
-	    break;
-	}
-    case NODE_ATTRSET:{
-	    if (argc != 1) {
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
-			 argc);
-	    }
-	    val = rb_ivar_set(recv, body->nd_vid, argv[0]);
-	    break;
-	}
-    case NODE_IVAR:{
-	    if (argc != 0) {
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)",
-			 argc);
-	    }
-	    val = rb_attr_get(recv, body->nd_vid);
-	    break;
-	}
-    case NODE_BMETHOD:{
-	    yarv_control_frame_t *reg_cfp;
-	    int i;
+	  th->cfp = reg_cfp;	/* pop control stack frame */
+	  break;
+      }
+      case NODE_ATTRSET:{
+	  if (argc != 1) {
+	      rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
+		       argc);
+	  }
+	  val = rb_ivar_set(recv, body->nd_vid, argv[0]);
+	  break;
+      }
+      case NODE_IVAR:{
+	  if (argc != 0) {
+	      rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)",
+		       argc);
+	  }
+	  val = rb_attr_get(recv, body->nd_vid);
+	  break;
+      }
+      case NODE_BMETHOD:{
+	  yarv_control_frame_t *reg_cfp;
+	  int i;
 
-	    th_set_finish_env(th);
+	  th_set_finish_env(th);
 
-	    reg_cfp = th->cfp;
+	  reg_cfp = th->cfp;
 
-	    for (i = 0; i < argc; i++) {
-		*reg_cfp->sp++ = argv[i];
-	    }
-	    macro_eval_invoke_bmethod(body->nd_cval, recv, klass, blockptr,
-				      argc);
-	    val = th_eval_body(th);
-	    break;
-	}
-    default:
+	  for (i = 0; i < argc; i++) {
+	      *reg_cfp->sp++ = argv[i];
+	  }
+	  macro_eval_invoke_bmethod(body->nd_cval, recv, klass, blockptr,
+				    argc);
+	  val = th_eval_body(th);
+	  break;
+      }
+      default:
 	rb_bug("unsupported: thread_call0");
     }
     YARV_CHECK_INTS();


-- 
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]