[Bug:1.9] case $BJ8$N<0$,>JN,$5$l(B when $B@a$KG[NsE83+$,$"$k$H$-$N5sF0(B

e$B%o%J%Y$H?=$7$^$9!#e(B

case e$BJ8$N<0$,>JN,$5$l!"$+$De(B when
e$B@a$KG[NsE83+$,$"$k$H$-$N5sF0!"e(B
e$B$h$j6qBNE*$K$Oe(B NODE_ARGSCAT, NODE_ARGSPUSH e$B$Ne(B
e$B%3%s%Q%$%k7k2L$,@5$7$/$J$$$h$&$K;W$$$^$9!#e(B
e$BDL>o$Ne(B NODE_CASE e$B$HF1$8$h$&$K=hM}$9$k$N$O$I$&$G$7$g$&$+!#e(B

$ cat test.rb
case
when *[], false
p :ng1
else
p :ok
end

case
when *false, []
p :ok
else
p :ng2
end

begin
case
when false, *nonexistent_var, false
p :ng3
else
p :ng4
end
rescue NameError
p :ok
end

$ ruby -v test.rb
ruby 1.9.2dev (2009-10-17 trunk 25387) [i386-mingw32]
:ng1
:ng2
:ng3

Index: compile.c

— compile.c (revision 25387)
+++ compile.c (working copy)
@@ -3116,41 +3116,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 */

e$B%A%1%C%He(B #2226 e$B$,99?7$5$l$^$7$?!#e(B (by _ wanabe)

e$B$^$D$b$H$5$s!J$“$k$$$O$5$5$@$5$s!)!Ke(B
e$B$3$N%A%1%C%H$K$D$$$F!”$h$m$7$1$l$P0U8+$r$*J9$-$7$?$$$N$G$9$,$I$&$G$7$g$&$+!#e(B
e$B!J%P%0$G$O$J$$!“%P%0$@$,%Q%C%A$,@5$7$/$J$$!”%3%_%C%H$7$F$h$$!“$J$I!Ke(B
e$B:EB%$9$k$h$&$G?=$7Lu$”$j$^$;$s!#e(B

http://redmine.ruby-lang.org/issues/show/2226

wanabe e$B$5$se(B
e$B1sF#$G$9!#e(B

2009e$BG/e(B10e$B7ne(B18e$BF|e(B6:16 wanabe [email protected]:

case e$BJ8$N<0$,>JN,$5$l!“$+$De(B when e$B@a$KG[NsE83+$,$”$k$H$-$N5sF0!"e(B
e$B$h$j6qBNE*$K$Oe(B NODE_ARGSCAT, NODE_ARGSPUSH e$B$Ne(B
e$B%3%s%Q%$%k7k2L$,@5$7$/$J$$$h$&$K;W$$$^$9!#e(B
e$BDL>o$Ne(B NODE_CASE e$B$HF1$8$h$&$K=hM}$9$k$N$O$I$&$G$7$g$&$+!#e(B

2010e$BG/e(B1e$B7ne(B29e$BF|e(B2:37 _ wanabe [email protected]:

e$B$^$D$b$H$5$s!J$“$k$$$O$5$5$@$5$s!)!Ke(B
e$B$3$N%A%1%C%H$K$D$$$F!”$h$m$7$1$l$P0U8+$r$*J9$-$7$?$$$N$G$9$,$I$&$G$7$g$&$+!#e(B
e$B!J%P%0$G$O$J$$!“%P%0$@$,%Q%C%A$,@5$7$/$J$$!”%3%_%C%H$7$F$h$$!"$J$I!Ke(B

e$B3N$+$K%P%0$@$H;W$$$^$9$7!“%o%J%Y$5$s$N%Q%C%A$G@5$7$$$H;W$$$^$9!#e(B
e$BH?BP$b$J$$$h$&$J$N$G!”%3%_%C%H$7$A$c$C$F$/$@$5$$!#e(B

e$B$?$@!"0l1~!"0J2<$NE@$,Hs8_49$K$J$k$h$&$G$9!#e(B

$ ruby -ve ‘case; when true, *x; p :ok; end’
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
:ok

$ ./ruby -ve ‘case; when true, *x; p :ok; end’
ruby 1.9.2dev (2010-04-16 trunk 27359) [i686-linux]
-e:1:in <main>': undefined local variable or method x’ for
main:Object (NameError)

e$B$H$$$C$F$b!"e(BNODE_CASE
e$B$NJ}$G$O%o%J%Y$5$s$N%Q%C%A$NA0$+$iHs8_49$Je(B
e$B$h$&$G$9!#e(B

$ ruby -ve ‘case “foo”; when “foo”, *x; p :ok; end’
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
:ok

$ ./ruby -ve ‘case “foo”; when “foo”, *x; p :ok; end’
ruby 1.9.2dev (2010-04-16 trunk 27359) [i686-linux]
-e:1:in <main>': undefined local variable or method x’ for
main:Object (NameError)

e$B<B32$O$[$$J$$$H;W$&$N$G$9$,!"$b$72K$@$C$?$i8+$F$d$C$F$/$@$5$$!#e(B

e$B%A%1%C%He(B #2226 e$B$,99?7$5$l$^$7$?!#e(B (by _ wanabe)

e$B%9%F!<%?%9e(B Assignede$B$+$ie(BClosede$B$KJQ99e(B
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r27376.
_, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


http://redmine.ruby-lang.org/issues/show/2226