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