[前][次][番号順一覧][スレッド一覧]

ruby-changes:15951

From: mame <ko1@a...>
Date: Wed, 19 May 2010 19:48:59 +0900 (JST)
Subject: [ruby-changes:15951] Ruby:r27892 (trunk): * iseq_compile_each (NODE_DEFINED): put nil first to fix stack

mame	2010-05-19 19:48:17 +0900 (Wed, 19 May 2010)

  New Revision: 27892

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27892

  Log:
    * iseq_compile_each (NODE_DEFINED): put nil first to fix stack
      consistency.  [ruby-core:30293]
      Now, lfinish[0] of defined_expr seems not to be used.  Refactoring
      may be needed.

  Modified files:
    trunk/ChangeLog
    trunk/bootstraptest/test_syntax.rb
    trunk/compile.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 27891)
+++ ChangeLog	(revision 27892)
@@ -1,3 +1,10 @@
+Wed May 19 19:45:10 2010  Yusuke Endoh  <mame@t...>
+
+	* iseq_compile_each (NODE_DEFINED): put nil first to fix stack
+	  consistency.  [ruby-core:30293]
+	  Now, lfinish[0] of defined_expr seems not to be used.  Refactoring
+	  may be needed.
+
 Wed May 19 16:55:09 2010  NARUSE, Yui  <naruse@r...>
 
 	* numeric.c (rb_num2ulong): use rb_big2ulong for data from
Index: bootstraptest/test_syntax.rb
===================================================================
--- bootstraptest/test_syntax.rb	(revision 27891)
+++ bootstraptest/test_syntax.rb	(revision 27892)
@@ -890,3 +890,13 @@
 assert_valid_syntax('x y { "#{}".z do end }', bug1240)
 
 assert_valid_syntax('y "#{a 1}" do end', '[ruby-core:29579]')
+assert_normal_exit %q{
+  def foo(&block)
+    yield
+  end
+
+  foo do
+    s = defined?(raise + 1)
+    Class
+  end
+}, '[ruby-core:30293]'
Index: compile.c
===================================================================
--- compile.c	(revision 27891)
+++ compile.c	(revision 27892)
@@ -4815,11 +4815,12 @@
 	    LABEL *lfinish[2];
 	    lfinish[0] = NEW_LABEL(nd_line(node));
 	    lfinish[1] = 0;
+	    ADD_INSN(ret, nd_line(node), putnil);
 	    defined_expr(iseq, ret, node->nd_head, lfinish, Qtrue);
+	    ADD_INSN(ret, nd_line(node), swap);
+	    ADD_INSN(ret, nd_line(node), pop);
 	    if (lfinish[1]) {
-		ADD_INSNL(ret, nd_line(node), jump, lfinish[0]);
 		ADD_LABEL(ret, lfinish[1]);
-		ADD_INSN(ret, nd_line(node), putnil);
 	    }
 	    ADD_LABEL(ret, lfinish[0]);
 	}

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]