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

yarv-diff:235

From: ko1 atdot.net
Date: 13 Feb 2006 14:09:40 -0000
Subject: [yarv-diff:235] r396 - in trunk: . yarvtest

Author: ko1
Date: 2006-02-13 23:09:39 +0900 (Mon, 13 Feb 2006)
New Revision: 396

Modified:
   trunk/
   trunk/ChangeLog
   trunk/insns.def
   trunk/signal.c
   trunk/test.rb
   trunk/yarvcore.c
   trunk/yarvtest/test_class.rb
Log:
 r585@leremita:  ko1 | 2006-02-13 23:09:19 +0900
 	* insns.def : traverse all iseq to find super method ([yarv-dev:859])
 
 	* yarvtest/test_class.rb : add a test for above
 
 	* yarvcore.c : add clear iseq->defined_method_id
 
 	* signal.c : fix to prohibit double segv handler kicked
 



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

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/ChangeLog	2006-02-13 14:09:39 UTC (rev 396)
@@ -4,6 +4,17 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-13(Mon) 22:49:42 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* insns.def : traverse all iseq to find super method ([yarv-dev:859])
+
+	* yarvtest/test_class.rb : add a test for above
+
+	* yarvcore.c : add clear iseq->defined_method_id
+
+	* signal.c : fix to prohibit double segv handler kicked
+
+
 2006-02-13(Mon) 22:09:12 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* compile.c : support NODE_DECL, NODE_CLASS with NODE_CLON3 prefix

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/insns.def	2006-02-13 14:09:39 UTC (rev 396)
@@ -818,6 +818,7 @@
 
     COPY_CREF(miseq->cref_stack, cref);
     miseq->klass = th_get_cbase(th);
+    miseq->defined_method_id = rb_to_id(miseq->name);
     
     /* make new node */
     newbody = NEW_NODE(YARV_METHOD_NODE, NOEX_PUBLIC, body, 0);
@@ -883,6 +884,7 @@
     GetISeqVal(body, siseq);
     COPY_CREF(siseq->cref_stack, get_cref(GET_ISEQ(), GET_LFP()));
     siseq->klass = CLASS_OF(obj);
+    siseq->defined_method_id = id;
 
     newbody = NEW_NODE(YARV_METHOD_NODE, NOEX_PUBLIC, body, 0);
 
