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

ruby-changes:22301

From: naruse <ko1@a...>
Date: Sat, 21 Jan 2012 21:57:49 +0900 (JST)
Subject: [ruby-changes:22301] naruse:r34350 (trunk): * encoding.c (rb_enc_compatible): fix segv on symbols.

naruse	2012-01-21 21:57:37 +0900 (Sat, 21 Jan 2012)

  New Revision: 34350

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

  Log:
    * encoding.c (rb_enc_compatible): fix segv on symbols.
      [ruby-core:42204] [Bug #5921]

  Modified files:
    trunk/ChangeLog
    trunk/encoding.c
    trunk/test/ruby/test_encoding.rb

Index: encoding.c
===================================================================
--- encoding.c	(revision 34349)
+++ encoding.c	(revision 34350)
@@ -759,6 +759,7 @@
 {
     int idx1, idx2;
     rb_encoding *enc1, *enc2;
+    int isstr1, isstr2;
 
     idx1 = rb_enc_get_index(str1);
     idx2 = rb_enc_get_index(str2);
@@ -772,33 +773,38 @@
     enc1 = rb_enc_from_index(idx1);
     enc2 = rb_enc_from_index(idx2);
 
-    if (BUILTIN_TYPE(str2) == T_STRING && RSTRING_LEN(str2) == 0)
+    isstr2 = RB_TYPE_P(str2, T_STRING);
+    if (isstr2 && RSTRING_LEN(str2) == 0)
 	return enc1;
-    if (BUILTIN_TYPE(str1) == T_STRING && RSTRING_LEN(str1) == 0)
+    isstr1 = RB_TYPE_P(str1, T_STRING);
+    if (isstr1 && RSTRING_LEN(str1) == 0)
 	return (rb_enc_asciicompat(enc1) && rb_enc_str_asciionly_p(str2)) ? enc1 : enc2;
     if (!rb_enc_asciicompat(enc1) || !rb_enc_asciicompat(enc2)) {
 	return 0;
     }
 
     /* objects whose encoding is the same of contents */
-    if (BUILTIN_TYPE(str2) != T_STRING && idx2 == ENCINDEX_US_ASCII)
+    if (!isstr2 && idx2 == ENCINDEX_US_ASCII)
 	return enc1;
-    if (BUILTIN_TYPE(str1) != T_STRING && idx1 == ENCINDEX_US_ASCII)
+    if (!isstr1 && idx1 == ENCINDEX_US_ASCII)
 	return enc2;
 
-    if (BUILTIN_TYPE(str1) != T_STRING) {
+    if (!isstr1) {
 	VALUE tmp = str1;
 	int idx0 = idx1;
 	str1 = str2;
 	str2 = tmp;
 	idx1 = idx2;
 	idx2 = idx0;
+	idx0 = isstr1;
+	isstr1 = isstr2;
+	isstr2 = idx0;
     }
-    if (BUILTIN_TYPE(str1) == T_STRING) {
+    if (isstr1) {
 	int cr1, cr2;
 
 	cr1 = rb_enc_str_coderange(str1);
-	if (BUILTIN_TYPE(str2) == T_STRING) {
+	if (isstr2) {
 	    cr2 = rb_enc_str_coderange(str2);
 	    if (cr1 != cr2) {
 		/* may need to handle ENC_CODERANGE_BROKEN */
@@ -1083,7 +1089,7 @@
  *
  * If the objects are non-strings their encodings are compatible when they
  * have an encoding and:
- * * Either encoding is US ASCII compatible
+ * * Either encoding is US-ASCII compatible
  * * One of the encodings is a 7-bit encoding
  *
  */
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34349)
+++ ChangeLog	(revision 34350)
@@ -1,3 +1,8 @@
+Sat Jan 21 21:51:19 2012  NARUSE, Yui  <naruse@r...>
+
+	* encoding.c (rb_enc_compatible): fix segv on symbols.
+	  [ruby-core:42204] [Bug #5921]
+
 Sat Jan 21 11:43:45 2012  Nobuyoshi Nakada  <nobu@r...>
 
 	* dir.c (dir_chdir, check_dirname): get rid of optimization-out.
Index: test/ruby/test_encoding.rb
===================================================================
--- test/ruby/test_encoding.rb	(revision 34349)
+++ test/ruby/test_encoding.rb	(revision 34350)
@@ -104,4 +104,10 @@
     bug5279 = '[ruby-dev:44469]'
     assert_ruby_status([], '$SAFE=4; "a".encode("utf-16be")', bug5279)
   end
+
+  def test_compatible_p
+    ua = "abc".force_encoding(Encoding::UTF_8)
+    assert_equal(Encoding::UTF_8, Encoding.compatible?(ua, :abc))
+    assert_equal(nil, Encoding.compatible?(ua, 1))
+  end
 end

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

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