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

ruby-changes:3674

From: ko1@a...
Date: Tue, 22 Jan 2008 04:47:48 +0900 (JST)
Subject: [ruby-changes:3674] matz - Ruby:r15163 (trunk): * parse.y (rb_intern3): do not call rb_enc_mbclen() if *m is

matz	2008-01-22 04:47:26 +0900 (Tue, 22 Jan 2008)

  New Revision: 15163

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/encoding.h
    trunk/parse.y
    trunk/string.c

  Log:
    * parse.y (rb_intern3): do not call rb_enc_mbclen() if *m is
      ASCII.  [ruby-talk:287225]
    
    * string.c (rb_str_each_line): use rb_enc_is_newline() to gain
      performance if the record separator ($/) is not modified.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15163&r2=15162&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/parse.y?r1=15163&r2=15162&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15163&r2=15162&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/encoding.h?r1=15163&r2=15162&diff_format=u

Index: include/ruby/encoding.h
===================================================================
--- include/ruby/encoding.h	(revision 15162)
+++ include/ruby/encoding.h	(revision 15163)
@@ -133,6 +133,9 @@
 #define rb_enc_left_char_head(s,p,enc) (char *)onigenc_get_left_adjust_char_head(enc,(UChar*)(s),(UChar*)(p))
 #define rb_enc_right_char_head(s,p,enc) (char *)onigenc_get_right_adjust_char_head(enc,(UChar*)(s),(UChar*)(p))
 
+/* ptr, ptr, encoding -> newline_or_not */
+#define rb_enc_is_newline(p,end,enc)  ONIGENC_IS_MBC_NEWLINE(enc,p,end)
+
 #define rb_enc_isctype(c,t,enc) ONIGENC_IS_CODE_CTYPE(enc,c,t)
 #define rb_enc_isascii(c,enc) ONIGENC_IS_CODE_ASCII(c)
 #define rb_enc_isalpha(c,enc) ONIGENC_IS_CODE_ALPHA(enc,c)
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15162)
+++ ChangeLog	(revision 15163)
@@ -1,3 +1,11 @@
+Tue Jan 22 04:40:28 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* parse.y (rb_intern3): do not call rb_enc_mbclen() if *m is
+	  ASCII.  [ruby-talk:287225]
+
+	* string.c (rb_str_each_line): use rb_enc_is_newline() to gain
+	  performance if the record separator ($/) is not modified.
+
 Tue Jan 22 01:15:51 2008  Kazuhiro NISHIYAMA  <zn@m...>
 
 	* ChangeLog: format-time-string under C locale. [ruby-dev:33261]
Index: string.c
===================================================================
--- string.c	(revision 15162)
+++ string.c	(revision 15163)
@@ -4468,6 +4468,7 @@
     char *ptr = p;
     long len = RSTRING_LEN(str), rslen;
     VALUE line;
+    int n;
 
     if (rb_scan_args(argc, argv, "01", &rs) == 0) {
 	rs = rb_rs;
@@ -4480,6 +4481,22 @@
     }
     StringValue(rs);
     enc = rb_enc_check(str, rs);
+    if (rs == rb_default_rs) {
+	while (p < pend) {
+	    n = rb_enc_mbclen(p, pend, enc);
+	    if (rb_enc_is_newline(p, pend, enc)) {
+		line = rb_str_new5(str, s, p - s + n);
+		OBJ_INFECT(line, str);
+		rb_enc_copy(line, str);
+		rb_yield(line);
+		str_mod_check(str, ptr, len);
+		s = p + n;
+	    }
+	    p += n;
+	}
+	goto finish;
+    }
+
     rslen = RSTRING_LEN(rs);
     if (rslen == 0) {
 	newline = '\n';
@@ -4490,8 +4507,8 @@
 
     while (p < pend) {
 	int c = rb_enc_codepoint(p, pend, enc);
-	int n = rb_enc_codelen(c, enc);
 
+	n = rb_enc_codelen(c, enc);
 	if (rslen == 0 && c == newline) {
 	    while (p < pend && rb_enc_codepoint(p, pend, enc) == newline) {
 		p += n;
@@ -4510,6 +4527,7 @@
 	p += n;
     }
 
+  finish:
     if (s != pend) {
 	if (p > pend) p = pend;
 	line = rb_str_new5(str, s, p - s);
Index: parse.y
===================================================================
--- parse.y	(revision 15162)
+++ parse.y	(revision 15163)
@@ -8966,8 +8966,13 @@
     mb = 0;
     if (!rb_enc_isdigit(*m, enc)) {
 	while (m <= name + last && is_identchar(m, e, enc)) {
-	    if (!ISASCII(*m)) mb = 1;
-	    m += rb_enc_mbclen(m, e, enc);
+	    if (ISASCII(*m)) {
+		m++;
+	    }
+	    else {
+		mb = 1;
+		m += rb_enc_mbclen(m, e, enc);
+	    }
 	}
     }
     if (m - name < len) id = ID_JUNK;

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

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