From: Yusuke ENDOH Date: 2007-11-25T00:41:31+09:00 Subject: [ruby-dev:32350] when *[],1 dumps core 遠藤と申します。 1.9 で when 節に *[], 1 などと書くと落ちます。 $ ./ruby -e 'case 1 when *[], 1; end' -- control frame ---------- c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------ --------------------------- -- backtrace of native function call (Use addr2line) -- 0x80e8065 0x8105bd3 0x8105c9b 0x81142d0 0x811725e 0x80dc4e2 0x80dc5b6 0x8059ec4 0x805de00 0x8057be0 0xb7df5ea8 0x8057b01 ------------------------------------------------------- [BUG] NODE_CASAE: unknown node (NODE_ARGSPUSH) ruby 1.9.0 (2007-11-23) [i686-linux] アボートしました 多分こうでしょうか。ついでに typo も直してます。 Index: compile.c =================================================================== --- compile.c (revision 14007) +++ compile.c (working copy) @@ -2671,11 +2671,11 @@ if (nd_type(vals) == NODE_ARRAY) { special_literals = when_vals(iseq, cond_seq, vals, l1, special_literals); } - else if (nd_type(vals) == NODE_SPLAT || nd_type(vals) == NODE_ARGSCAT) { + else if (nd_type(vals) == NODE_SPLAT || nd_type(vals) == NODE_ARGSCAT || nd_type(vals) == NODE_ARGSPUSH) { NODE *val = vals->nd_head; special_literals = 0; - if (nd_type(vals) == NODE_ARGSCAT) { + if (nd_type(vals) == NODE_ARGSCAT || nd_type(vals) == NODE_ARGSPUSH) { when_vals(iseq, cond_seq, vals->nd_head, l1, 0); val = vals->nd_body; } @@ -2685,12 +2685,12 @@ ADD_INSNL(cond_seq, nd_line(val), branchif, l1); } else { - rb_bug("NODE_CASAE: unknown node (%s)", + rb_bug("NODE_CASE: unknown node (%s)", ruby_node_name(nd_type(vals))); } } else { - rb_bug("NODE_CASAE: must be NODE_ARRAY, but 0"); + rb_bug("NODE_CASE: must be NODE_ARRAY, but 0"); } node = node->nd_next; @@ -2753,10 +2753,10 @@ vals = vals->nd_next; } } - else if (nd_type(vals) == NODE_SPLAT || nd_type(vals) == NODE_ARGSCAT) { + 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) { + if (nd_type(vals) == NODE_ARGSCAT || nd_type(vals) == NODE_ARGSPUSH) { NODE *vs = vals->nd_head; val = vals->nd_body; -- Yusuke ENDOH