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

@ -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));
}
}
}