зеркало из https://github.com/github/ruby.git
* compile.c (iseq_compile_each): fix splat condition in NODE_WHEN.
[Bug #2226] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27376 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
2939d61f28
Коммит
8b261b413c
|
@ -1,3 +1,8 @@
|
|||
Sat Apr 17 09:19:27 2010 wanabe <s.wanabe@gmail.com>
|
||||
|
||||
* compile.c (iseq_compile_each): fix splat condition in NODE_WHEN.
|
||||
[Bug #2226]
|
||||
|
||||
Sat Apr 17 08:57:41 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* lib/net/smtp.rb (Net::SMTP#rcptto_list): continue when at least
|
||||
|
|
46
compile.c
46
compile.c
|
@ -3129,40 +3129,30 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
|
|||
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;
|
||||
}
|
||||
}
|
||||
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");
|
||||
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)));
|
||||
}
|
||||
node = node->nd_next;
|
||||
}
|
||||
|
|
|
@ -53,6 +53,26 @@ class TestCase < Test::Unit::TestCase
|
|||
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
|
||||
|
|
Загрузка…
Ссылка в новой задаче