aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--compile.c4
-rw-r--r--test/ruby/test_keyword.rb9
3 files changed, 19 insertions, 2 deletions
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 <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):
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