[前][次][番号順一覧][スレッド一覧]

ruby-changes:7116

From: akr <ko1@a...>
Date: Fri, 15 Aug 2008 09:05:34 +0900 (JST)
Subject: [ruby-changes:7116] Ruby:r18634 (trunk): * transcode.c (econv_init): don't create dummy encoding if

akr	2008-08-15 09:05:06 +0900 (Fri, 15 Aug 2008)

  New Revision: 18634

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18634

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_econv.rb
    trunk/transcode.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18633)
+++ ChangeLog	(revision 18634)
@@ -1,3 +1,10 @@
+Fri Aug 15 09:03:54 2008  Tanaka Akira  <akr@f...>
+
+	* 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@r...>
 
 	* common.mk ({$(srcdir)}.y.c): escape backslash.
Index: test/ruby/test_econv.rb
===================================================================
--- test/ruby/test_econv.rb	(revision 18633)
+++ test/ruby/test_econv.rb	(revision 18634)
@@ -25,6 +25,19 @@
     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)
Index: transcode.c
===================================================================
--- transcode.c	(revision 18633)
+++ transcode.c	(revision 18634)
@@ -1413,16 +1413,12 @@
 }
 
 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 @@
 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 @@
     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;
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]