@@ -1254,12 +1256,12 @@
 #if !YARV_AOT_COMPILED
     if (0) {
 	if (0) {
-	  LABEL_IS_SC(start_init_in_send_for_opt_1):
+	    LABEL_IS_SC(start_init_in_send_for_opt_1):
 	    num = 1;
 	    recv = TOPN(1);
 	}
 	else if (0) {
-	  LABEL_IS_SC(start_init_in_send_for_opt_2):
+	    LABEL_IS_SC(start_init_in_send_for_opt_2):
 	    num = 2;
 	    recv = TOPN(2);
 	}
@@ -1269,52 +1271,49 @@
 	mn = rb_method_node(klass, id);
     }
     if (0) {
-      LABEL_IS_SC(start_init_in_super):
+	LABEL_IS_SC(start_init_in_super):
 	{
 	    yarv_iseq_t *iseq = GET_ISEQ();
-	    yarv_iseq_t *ip = iseq->local_iseq;
+	    yarv_iseq_t *ip = iseq;
 
 	    num = tmp_num;
 	    flag = VM_CALL_FCALL_BIT;
 	    recv = GET_SELF();
 
-	    if (ip->klass == 0) {
-		ip = iseq;
-		/* super in define_method */
-		while (!ip->defined_method_id) {
-		    ip = ip->parent_iseq;
-		}
-		id = ip->defined_method_id;
-		klass = eval_search_super_klass(ip->klass, recv);
-		if (TOPN(num) == Qfalse) {
-		    yarv_control_frame_t *lcfp = GET_CFP();
-		    int i;
+	    while (ip && !ip->defined_method_id) {
+		ip = ip->parent_iseq;
+	    }
+	    if (ip == 0) {
+		rb_raise(rb_eNoMethodError, "super called outside of method");
+	    }
 
-		    while (lcfp->iseq != ip) {
-			VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
-			while (1) {
-			    lcfp = YARV_PREVIOUS_CONTROL_FRAME(lcfp);
-			    if (lcfp->dfp == tdfp) {
-				break;
-			    }
+	    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 */
+		yarv_control_frame_t *lcfp = GET_CFP();
+		int i;
+
+		while (lcfp->iseq != ip) {
+		    VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
+		    while (1) {
+			lcfp = YARV_PREVIOUS_CONTROL_FRAME(lcfp);
+			if (lcfp->dfp == tdfp) {
+			    break;
 			}
 		    }
-
-		    POPN(num);
-		    num = ip->argc;
-		    for (i = 0; i < ip->argc; i++) {
-			PUSH(lcfp->dfp[i - ip->local_size]);
-		    }
 		}
+		POPN(num);
+		num = ip->argc;
+		for (i = 0; i < ip->argc; i++) {
+		    PUSH(lcfp->dfp[i - ip->local_size]);
+		}
 	    }
-	    else {
-		id = rb_to_id(ip->name);
-		klass = eval_search_super_klass(ip->klass, recv);
-	    }
-
-	    blockptr = tmp_blockptr;
-	    mn = rb_method_node(klass, id);
 	}
+	blockptr = tmp_blockptr;
+	mn = rb_method_node(klass, id);
     }
 #endif
 #endif

Modified: trunk/signal.c
===================================================================
--- trunk/signal.c	2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/signal.c	2006-02-13 14:09:39 UTC (rev 396)
@@ -448,6 +448,7 @@
 #endif
 
 #ifdef SIGSEGV
+static int segv_received = 0;
 static RETSIGTYPE
 sigsegv(int sig)
 {
@@ -457,8 +458,13 @@
         return;
     }
 #endif
-
-    rb_bug("Segmentation fault");
+    if (segv_received) {
+	fprintf(stderr, "SEGV recieved in SEGV handler\n");
+    }
+    else {
+	segv_received = 1;
+	rb_bug("Segmentation fault");
+    }
 }
 #endif
 

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/test.rb	2006-02-13 14:09:39 UTC (rev 396)
@@ -1,9 +1,25 @@
+super
 __END__
+class C
+  def m a, b
+    p [a, b]
+  end
+end
 
+class D < C
+  def m a
+    super
+  end
+end
 
+D.new.m 1, 2
+
 __END__
 
 
+__END__
+
+
 def m
   proc{
     break :ok

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/yarvcore.c	2006-02-13 14:09:39 UTC (rev 396)
@@ -429,6 +429,7 @@
 		   VALUE parent, VALUE type, VALUE opt)
 {
     iseq->name = name;
+    iseq->defined_method_id = 0;
     iseq->file_name = file_name;
     iseq->iseq_mark_ary = rb_ary_new();
     iseq->catch_table_ary = rb_ary_new();

Modified: trunk/yarvtest/test_class.rb
===================================================================
--- trunk/yarvtest/test_class.rb	2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/yarvtest/test_class.rb	2006-02-13 14:09:39 UTC (rev 396)
@@ -294,6 +294,32 @@
       end
       C.new.b.m(:ok1, :ok2)
     } if false # ruby 1.9 dumped core
+    ae %q{ # [yarv-dev:859]
+      $ans = []
+      class A
+        def m_a
+          $ans << "m_a"
+        end
+        def def_m_a
+          $ans << "def_m_a"
+        end
+      end
+      class B < A
+        def def_m_a
+          B.class_eval{
+            super
+            define_method(:m_a) do
+              super
+            end
+          }
+          super
+        end
+      end
+      b = B.new
+      b.def_m_a
+      b.m_a
+      $ans
+    }
   end
   
   def test_zsuper


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

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