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/