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

yarv-diff:274

From: ko1 atdot.net
Date: 17 Feb 2006 17:51:30 -0000
Subject: [yarv-diff:274] r438 - in trunk: . yarvtest

Author: ko1
Date: 2006-02-18 02:51:30 +0900 (Sat, 18 Feb 2006)
New Revision: 438

Modified:
   trunk/
   trunk/ChangeLog
   trunk/eval_proc.c
   trunk/insns.def
   trunk/test.rb
   trunk/vm.c
   trunk/vm_macro.def
   trunk/yarvcore.c
   trunk/yarvtest/test_class.rb
Log:
 r664@lermite:  ko1 | 2006-02-18 02:43:39 +0900
 	* insns.def, vm.c, vm_macro.def : change BMETHOD algorithm
 	([yarv-dev:914])
 
 	* yarvtest/test_class.rb : add a test for above
 



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

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/ChangeLog	2006-02-17 17:51:30 UTC (rev 438)
@@ -4,6 +4,14 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-18(Sat) 02:40:18 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* insns.def, vm.c, vm_macro.def : change BMETHOD algorithm
+	([yarv-dev:914])
+
+	* yarvtest/test_class.rb : add a test for above
+
+
 2006-02-17(Fri) 23:59:51 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* vm.c, yarv.h : change th_invoke_proc() interface

Modified: trunk/eval_proc.c
===================================================================
--- trunk/eval_proc.c	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/eval_proc.c	2006-02-17 17:51:30 UTC (rev 438)
@@ -632,8 +632,6 @@
 	node = method->body;
     }
     else if (yarv_obj_is_proc(body)) {
-	// struct BLOCK *block;
-	// TODO: body = proc_clone(body);
 	yarv_proc_t *proc;
 	GetProcVal(body, proc);
 	if (BUILTIN_TYPE(proc->block.iseq) != T_NODE) {

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/insns.def	2006-02-17 17:51:30 UTC (rev 438)
@@ -1203,7 +1203,7 @@
 	    flag = VM_CALL_FCALL_BIT;
 	    recv = GET_SELF();
 
-	    while (ip && !ip->defined_method_id) {
+	    while (ip && !ip->klass) {
 		ip = ip->parent_iseq;
 	    }
 
@@ -1212,13 +1212,10 @@
 	    }
 
 	    id = ip->defined_method_id;
-	    klass = eval_search_super_klass(ip->klass, recv);
-
-	    if (ip != ip->local_iseq /* defined by method_defined() */ &&
-		TOPN(num) == Qfalse) {
-		/* for ZSUPER */
+	    
+	    if (ip != ip->local_iseq) {
+		/* defined by method_defined() */
 		yarv_control_frame_t *lcfp = GET_CFP();
-		int i;
 
 		while (lcfp->iseq != ip) {
 		    VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
@@ -1229,16 +1226,26 @@
 			}
 		    }
 		}
-		POPN(num);
-		num = ip->argc;
-		for (i = 0; i < ip->argc; i++) {
-		    PUSH(lcfp->dfp[i - ip->local_size]);
+
+		/* dirty hack */
+		id    = (ID) ((VALUE *)(lcfp+1)->block_iseq)[0];
+		klass =      ((VALUE *)(lcfp+1)->block_iseq)[1];
+
+		if (TOPN(num) == Qfalse) {
+		    /* for ZSUPER */
+		    int i;
+		    POPN(num);
+		    num = ip->argc;
+		    for (i = 0; i < ip->argc; i++) {
+			PUSH(lcfp->dfp[i - ip->local_size]);
+		    }
 		}
 	    }
+	    klass = eval_search_super_klass(ip->klass, recv);
+	    flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
+	    blockptr = tmp_blockptr;
+	    mn = rb_method_node(klass, id);
 	}
-	flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
-	blockptr = tmp_blockptr;
-	mn = rb_method_node(klass, id);
     }
     LABEL_IS_SC(start_method_dispatch):
 #endif
@@ -1287,10 +1294,9 @@
     yarv_iseq_t *iseq;
     int argc = num;
 
