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

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/

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