diff --git a/ChangeLog b/ChangeLog index 7ea99f9a3a..e4e348b8d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sat Sep 20 10:23:00 2014 Nobuyoshi Nakada + + * 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 * ext/openssl/lib/openssl/x509.rb (OpenSSL::X509::Name#pretty_print): diff --git a/compile.c b/compile.c index ac4e5bac22..93f0603568 100644 --- a/compile.c +++ b/compile.c @@ -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