merge revision(s) 40260,40377: [Backport #8260]

* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not
	  a keyword argument, keep it as an positional argument.
	  a keyword argument, keep it as a positional argument.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@40381 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2013-04-19 16:28:55 +00:00
parent 26de612013
commit 80002f8e46
4 changed files with 42 additions and 5 deletions

View file

@ -1,3 +1,8 @@
Sat Apr 20 01:18:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not
a keyword argument, keep it as a positional argument.
Sat Apr 20 01:14:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* thread.c (rb_mutex_synchronize_m): yield no block params. patch by

View file

@ -23,6 +23,7 @@ class TestKeywordArguments < Test::Unit::TestCase
def test_f2
assert_equal([:xyz, "foo", 424242], f2(:xyz))
assert_raise(ArgumentError) { f2({}) } # [ruby-dev:46712] [Bug #7529]
assert_equal([{"bar"=>42}, "foo", 424242], f2("bar"=>42))
end

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.0.0"
#define RUBY_RELEASE_DATE "2013-04-20"
#define RUBY_PATCHLEVEL 148
#define RUBY_PATCHLEVEL 149
#define RUBY_RELEASE_YEAR 2013
#define RUBY_RELEASE_MONTH 4

View file

@ -1064,16 +1064,47 @@ vm_caller_setup_args(const rb_thread_t *th, rb_control_frame_t *cfp, rb_call_inf
}
}
static int
separate_symbol(st_data_t key, st_data_t value, st_data_t arg)
{
VALUE *kwdhash = (VALUE *)arg;
if (!SYMBOL_P(key)) kwdhash++;
if (!*kwdhash) *kwdhash = rb_hash_new();
rb_hash_aset(*kwdhash, (VALUE)key, (VALUE)value);
return ST_CONTINUE;
}
static VALUE
extract_keywords(VALUE *orighash)
{
VALUE parthash[2] = {0, 0};
VALUE hash = *orighash;
if (RHASH_EMPTY_P(hash)) {
*orighash = 0;
return hash;
}
st_foreach(RHASH_TBL(hash), separate_symbol, (st_data_t)&parthash);
*orighash = parthash[1];
return parthash[0];
}
static inline int
vm_callee_setup_keyword_arg(const rb_iseq_t *iseq, int argc, VALUE *orig_argv, VALUE *kwd)
{
VALUE keyword_hash;
VALUE keyword_hash, orig_hash;
int i, j;
if (argc > 0 &&
!NIL_P(keyword_hash = rb_check_hash_type(orig_argv[argc-1]))) {
!NIL_P(orig_hash = rb_check_hash_type(orig_argv[argc-1])) &&
(keyword_hash = extract_keywords(&orig_hash)) != 0) {
if (!orig_hash) {
argc--;
keyword_hash = rb_hash_dup(keyword_hash);
}
else {
orig_argv[argc-1] = orig_hash;
}
if (iseq->arg_keyword_check) {
for (i = j = 0; i < iseq->arg_keywords; i++) {
if (st_lookup(RHASH_TBL(keyword_hash), ID2SYM(iseq->arg_keyword_table[i]), 0)) j++;