diff --git a/ChangeLog b/ChangeLog index 2bc32fda98..f5b6a0941b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Aug 5 20:30:39 2010 Nobuyoshi Nakada + + * compile.c (iseq_compile_each): to_a method should be called. + [Bug #3658] + + * compile.c (iseq_compile_each): ditto for ARGSPUSH. + Thu Aug 5 20:13:49 2010 Nobuyoshi Nakada * README.EXT, README.EXT.ja (String functions): mention diff --git a/compile.c b/compile.c index f838654cf4..3ff91f5b51 100644 --- a/compile.c +++ b/compile.c @@ -4522,14 +4522,23 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) } case NODE_ARGSCAT:{ COMPILE_(ret, "argscat head", node->nd_head, poped); - COMPILE_(ret, "argscat body", node->nd_body, poped); - if (poped) break; + COMPILE(ret, "argscat body", node->nd_body); + if (poped) { + ADD_INSN1(ret, nd_line(node), splatarray, Qfalse); + ADD_INSN(ret, nd_line(node), pop); + break; + } ADD_INSN(ret, nd_line(node), concatarray); break; } case NODE_ARGSPUSH:{ - COMPILE(ret, "arsgpush head", node->nd_head); + COMPILE_(ret, "arsgpush head", node->nd_head, poped); COMPILE(ret, "argspush body", node->nd_body); + if (poped) { + ADD_INSN1(ret, nd_line(node), splatarray, Qfalse); + ADD_INSN(ret, nd_line(node), pop); + break; + } ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(1)); ADD_INSN(ret, nd_line(node), concatarray); break; diff --git a/test/ruby/test_primitive.rb b/test/ruby/test_primitive.rb index e87028c860..448349fcbb 100644 --- a/test/ruby/test_primitive.rb +++ b/test/ruby/test_primitive.rb @@ -405,5 +405,20 @@ class TestRubyPrimitive < Test::Unit::TestCase bug3658 = '[ruby-dev:41933]' [0, *x=1] assert_equal(1, x, bug3658) + [0, *x=1, 2] + assert_equal(1, x, bug3658) + class << (x = Object.new) + attr_accessor :to_a_called + def to_a + @to_a_called = true + [self] + end + end + x.to_a_called = false + [0, *x] + assert(x.to_a_called, bug3658) + x.to_a_called = false + [0, *x, 2] + assert(x.to_a_called, bug3658) end end