-    if (block == 0) {
+    if (GET_ISEQ()->local_iseq->type != ISEQ_TYPE_METHOD || block == 0) {
 	th_localjump_error("no block given (yield)", Qnil, 0);
     }
-
     iseq = block->iseq;
 
     if (BUILTIN_TYPE(iseq) != T_NODE) {

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/test.rb	2006-02-17 17:51:30 UTC (rev 438)
@@ -1,17 +1,4 @@
 
-__END__
-
-Object.instance_eval do
-  define_method(:hoge) do
-    p self
-    p caller(0)
-    break :ok
-  end
-end
-
-p hoge()
-__END__
-
 class A
   def hoge
     :hoge

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/vm.c	2006-02-17 17:51:30 UTC (rev 438)
@@ -376,6 +376,24 @@
     return procval;
 }
 
+static inline VALUE
+th_invoke_bmethod(yarv_thread_t *th, ID id, VALUE procval, VALUE recv,
+		  VALUE klass, int argc, VALUE *argv)
+{
+    yarv_control_frame_t *cfp = th->cfp;
+    yarv_proc_t *proc;
+    VALUE val;
+    VALUE values[2] = {
+	id, RCLASS(klass)->super,
+    };
+
+    /* dirty hack */
+    (cfp-1)->block_iseq = (void *)values;
+    GetProcVal(procval, proc);
+    val = th_invoke_proc(th, proc, recv, argc, argv);
+    return val;
+}
+
 VALUE
 th_call0(yarv_thread_t *th, VALUE klass, VALUE recv,
 	 VALUE id, ID oid, int argc, const VALUE *argv,
@@ -436,18 +454,8 @@
 	  break;
       }
       case NODE_BMETHOD:{
-	  yarv_control_frame_t *reg_cfp;
-	  int i;
-
-	  th_set_finish_env(th);
-
-	  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_invoke_bmethod(th, id, body->nd_cval,
+				  recv, klass, argc, (VALUE *)argv);
 	  break;
       }
       default:

Modified: trunk/vm_macro.def
===================================================================
--- trunk/vm_macro.def	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/vm_macro.def	2006-02-17 17:51:30 UTC (rev 438)
@@ -215,44 +215,6 @@
     }
 }
 
-MACRO macro_eval_invoke_bmethod(procval, recv, klass, blockptr, num)
-{
-    if (0) {
-	VALUE *sp = GET_SP();
-	VALUE *rsp = sp - num - 1;
-	yarv_proc_t *proc;
-	GetProcVal(procval, proc);
-
-	if (BUILTIN_TYPE(proc->block.iseq) == T_NODE) {
-	    val =
-	      th_invoke_yield_cfunc(th, &proc->block, proc->block.self,
-				    num, STACK_ADDR_FROM_TOP(num));
-	}
-	else {
-	    if (proc->block.iseq->argc != num) {
-		rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
-			 (unsigned long)num, proc->block.iseq->argc);
-	    }
-	    push_frame(th, proc->block.iseq, FRAME_MAGIC_PROC,
-		       recv, (VALUE) proc->block.dfp,
-		       proc->block.iseq->iseq_encoded, th->cfp->sp,
-		       proc->block.lfp, proc->block.iseq->local_size - num);
-	    reg_cfp->sp = rsp;
-	    RESTORE_REGS();
-	}
-    }
-    else {
-	VALUE *argv = GET_SP() - num;
-	yarv_proc_t *proc;
-	
-	GetProcVal(procval, proc);
-	val = th_invoke_proc(th, proc, recv, num, argv);
-	reg_cfp->sp = argv;
-	reg_cfp->sp[-1] = val;
-	RESTORE_REGS();
-    }
-}
-
 MACRO macro_eval_invoke_method(recv, klass, id, num, mn, blockptr)
 {
     /* method missing */
@@ -321,9 +283,10 @@
 	      break;
 	  }
 	  case NODE_BMETHOD:{
-	      macro_eval_invoke_bmethod(node->nd_cval, recv, klass, blockptr,
-					num);
-	      NEXT_INSN();
+	      VALUE *argv = GET_SP() - num;
+	      val = th_invoke_bmethod(th, id, node->nd_cval,
+				      recv, klass, num, argv);
+	      INC_SP(-num-1);
 	      break;
 	  }
 	  case NODE_ZSUPER:{

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/yarvcore.c	2006-02-17 17:51:30 UTC (rev 438)
@@ -375,8 +375,8 @@
 	if (iseq->iseq != iseq->iseq_encoded) {
 	    FREE_UNLESS_NULL(iseq->iseq_encoded);
 	}
+	
 	FREE_UNLESS_NULL(iseq->iseq);
-
 	FREE_UNLESS_NULL(iseq->insn_info_tbl);
 	FREE_UNLESS_NULL(iseq->local_tbl);
 	FREE_UNLESS_NULL(iseq->catch_table);

Modified: trunk/yarvtest/test_class.rb
===================================================================
--- trunk/yarvtest/test_class.rb	2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/yarvtest/test_class.rb	2006-02-17 17:51:30 UTC (rev 438)
@@ -320,6 +320,29 @@
       b.m_a
       $ans
     }
+    ae %q{
+      class A
+        def hoge
+          :hoge
+        end
+        def foo
+          :foo
+        end
+      end
+      class B < A
+        def memoize(name)
+          B.instance_eval do
+            define_method(name) do
+              [name, super]
+            end
+          end
+        end
+      end
+      b = B.new
+      b.memoize(:hoge)
+      b.memoize(:foo)
+      [b.foo, b.hoge]
+    }
   end
   
   def test_zsuper


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

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