merge revision(s) 39627: [Backport #8008]

* compile.c (iseq_compile_each): pass keyword arguments to zsuper,
	  with current values.  [ruby-core:53114] [Bug #8008]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@39914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2013-03-24 16:10:40 +00:00
parent 8b5f0528a7
commit 03ec1e8eb8
4 changed files with 43 additions and 1 deletions

View file

@ -1,3 +1,8 @@
Mon Mar 25 01:09:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* compile.c (iseq_compile_each): pass keyword arguments to zsuper,
with current values. [ruby-core:53114] [Bug #8008]
Mon Mar 25 01:05:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/objspace/objspace.c (count_nodes): count also newly added nodes,

View file

@ -4466,6 +4466,22 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
argc = INT2FIX(post_len + post_start);
}
}
if (liseq->arg_keyword > 0) {
int local_size = liseq->local_size;
int idx = local_size - liseq->arg_keyword;
argc++;
ADD_INSN1(args, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
ADD_SEND (args, line, ID2SYM(rb_intern("dup")), INT2FIX(0));
for (i = 0; i < liseq->arg_keywords; ++i) {
ID id = liseq->arg_keyword_table[i];
idx = local_size - get_local_var_idx(liseq, id);
ADD_INSN1(args, line, putobject, ID2SYM(id));
ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
}
ADD_SEND(args, line, ID2SYM(id_core_hash_merge_ptr), INT2FIX(i * 2 + 1));
}
}
}

View file

@ -7,6 +7,7 @@ class TestSuper < Test::Unit::TestCase
def double(a, b) [a,b] end
def array(*a) a end
def optional(a = 0) a end
def keyword(**a) a end
end
class Single1 < Base
def single(*) super end
@ -50,6 +51,18 @@ class TestSuper < Test::Unit::TestCase
class Optional5 < Base
def array(a = 1, b = 2, *) super end
end
class Keyword1 < Base
def keyword(foo: "keyword1") super end
end
class Keyword2 < Base
def keyword(foo: "keyword2")
foo = "changed1"
x = super
foo = "changed2"
y = super
[x, y]
end
end
def test_single1
assert_equal(1, Single1.new.single(1))
@ -112,6 +125,14 @@ class TestSuper < Test::Unit::TestCase
assert_equal([9, 8], Optional5.new.array(9, 8))
assert_equal([9, 8, 7], Optional5.new.array(9, 8, 7))
end
def test_keyword1
assert_equal({foo: "keyword1"}, Keyword1.new.keyword)
bug8008 = '[ruby-core:53114] [Bug #8008]'
assert_equal({foo: bug8008}, Keyword1.new.keyword(foo: bug8008))
end
def test_keyword2
assert_equal([{foo: "changed1"}, {foo: "changed2"}], Keyword2.new.keyword)
end
class A
def tt(aa)

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.0.0"
#define RUBY_RELEASE_DATE "2013-03-25"
#define RUBY_PATCHLEVEL 91
#define RUBY_PATCHLEVEL 92
#define RUBY_RELEASE_YEAR 2013
#define RUBY_RELEASE_MONTH 3