compile.c: store IDs as Symbols

* 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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47648 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-09-20 01:23:02 +00:00
parent 341376215b
commit 7190c04417
3 changed files with 19 additions and 2 deletions

View File

@ -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):

View File

@ -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);
}

View File

@ -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