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

yarv-diff:169

From: ko1 atdot.net
Date: 25 Dec 2005 22:53:21 -0000
Subject: [yarv-diff:169] r328 - in trunk: . yarvtest

Author: ko1
Date: 2005-12-26 07:53:21 +0900 (Mon, 26 Dec 2005)
New Revision: 328

Modified:
   trunk/ChangeLog
   trunk/compile.c
   trunk/test.rb
   trunk/yarvtest/test_flow.rb
Log:
	* compile.c : add emptstack insn for all NODE_RETURN
	and optimize it if it's not needed

	* yarvtest/test_flow.rb : add a test for above



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-12-25 22:12:22 UTC (rev 327)
+++ trunk/ChangeLog	2005-12-25 22:53:21 UTC (rev 328)
@@ -4,6 +4,14 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-12-26(Mon) 07:51:01 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* compile.c : add emptstack insn for all NODE_RETURN
+	and optimize it if it's not needed
+
+	* yarvtest/test_flow.rb : add a test for above
+
+
 2005-12-26(Mon) 07:08:22 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* eval.c, gc.c : add "gc_debug_flag" to debug gc

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-12-25 22:12:22 UTC (rev 327)
+++ trunk/compile.c	2005-12-25 22:53:21 UTC (rev 328)
@@ -1271,7 +1271,15 @@
       VALUE *operands;
       
       iobj = (INSN*)list;
-      sp = calc_sp_depth(sp, iobj);
+
+      if(iobj->insn_id == BIN(emptstack) &&
+         sp == 0){
+        iobj->insn_id = BIN(nop);
+      }
+      else{
+        sp = calc_sp_depth(sp, iobj);
+      }
+      
       // fprintf(stderr, "insn: %-16s, sp: %d\n", insn_name(iobj->insn_id), sp);
 
       operands = iobj->operands;
@@ -3580,14 +3588,12 @@
       }
       else{
         if(is->type == ISEQ_TYPE_METHOD){
-          if(iseq->compile_data->in_ensure){
-            ADD_INSN(ret, nd_line(node), emptstack);
-          }
+          ADD_INSN(ret, nd_line(node), emptstack);
         }
         
         COMPILE(ret, "return nd_stts (return val)", node->nd_stts);
         add_ensure_iseq(ret, iseq, self);
-        
+
         if(is->type == ISEQ_TYPE_METHOD){
           ADD_INSN(ret, nd_line(node), end);
         }

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-12-25 22:12:22 UTC (rev 327)
+++ trunk/test.rb	2005-12-25 22:53:21 UTC (rev 328)
@@ -1,3 +1,22 @@
+
+def m
+  return 1
+  p 2
+end
+
+__END__
+class C
+  define_method(:m){
+    return 1
+  }
+end
+
+C.new.m
+
+__END__
+
+def m() 2 ensure return 3; end;  p m()
+__END__
 def m()
   p(begin
       2

Modified: trunk/yarvtest/test_flow.rb
===================================================================
--- trunk/yarvtest/test_flow.rb	2005-12-25 22:12:22 UTC (rev 327)
+++ trunk/yarvtest/test_flow.rb	2005-12-25 22:53:21 UTC (rev 328)
@@ -501,6 +501,18 @@
     }
   end
 
+  def test_return_in_deep_stack
+    ae_flow %q{
+      def m1 *args
+        
+      end
+      def m2
+        m1(:a, :b, (return 1; :c))
+      end
+      m2
+    }
+  end
+  
   def test_return_in_ensure
     ae_flow %q{
       def m()


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

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