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/