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

ruby-changes:15476

From: wanabe <ko1@a...>
Date: Sat, 17 Apr 2010 09:25:24 +0900 (JST)
Subject: [ruby-changes:15476] Ruby:r27376 (trunk): * compile.c (iseq_compile_each): fix splat condition in NODE_WHEN.

wanabe	2010-04-17 09:23:28 +0900 (Sat, 17 Apr 2010)

  New Revision: 27376

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

  Log:
    * compile.c (iseq_compile_each): fix splat condition in NODE_WHEN.
      [Bug #2226]

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 27375)
+++ ChangeLog	(revision 27376)
@@ -1,3 +1,8 @@
+Sat Apr 17 09:19:27 2010  wanabe  <s.wanabe@g...>
+
+	* compile.c (iseq_compile_each): fix splat condition in NODE_WHEN.
+	  [Bug #2226]
+
 Sat Apr 17 08:57:41 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/net/smtp.rb (Net::SMTP#rcptto_list): continue when at least
Index: compile.c
===================================================================
--- compile.c	(revision 27375)
+++ compile.c	(revision 27376)
@@ -3129,41 +3129,31 @@
 	    ADD_INSNL(body_seq, nd_line(node), jump, endlabel);
 
 	    vals = node->nd_head;
-	    if (vals && nd_type(vals) == NODE_ARRAY) {
+	    if (!vals) {
+		rb_bug("NODE_WHEN: must be NODE_ARRAY, but 0");
+	    }
+	    switch (nd_type(vals)) {
+	      case NODE_ARRAY:
 		while (vals) {
 		    val = vals->nd_head;
 		    COMPILE(ret, "when2", val);
 		    ADD_INSNL(ret, nd_line(val), branchif, l1);
 		    vals = vals->nd_next;
 		}
+		break;
+	      case NODE_SPLAT:
+	      case NODE_ARGSCAT:
+	      case NODE_ARGSPUSH:
+		ADD_INSN(ret, nd_line(vals), putnil);
+		COMPILE(ret, "when2/cond splat", vals);
+		ADD_INSN1(ret, nd_line(vals), checkincludearray, Qfalse);
+		ADD_INSN(ret, nd_line(vals), pop);
+		ADD_INSNL(ret, nd_line(vals), branchif, l1);
+		break;
+	      default:
+		rb_bug("NODE_WHEN: unknown node (%s)",
+		       ruby_node_name(nd_type(vals)));
 	    }
-	    else if (nd_type(vals) == NODE_SPLAT ||
-		     nd_type(vals) == NODE_ARGSCAT ||
-		     nd_type(vals) == NODE_ARGSPUSH) {
-
-		NODE *val = vals->nd_head;
-
-		if (nd_type(vals) == NODE_ARGSCAT || nd_type(vals) == NODE_ARGSPUSH) {
-		    NODE *vs = vals->nd_head;
-		    val = vals->nd_body;
-
-		    while (vs) {
-			NODE* val = vs->nd_head;
-			COMPILE(ret, "when/argscat", val);
-			ADD_INSNL(ret, nd_line(val), branchif, l1);
-			vs = vs->nd_next;
-		    }
-		}
-
-		ADD_INSN(ret, nd_line(val), putnil);
-		COMPILE(ret, "when2/splat", val);
-		ADD_INSN1(ret, nd_line(val), checkincludearray, Qfalse);
-		ADD_INSN(ret, nd_line(val), pop);
-		ADD_INSNL(ret, nd_line(val), branchif, l1);
-	    }
-	    else {
-		rb_bug("err");
-	    }
 	    node = node->nd_next;
 	}
 	/* else */
Index: test/ruby/test_case.rb
===================================================================
--- test/ruby/test_case.rb	(revision 27375)
+++ test/ruby/test_case.rb	(revision 27376)
@@ -53,6 +53,26 @@
     else
       assert(false)
     end
+
+    case
+    when *[], false
+      assert(false)
+    else
+      assert(true)
+    end
+
+    case
+    when *false, []
+      assert(true)
+    else
+      assert(false)
+    end
+
+    assert_raise(NameError) do
+      case
+      when false, *x, false
+      end
+    end
   end
 
   def test_deoptimization

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

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