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