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

ruby-changes:13016

From: nobu <ko1@a...>
Date: Sat, 5 Sep 2009 15:21:36 +0900 (JST)
Subject: [ruby-changes:13016] Ruby:r24761 (trunk): * compile.c (iseq_compile_each): op_asgn to aref should return rhs.

nobu	2009-09-05 15:21:15 +0900 (Sat, 05 Sep 2009)

  New Revision: 24761

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

  Log:
    * compile.c (iseq_compile_each): op_asgn to aref should return rhs.
      [ruby-core:25387]

  Modified files:
    trunk/ChangeLog
    trunk/compile.c
    trunk/test/ruby/test_basicinstructions.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24760)
+++ ChangeLog	(revision 24761)
@@ -1,3 +1,8 @@
+Sat Sep  5 15:21:13 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* compile.c (iseq_compile_each): op_asgn to aref should return rhs.
+	  [ruby-core:25387]
+
 Sat Sep  5 10:38:46 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* compile.c (iseq_compile_each): &&= and ||= should return rhs.
Index: compile.c
===================================================================
--- compile.c	(revision 24760)
+++ compile.c	(revision 24761)
@@ -3733,13 +3733,16 @@
 	/*
 	 * a[x] (op)= y
 	 *
-	 * eval a    # a
-	 * eval x    # a x
-	 * dupn 2    # a x a x
-	 * send :[]  # a x a[x]
-	 * eval y    # a x a[x] y
-	 * send op   # a x a[x]+y
-	 * send []=  # ret
+	 * nil       # nil
+	 * eval a    # nil a
+	 * eval x    # nil a x
+	 * dupn 2    # nil a x a x
+	 * send :[]  # nil a x a[x]
+	 * eval y    # nil a x a[x] y
+	 * send op   # nil a x ret
+	 * setn 3    # ret a x ret
+	 * send []=  # ret ?
+	 * pop       # ret
 	 */
 
 	/*
@@ -3750,6 +3753,9 @@
 	 *              nd_mid
 	 */
 
+	if (!poped) {
+	    ADD_INSN(ret, nd_line(node), putnil);
+	}
 	COMPILE(ret, "NODE_OP_ASGN1 recv", node->nd_recv);
 	if (nd_type(node->nd_args->nd_body) != NODE_ZARRAY) {
 	    INIT_ANCHOR(args);
@@ -3775,20 +3781,21 @@
 	    LABEL *label = NEW_LABEL(nd_line(node));
 	    LABEL *lfin = NEW_LABEL(nd_line(node));
 
+	    ADD_INSN(ret, nd_line(node), dup);
 	    if (id == 0) {
 		/* or */
-		ADD_INSN(ret, nd_line(node), dup);
 		ADD_INSNL(ret, nd_line(node), branchif, label);
-		ADD_INSN(ret, nd_line(node), pop);
 	    }
 	    else {
 		/* and */
-		ADD_INSN(ret, nd_line(node), dup);
 		ADD_INSNL(ret, nd_line(node), branchunless, label);
-		ADD_INSN(ret, nd_line(node), pop);
 	    }
+	    ADD_INSN(ret, nd_line(node), pop);
 
 	    COMPILE(ret, "NODE_OP_ASGN1 args->head: ", node->nd_args->nd_head);
+	    if (!poped) {
+		ADD_INSN1(ret, nd_line(node), setn, FIXNUM_INC(argc, 2));
+	    }
 	    if (flag & VM_CALL_ARGS_SPLAT_BIT) {
 		ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(1));
 		ADD_INSN(ret, nd_line(node), concatarray);
@@ -3799,15 +3806,21 @@
 		ADD_SEND_R(ret, nd_line(node), ID2SYM(idASET),
 			   FIXNUM_INC(argc, 1), Qfalse, LONG2FIX(flag));
 	    }
+	    ADD_INSN(ret, nd_line(node), pop);
 	    ADD_INSNL(ret, nd_line(node), jump, lfin);
 	    ADD_LABEL(ret, label);
-	    ADD_INSN1(ret, nd_line(node), setn, FIXNUM_INC(argc, 1));
-	    ADD_INSN1(ret, nd_line(node), adjuststack, FIXNUM_INC(argc, 1));
+	    if (!poped) {
+		ADD_INSN1(ret, nd_line(node), setn, FIXNUM_INC(argc, 2));
+	    }
+	    ADD_INSN1(ret, nd_line(node), adjuststack, FIXNUM_INC(argc, 2));
 	    ADD_LABEL(ret, lfin);
 	}
 	else {
 	    COMPILE(ret, "NODE_OP_ASGN1 args->head: ", node->nd_args->nd_head);
 	    ADD_SEND(ret, nd_line(node), ID2SYM(id), INT2FIX(1));
+	    if (!poped) {
+		ADD_INSN1(ret, nd_line(node), setn, FIXNUM_INC(argc, 2));
+	    }
 	    if (flag & VM_CALL_ARGS_SPLAT_BIT) {
 		ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(1));
 		ADD_INSN(ret, nd_line(node), concatarray);
@@ -3818,9 +3831,6 @@
 		ADD_SEND_R(ret, nd_line(node), ID2SYM(idASET),
 			   FIXNUM_INC(argc, 1), Qfalse, LONG2FIX(flag));
 	    }
-	}
-
-	if (poped) {
 	    ADD_INSN(ret, nd_line(node), pop);
 	}
 
Index: test/ruby/test_basicinstructions.rb
===================================================================
--- test/ruby/test_basicinstructions.rb	(revision 24760)
+++ test/ruby/test_basicinstructions.rb	(revision 24761)
@@ -505,6 +505,14 @@
       :Bug1996
     end
     Bug1996 = '[ruby-dev:39163], [ruby-core:25143]'
+    def [](i)
+      @x
+    end
+    def []=(i, x)
+      @x = x
+      :Bug2050
+    end
+    Bug2050 = '[ruby-core:25387]'
   end
 
   def test_opassign2_1
@@ -575,6 +583,23 @@
     assert_equal 4, a[0]
   end
 
+  def test_opassign1_2
+    x = OP.new
+    x[0] = nil
+    assert_equal 1, x[0] ||= 1, OP::Bug2050
+    assert_equal 1, x[0]
+    assert_equal 2, x[0] &&= 2, OP::Bug2050
+    assert_equal 2, x[0]
+    assert_equal 2, x[0] ||= 3, OP::Bug2050
+    assert_equal 2, x[0]
+    assert_equal 4, x[0] &&= 4, OP::Bug2050
+    assert_equal 4, x[0]
+    assert_equal 5, x[0] += 1, OP::Bug2050
+    assert_equal 5, x[0]
+    assert_equal 4, x[0] -= 1, OP::Bug2050
+    assert_equal 4, x[0]
+  end
+
   def test_backref
     /re/ =~ 'not match'
     assert_nil $~

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

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