From 4a223fb67f31a1a85a0b4fb019a1106532a541ce Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 1 Jun 2013 08:25:05 +0000 Subject: [PATCH] compile.c: not simple if keyword args * compile.c (iseq_set_arguments): not a simple single argument if any keyword arguments exist. [ruby-core:55203] [Bug #8463] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41021 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 ++++- compile.c | 3 ++- test/ruby/test_keyword.rb | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82ca655403..18eab62e9d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ -Sat Jun 1 17:21:24 2013 Nobuyoshi Nakada +Sat Jun 1 17:24:47 2013 Nobuyoshi Nakada + + * compile.c (iseq_set_arguments): not a simple single argument if any + keyword arguments exist. [ruby-core:55203] [Bug #8463] * vm_insnhelper.c (vm_yield_setup_block_args): split single parameter if any keyword arguments exist, and then extract keyword arguments. diff --git a/compile.c b/compile.c index 70db48c6a0..e0ca056cd1 100644 --- a/compile.c +++ b/compile.c @@ -1276,7 +1276,8 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node_args) } if (iseq->type == ISEQ_TYPE_BLOCK) { - if (iseq->arg_opts == 0 && iseq->arg_post_len == 0 && iseq->arg_rest == -1) { + if (iseq->arg_opts == 0 && iseq->arg_post_len == 0 && + iseq->arg_rest == -1 && iseq->arg_keyword == -1) { if (iseq->argc == 1 && last_comma == 0) { /* {|a|} */ iseq->arg_simple |= 0x02; diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb index 4ff7c40321..c21afe4495 100644 --- a/test/ruby/test_keyword.rb +++ b/test/ruby/test_keyword.rb @@ -271,6 +271,8 @@ class TestKeywordArguments < Test::Unit::TestCase assert_equal(expect, pr.call(expect), bug8463) pr = proc {|a, *b, **opt| next a, *b, opt} assert_equal(expect, pr.call(expect), bug8463) + pr = proc {|a, **opt| next a, opt} + assert_equal(expect.values_at(0, -1), pr.call(expect), bug8463) end def test_bare_kwrest