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

ruby-changes:3422

From: ko1@a...
Date: 7 Jan 2008 01:38:19 +0900
Subject: [ruby-changes:3422] akr - Ruby:r14915 (trunk): * string.c (coderange_scan): optimize ASCII-8BIT string.

akr	2008-01-07 01:38:04 +0900 (Mon, 07 Jan 2008)

  New Revision: 14915

  Modified files:
    trunk/ChangeLog
    trunk/string.c

  Log:
    * string.c (coderange_scan): optimize ASCII-8BIT string.
      (rb_enc_str_buf_cat): don't call coderange_scan if possible.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=14915&r2=14914&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14915&r2=14914&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14914)
+++ ChangeLog	(revision 14915)
@@ -1,3 +1,8 @@
+Mon Jan  7 01:36:49 2008  Tanaka Akira  <akr@f...>
+
+	* string.c (coderange_scan): optimize ASCII-8BIT string.
+	  (rb_enc_str_buf_cat): don't call coderange_scan if possible.
+
 Mon Jan  7 01:05:45 2008  Tanaka Akira  <akr@f...>
 
 	* lib/erb.rb (ERB::Revision): cut off locale dependent string in Date
Index: string.c
===================================================================
--- string.c	(revision 14914)
+++ string.c	(revision 14915)
@@ -119,6 +119,17 @@
     const char *e = p + len;
     int cr;
 
+    if (rb_enc_to_index(enc) == 0) {
+        /* enc is ASCII-8BIT.  ASCII-8BIT string never be broken. */
+        while (p < e) {
+            if (!ISASCII((unsigned char)*p)) {
+                return ENC_CODERANGE_VALID;
+            }
+            p++;
+        }
+        return ENC_CODERANGE_7BIT;
+    }
+
     cr = rb_enc_asciicompat(enc) ? ENC_CODERANGE_7BIT : ENC_CODERANGE_VALID;
     while (p < e) {
         int ret = rb_enc_precise_mbclen(p, e, enc);
@@ -1056,14 +1067,24 @@
     int ptr_a8 = rb_enc_to_index(ptr_enc) == 0;
 
     str_cr = ENC_CODERANGE(str);
-    ptr_cr = coderange_scan(ptr, len, ptr_enc);
 
-    if (str_cr == ENC_CODERANGE_UNKNOWN) {
-        if (str_a8 ? !ptr_a8
-                   : (str_enc != ptr_enc && ptr_cr != ENC_CODERANGE_7BIT)) {
-            str_cr = rb_enc_str_coderange(str);
+    if (str_enc == ptr_enc) {
+        if (str_cr == ENC_CODERANGE_UNKNOWN ||
+            (ptr_a8 && str_cr != ENC_CODERANGE_7BIT)) {
+            ptr_cr = ENC_CODERANGE_UNKNOWN;
         }
+        else {
+            ptr_cr = coderange_scan(ptr, len, ptr_enc);
+        }
     }
+    else {
+        ptr_cr = coderange_scan(ptr, len, ptr_enc);
+        if (str_cr == ENC_CODERANGE_UNKNOWN) {
+            if (str_a8 || ptr_cr != ENC_CODERANGE_7BIT) {
+                str_cr = rb_enc_str_coderange(str);
+            }
+        }
+    }
 
     if (str_enc != ptr_enc &&
         str_cr != ENC_CODERANGE_7BIT &&

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

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