mirror of
https://github.com/ruby/ruby.git
synced 2026-01-27 04:24:23 +00:00
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:
parent
341376215b
commit
7190c04417
@ -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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user