summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-02-17 10:15:28 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-02-17 10:15:28 +0000
commitd092fc539831062af3b87d2f4e29e94da3cc9b0e (patch)
tree9cd8993f4d68151514f9f7dea5c23ec1947ed638
parentc00d51c739003285255c1a285d121761de310572 (diff)
Additional fix and tests for r53851
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53854 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--string.c6
-rw-r--r--test/ruby/test_string.rb11
2 files changed, 14 insertions, 3 deletions
diff --git a/string.c b/string.c
index a72503e..73e9492 100644
--- a/string.c
+++ b/string.c
@@ -1383,6 +1383,7 @@ rb_str_init(int argc, VALUE *argv, VALUE str)
vcapa = kwargs[1];
if (vcapa != Qundef && !NIL_P(vcapa)) {
long capa = NUM2LONG(vcapa);
+ str_discard(str);
if (capa < STR_BUF_MIN_SIZE) {
capa = STR_BUF_MIN_SIZE;
}
@@ -1405,6 +1406,7 @@ rb_str_init(int argc, VALUE *argv, VALUE str)
}
else if (n == 1) {
StringValue(orig);
+ str_discard(str);
str_replace(str, orig);
}
if (enc != Qundef && !NIL_P(enc)) {
@@ -1414,9 +1416,7 @@ rb_str_init(int argc, VALUE *argv, VALUE str)
}
else if (n == 1) {
StringValue(orig);
- if (OBJ_FROZEN(str)) {
- rb_error_frozen_object(str);
- }
+ str_discard(str);
str_replace(str, orig);
}
return str;
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index 339e872..c78ecc1 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -59,6 +59,17 @@ class TestString < Test::Unit::TestCase
assert_equal(Encoding::EUC_JP, S("", capacity: 1000, encoding: "euc-jp").encoding)
end
+ def test_initialize
+ str = S("").freeze
+ assert_equal("", str.__send__(:initialize))
+ assert_raise(RuntimeError){ str.__send__(:initialize, 'abc') }
+ assert_raise(RuntimeError){ str.__send__(:initialize, capacity: 1000) }
+ assert_raise(RuntimeError){ str.__send__(:initialize, 'abc', capacity: 1000) }
+ assert_raise(RuntimeError){ str.__send__(:initialize, encoding: 'euc-jp') }
+ assert_raise(RuntimeError){ str.__send__(:initialize, 'abc', encoding: 'euc-jp') }
+ assert_raise(RuntimeError){ str.__send__(:initialize, 'abc', capacity: 1000, encoding: 'euc-jp') }
+ end
+
def test_AREF # '[]'
assert_equal("A", S("AooBar")[0])
assert_equal("B", S("FooBaB")[-1])