mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
vm_insnhelper.c: non-symbol key
* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not a keyword argument, keep it as an positional argument. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40260 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
9ef4e13459
commit
2674f9a815
3 changed files with 44 additions and 6 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Fri Apr 12 15:21:24 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 an positional argument.
|
||||||
|
|
||||||
Fri Apr 12 11:58:00 2013 Zachary Scott <zachary@zacharyscott.net>
|
Fri Apr 12 11:58:00 2013 Zachary Scott <zachary@zacharyscott.net>
|
||||||
|
|
||||||
* array.c: Document synonymous methods, by windwiny [GH-277]
|
* array.c: Document synonymous methods, by windwiny [GH-277]
|
||||||
|
|
|
@ -23,6 +23,7 @@ class TestKeywordArguments < Test::Unit::TestCase
|
||||||
def test_f2
|
def test_f2
|
||||||
assert_equal([:xyz, "foo", 424242], f2(:xyz))
|
assert_equal([:xyz, "foo", 424242], f2(:xyz))
|
||||||
assert_raise(ArgumentError) { f2({}) } # [ruby-dev:46712] [Bug #7529]
|
assert_raise(ArgumentError) { f2({}) } # [ruby-dev:46712] [Bug #7529]
|
||||||
|
assert_equal([{"bar"=>42}, "foo", 424242], f2("bar"=>42))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1070,24 +1070,56 @@ 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
|
static inline int
|
||||||
vm_callee_setup_keyword_arg(const rb_iseq_t *iseq, int argc, VALUE *orig_argv, VALUE *kwd)
|
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;
|
int i, j;
|
||||||
|
|
||||||
if (argc > 0 &&
|
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--;
|
argc--;
|
||||||
keyword_hash = rb_hash_dup(keyword_hash);
|
}
|
||||||
|
else {
|
||||||
|
orig_argv[argc-1] = orig_hash;
|
||||||
|
}
|
||||||
i = 0;
|
i = 0;
|
||||||
if (iseq->arg_keyword_required) {
|
if (iseq->arg_keyword_required) {
|
||||||
VALUE missing = Qnil;
|
VALUE missing = Qnil;
|
||||||
for (; i < iseq->arg_keyword_required; i++) {
|
for (; i < iseq->arg_keyword_required; i++) {
|
||||||
if (st_lookup(RHASH_TBL(keyword_hash), ID2SYM(iseq->arg_keyword_table[i]), 0))
|
VALUE keyword = ID2SYM(iseq->arg_keyword_table[i]);
|
||||||
|
if (st_lookup(RHASH_TBL(keyword_hash), (st_data_t)keyword, 0))
|
||||||
continue;
|
continue;
|
||||||
if (NIL_P(missing)) missing = rb_ary_tmp_new(1);
|
if (NIL_P(missing)) missing = rb_ary_tmp_new(1);
|
||||||
rb_ary_push(missing, ID2SYM(iseq->arg_keyword_table[i]));
|
rb_ary_push(missing, keyword);
|
||||||
}
|
}
|
||||||
if (!NIL_P(missing)) {
|
if (!NIL_P(missing)) {
|
||||||
keyword_error("missing", missing);
|
keyword_error("missing", missing);
|
||||||
|
|
Loading…
Reference in a new issue