Skip to content

Commit

Permalink
merges r28877 from trunk into ruby_1_9_2.
Browse files Browse the repository at this point in the history
--
* compile.c (NODE_ARGSCAT, NODE_ARGSPUSH): drop unused ARGSCAT
  results when poped is true.  [ruby-dev:41933], [Bug #3658]
  This is retry of r28870 and r28873 which were reverted.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@28934 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
yugui committed Aug 9, 2010
1 parent 299d236 commit 2ed7d6d
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 7 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
@@ -1,3 +1,9 @@
Thu Aug 5 21:20:31 2010 Yusuke Endoh <mame@tsg.ne.jp>

* compile.c (NODE_ARGSCAT, NODE_ARGSPUSH): drop unused ARGSCAT
results when poped is true. [ruby-dev:41933], [Bug #3658]
This is retry of r28870 and r28873 which were reverted.

Thu Aug 5 16:57:20 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>

* dir.c (glob_make_pattern): fold continuous PLAINs to get rid of
Expand Down
32 changes: 25 additions & 7 deletions compile.c
Expand Up @@ -4525,16 +4525,34 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
break;
}
case NODE_ARGSCAT:{
COMPILE(ret, "argscat head", node->nd_head);
COMPILE(ret, "argscat body", node->nd_body);
ADD_INSN(ret, nd_line(node), concatarray);
if (poped) {
COMPILE(ret, "argscat head", node->nd_head);
ADD_INSN1(ret, nd_line(node), splatarray, Qfalse);
ADD_INSN(ret, nd_line(node), pop);
COMPILE(ret, "argscat body", node->nd_body);
ADD_INSN1(ret, nd_line(node), splatarray, Qfalse);
ADD_INSN(ret, nd_line(node), pop);
}
else {
COMPILE(ret, "argscat head", node->nd_head);
COMPILE(ret, "argscat body", node->nd_body);
ADD_INSN(ret, nd_line(node), concatarray);
}
break;
}
case NODE_ARGSPUSH:{
COMPILE(ret, "arsgpush head", node->nd_head);
COMPILE(ret, "argspush body", node->nd_body);
ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(1));
ADD_INSN(ret, nd_line(node), concatarray);
if (poped) {
COMPILE(ret, "arsgpush head", node->nd_head);
ADD_INSN1(ret, nd_line(node), splatarray, Qfalse);
ADD_INSN(ret, nd_line(node), pop);
COMPILE_(ret, "argspush body", node->nd_body, poped);
}
else {
COMPILE(ret, "arsgpush head", node->nd_head);
COMPILE_(ret, "argspush body", node->nd_body, poped);
ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(1));
ADD_INSN(ret, nd_line(node), concatarray);
}
break;
}
case NODE_SPLAT:{
Expand Down
20 changes: 20 additions & 0 deletions test/ruby/test_primitive.rb
Expand Up @@ -400,4 +400,24 @@ def test_list_expand
#assert_equal [0,1,2,3,4], [0, *a, 4]
end

def test_concatarray_ruby_dev_41933
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

0 comments on commit 2ed7d6d

Please sign in to comment.