ruby-changes:7836
From: naruse <ko1@a...>
Date: Mon, 15 Sep 2008 14:22:45 +0900 (JST)
Subject: [ruby-changes:7836] Ruby:r19357 (trunk): * encoding.c (rb_enc_compatible): accepst other than strings and
naruse 2008-09-15 14:17:18 +0900 (Mon, 15 Sep 2008) New Revision: 19357 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=19357 Log: * encoding.c (rb_enc_compatible): accepst other than strings and regexps. [ruby-core:18595] * encoding.c (rb_enc_get_index): works files and encodings. Modified files: trunk/ChangeLog trunk/encoding.c trunk/test/ruby/test_m17n.rb Index: encoding.c =================================================================== --- encoding.c (revision 19356) +++ encoding.c (revision 19357) @@ -545,14 +545,30 @@ int rb_enc_get_index(VALUE obj) { - int i; + int i = -1; + VALUE tmp; - i = ENCODING_GET_INLINED(obj); - if (i == ENCODING_INLINE_MAX) { - VALUE iv; + switch (BUILTIN_TYPE(obj)) { + case T_STRING: + case T_REGEXP: + i = ENCODING_GET_INLINED(obj); + if (i == ENCODING_INLINE_MAX) { + VALUE iv; - iv = rb_ivar_get(obj, rb_id_encoding()); - i = NUM2INT(iv); + iv = rb_ivar_get(obj, rb_id_encoding()); + i = NUM2INT(iv); + } + break; + case T_FILE: + tmp = rb_funcall(obj, rb_intern("internal_encoding"), 0, 0); + if (NIL_P(tmp)) obj = rb_funcall(obj, rb_intern("external_encoding"), 0, 0); + else obj = tmp; + if (NIL_P(obj)) break; + case T_DATA: + if (RDATA(obj)->dmark == enc_mark) { + i = enc_check_encoding(obj); + } + break; } return i; } @@ -631,9 +647,11 @@ if (!rb_enc_asciicompat(enc1) || !rb_enc_asciicompat(enc2)) { return 0; } - if (BUILTIN_TYPE(str2) == T_REGEXP && idx2 == ENCINDEX_US_ASCII) + + /* objects whose encoding is the same of contents */ + if (BUILTIN_TYPE(str2) != T_STRING && idx2 == ENCINDEX_US_ASCII) return enc1; - if (BUILTIN_TYPE(str1) == T_REGEXP && idx1 == ENCINDEX_US_ASCII) + if (BUILTIN_TYPE(str1) != T_STRING && idx1 == ENCINDEX_US_ASCII) return enc2; if (BUILTIN_TYPE(str1) != T_STRING) { @@ -880,14 +898,6 @@ { rb_encoding *enc; - if (SPECIAL_CONST_P(str1) || TYPE(str1) != T_STRING && TYPE(str1) != T_REGEXP) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected String or Regexp)", - rb_obj_classname(str1)); - } - if (SPECIAL_CONST_P(str2) || TYPE(str2) != T_STRING && TYPE(str2) != T_REGEXP) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected String or Regexp)", - rb_obj_classname(str2)); - } if (!enc_capable(str1)) return Qnil; if (!enc_capable(str2)) return Qnil; enc = rb_enc_compatible(str1, str2); Index: ChangeLog =================================================================== --- ChangeLog (revision 19356) +++ ChangeLog (revision 19357) @@ -1,3 +1,10 @@ +Mon Sep 15 13:53:33 2008 NARUSE, Yui <naruse@r...> + + * encoding.c (rb_enc_compatible): accepst other than strings and + regexps. [ruby-core:18595] + + * encoding.c (rb_enc_get_index): works files and encodings. + Mon Sep 15 13:17:21 2008 Tadayoshi Funaba <tadf@d...> * complex.c (nucomp_eql_p): new. Index: test/ruby/test_m17n.rb =================================================================== --- test/ruby/test_m17n.rb (revision 19356) +++ test/ruby/test_m17n.rb (revision 19357) @@ -1280,7 +1280,12 @@ end def test_compatible - assert_raise(TypeError) {Encoding.compatible?("",0)} + assert_nil Encoding.compatible?("",0) + assert_equal(Encoding::UTF_8, Encoding.compatible?(Encoding::UTF_8, Encoding::UTF_8)) + assert_equal(Encoding::UTF_8, Encoding.compatible?(Encoding::UTF_8, Encoding::US_ASCII)) + assert_equal(Encoding::ASCII_8BIT, + Encoding.compatible?(Encoding::ASCII_8BIT, Encoding::US_ASCII)) + assert_nil Encoding.compatible?(Encoding::UTF_8, Encoding::ASCII_8BIT) end def test_force_encoding -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/