summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-30 09:40:06 +0000
committerduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-30 09:40:06 +0000
commit5e85648b770f6999bc0020ddddfe0bcdbf5149c5 (patch)
treef6397cd73df1fea3bc3a0328ec5e568110691dc4
parentb8b083dbd5444007645a667dcb9d7a30e1e44b0b (diff)
* transcode.c: added check for frozen string for encode! (see Bug #1836)
* test/ruby/test_transcode.rb: added tests for the above git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24322 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--test/ruby/test_transcode.rb2
-rw-r--r--transcode.c4
3 files changed, 12 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 46332d3aaf7..42128554c71 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Jul 30 18:39:39 2009 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * transcode.c: added check for frozen string for encode! (see Bug #1836)
+
+ * test/ruby/test_transcode.rb: added tests for the above
+
Thu Jul 30 16:45:39 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* insns.def (defineclass): preserve encoding of class/module
diff --git a/test/ruby/test_transcode.rb b/test/ruby/test_transcode.rb
index 41e032fdb7e..cd956e134bd 100644
--- a/test/ruby/test_transcode.rb
+++ b/test/ruby/test_transcode.rb
@@ -11,6 +11,8 @@ class TestTranscode < Test::Unit::TestCase
assert_raise(Encoding::UndefinedConversionError) { "\x80".encode('utf-8','ASCII-8BIT') }
assert_raise(Encoding::InvalidByteSequenceError) { "\x80".encode('utf-8','US-ASCII') }
assert_raise(Encoding::UndefinedConversionError) { "\xA5".encode('utf-8','iso-8859-3') }
+ assert_raise(RuntimeError) { 'hello'.freeze.encode!('iso-8859-1') }
+ assert_raise(RuntimeError) { '\u3053\u3093\u306b\u3061\u306f'.freeze.encode!('iso-8859-1') } # こんにちは
end
def test_arguments
diff --git a/transcode.c b/transcode.c
index ee6794d9bef..9e4c8392c6f 100644
--- a/transcode.c
+++ b/transcode.c
@@ -2644,6 +2644,10 @@ str_encode_associate(VALUE str, int encidx)
static VALUE
str_encode_bang(int argc, VALUE *argv, VALUE str)
{
+ if (OBJ_FROZEN(str)) { /* in future, may use str_frozen_check from string.c, but that's currently static */
+ rb_raise(rb_eRuntimeError, "string frozen");
+ }
+
VALUE newstr = str;
int encidx = str_transcode(argc, argv, &newstr);