aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-15 00:05:06 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-15 00:05:06 +0000
commit520cd6d186fd0753e052fd153fc2c5b764cb9aee (patch)
treeb6bff4e98745c435ac57140cab7b930efd5f045c
parent51c7947bdeac3bb9e80dfd104ab3352fb57ce1b0 (diff)
downloadruby-520cd6d186fd0753e052fd153fc2c5b764cb9aee.tar.gz
* transcode.c (econv_init): don't create dummy encoding if
rb_econv_open is failed. (make_dummy_encoding): new function extracted from make_encoding. (make_encoding): removed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18634 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--test/ruby/test_econv.rb13
-rw-r--r--transcode.c45
3 files changed, 53 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 4e7d64c0ef..fd0205713d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Aug 15 09:03:54 2008 Tanaka Akira <akr@fsij.org>
+
+ * transcode.c (econv_init): don't create dummy encoding if
+ rb_econv_open is failed.
+ (make_dummy_encoding): new function extracted from make_encoding.
+ (make_encoding): removed.
+
Fri Aug 15 01:07:16 2008 NARUSE, Yui <naruse@ruby-lang.org>
* common.mk ({$(srcdir)}.y.c): escape backslash.
diff --git a/test/ruby/test_econv.rb b/test/ruby/test_econv.rb
index af846ad45b..738be01e8c 100644
--- a/test/ruby/test_econv.rb
+++ b/test/ruby/test_econv.rb
@@ -25,6 +25,19 @@ class TestEncodingConverter < Test::Unit::TestCase
assert_kind_of(Encoding::Converter, Encoding::Converter.new(Encoding::UTF_8, Encoding::EUC_JP))
end
+ def test_new_fail
+ name1 = "encoding-which-is-not-exist-1"
+ name2 = "encoding-which-is-not-exist-2"
+
+ assert_raise(ArgumentError) {
+ Encoding::Converter.new(name1, name2)
+ }
+
+ encoding_list = Encoding.list.map {|e| e.name }
+ assert(!encoding_list.include?(name1))
+ assert(!encoding_list.include?(name2))
+ end
+
def test_get_encoding
ec = Encoding::Converter.new("UTF-8", "EUC-JP")
assert_equal(Encoding::UTF_8, ec.source_encoding)
diff --git a/transcode.c b/transcode.c
index 2af60b9a7d..b7f222ad74 100644
--- a/transcode.c
+++ b/transcode.c
@@ -1413,16 +1413,12 @@ econv_s_allocate(VALUE klass)
}
static rb_encoding *
-make_encoding(VALUE encoding)
+make_dummy_encoding(const char *name)
{
- int idx = rb_to_encoding_index(encoding);
rb_encoding *enc;
- if (0 <= idx)
- enc = rb_enc_from_index(idx);
- else {
- idx = rb_define_dummy_encoding(StringValueCStr(encoding));
- enc = rb_enc_from_index(idx);
- }
+ int idx;
+ idx = rb_define_dummy_encoding(name);
+ enc = rb_enc_from_index(idx);
return enc;
}
@@ -1458,6 +1454,8 @@ static VALUE
econv_init(int argc, VALUE *argv, VALUE self)
{
VALUE source_encoding, destination_encoding, flags_v;
+ int sidx, didx;
+ const char *sname, *dname;
rb_encoding *senc, *denc;
rb_econv_t *ec;
int flags;
@@ -1469,18 +1467,41 @@ econv_init(int argc, VALUE *argv, VALUE self)
else
flags = NUM2INT(flags_v);
- senc = make_encoding(source_encoding);
- denc = make_encoding(destination_encoding);
+ senc = NULL;
+ sidx = rb_to_encoding_index(source_encoding);
+ if (0 <= sidx) {
+ senc = rb_enc_from_index(sidx);
+ }
+ else {
+ StringValue(source_encoding);
+ }
+
+ denc = NULL;
+ didx = rb_to_encoding_index(destination_encoding);
+ if (0 <= didx) {
+ denc = rb_enc_from_index(didx);
+ }
+ else {
+ StringValue(destination_encoding);
+ }
+
+ sname = senc ? senc->name : StringValueCStr(source_encoding);
+ dname = denc ? denc->name : StringValueCStr(destination_encoding);
if (DATA_PTR(self)) {
rb_raise(rb_eTypeError, "already initialized");
}
- ec = rb_econv_open(senc->name, denc->name, flags);
+ ec = rb_econv_open(sname, dname, flags);
if (!ec) {
- rb_raise(rb_eArgError, "encoding convewrter not supported (from %s to %s)", senc->name, denc->name);
+ rb_raise(rb_eArgError, "encoding convewrter not supported (from %s to %s)", sname, dname);
}
+ if (!senc)
+ senc = make_dummy_encoding(sname);
+ if (!denc)
+ denc = make_dummy_encoding(dname);
+
ec->source_encoding = senc;
ec->destination_encoding = denc;