diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | compile.c | 4 | ||||
-rw-r--r-- | test/ruby/test_keyword.rb | 9 |
3 files changed, 19 insertions, 2 deletions
@@ -1,3 +1,11 @@ +Sat Sep 20 10:23:00 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * compile.c (iseq_set_arguments): store local variable IDs in + temporary list as Symbols. previously these are stored as + Fixnums to prevent from GC, but IDs of dynamic symbols can + exceed Fixnum range and cause RangeError at inverting from + Fixnum. [ruby-dev:48564] [Bug #10266] + Sat Sep 20 10:02:51 2014 Tanaka Akira <akr@fsij.org> * ext/openssl/lib/openssl/x509.rb (OpenSSL::X509::Name#pretty_print): @@ -1237,7 +1237,7 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node_args) if (!required) required = rb_ary_tmp_new(1); list = required; } - rb_ary_push(list, INT2FIX(node->nd_body->nd_vid)); + rb_ary_push(list, ID2SYM(node->nd_body->nd_vid)); COMPILE_POPED(optargs, "kwarg", node); /* nd_type(node) == NODE_KW_ARG */ node = node->nd_next; i += 1; @@ -1251,7 +1251,7 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node_args) keywords = required; } for (j = 0; j < i; j++) { - iseq->arg_keyword_table[j] = FIX2INT(RARRAY_AREF(keywords, j)); + iseq->arg_keyword_table[j] = SYM2ID(RARRAY_AREF(keywords, j)); } ADD_INSN(optargs, nd_line(args->kw_args), pop); } diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb index a7249381d8..6080c02bf5 100644 --- a/test/ruby/test_keyword.rb +++ b/test/ruby/test_keyword.rb @@ -491,4 +491,13 @@ class TestKeywordArguments < Test::Unit::TestCase tap { prc.call } }, bug8964 end + + def test_dynamic_symbol_keyword + bug10266 = '[ruby-dev:48564] [Bug #10266]' + assert_separately(['-', bug10266], <<-'end;') # do + bug = ARGV.shift + "hoge".to_sym + assert_nothing_raised(bug) {eval("def a(hoge:); end")} + end; + end end |