aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-10 10:39:51 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-10 10:39:51 +0000
commitbff3f1818977389601c8caf5677b32e52e367974 (patch)
treed4f1018a302f5bc4ffcec65e4c9ccb06dbc1e9c5
parent71647c1c47aa799352ba88ddec7ef10c80bee639 (diff)
downloadruby-bff3f1818977389601c8caf5677b32e52e367974.tar.gz
range.c: check if range modifiable
* range.c (range_modify): frozen object cannot be modified. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56693 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--range.c1
-rw-r--r--test/ruby/test_range.rb6
2 files changed, 7 insertions, 0 deletions
diff --git a/range.c b/range.c
index 84a2dcc679..68264992f3 100644
--- a/range.c
+++ b/range.c
@@ -80,6 +80,7 @@ rb_range_new(VALUE beg, VALUE end, int exclude_end)
static void
range_modify(VALUE range)
{
+ rb_check_frozen(range);
/* Ranges are immutable, so that they should be initialized only once. */
if (RANGE_EXCL(range) != Qnil) {
rb_name_err_raise("`initialize' called twice", range, ID2SYM(idInitialize));
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb
index cfd8b502ed..a70361d6cb 100644
--- a/test/ruby/test_range.rb
+++ b/test/ruby/test_range.rb
@@ -11,6 +11,12 @@ class TestRange < Test::Unit::TestCase
assert_equal((0...2), Range.new(0, 2, true))
end
+ def test_frozen_initialize
+ r = Range.allocate
+ r.freeze
+ assert_raise(RuntimeError){r.__send__(:initialize, 1, 2)}
+ end
+
def test_range_string
# XXX: Is this really the test of Range?
assert_equal([], ("a" ... "a").to_a)