[#32945] Shift_JIS variants and UTF-16 support — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

22 messages 2008/01/07
[#32953] Re: Shift_JIS variants and UTF-16 support — Martin Duerst <duerst@...> 2008/01/07

中村さん、こんにちは。

[#32955] Re: Shift_JIS variants and UTF-16 support — Yukihiro Matsumoto <matz@...> 2008/01/07

まつもと ゆきひろです

[#32959] Re: Shift_JIS variants and UTF-16 support — "NARUSE, Yui" <naruse@...> 2008/01/07

成瀬です。

[#32960] Re: Shift_JIS variants and UTF-16 support — Yukihiro Matsumoto <matz@...> 2008/01/07

まつもと ゆきひろです

[#32992] ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...>

成瀬です。

18 messages 2008/01/08
[#32994] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/09

まつもと ゆきひろです

[#32995] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Martin Duerst <duerst@...> 2008/01/09

At 18:13 08/01/09, Yukihiro Matsumoto wrote:

[#33011] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...> 2008/01/11

成瀬です。

[#33012] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/11

まつもと ゆきひろです

[#33014] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...> 2008/01/11

成瀬です。

[#33015] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/11

まつもと ゆきひろです

[#33239] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward. — Tanaka Akira <akr@...>

In article <200801210259.m0L2x3CW017171@ci.ruby-lang.org>,

11 messages 2008/01/21
[#33240] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward. — Nobuyoshi Nakada <nobu@...> 2008/01/21

なかだです。

[#33303] Time#strftimeのエンコーディング — rubikitch@...

るびきちです。

13 messages 2008/01/23
[#33305] Re: Time#strftimeのエンコーディング — Yukihiro Matsumoto <matz@...> 2008/01/23

まつもと ゆきひろです

[#33368] summary of script encoding — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

22 messages 2008/01/25
[#33375] Re: summary of script encoding — Yukihiro Matsumoto <matz@...> 2008/01/25

まつもと ゆきひろです

[#33376] Re: summary of script encoding — "U.Nakamura" <usa@...> 2008/01/25

こんにちは、なかむら(う)です。

[#33387] HashからStructを作る — rubikitch@...

るびきちです。

19 messages 2008/01/25
[#33455] Re: HashからStructを作る — Yukihiro Matsumoto <matz@...> 2008/01/28

まつもと ゆきひろです

[#33505] Re: HashからStructを作る — rubikitch@... 2008/01/29

From: Yukihiro Matsumoto <matz@ruby-lang.org>

[#33507] Re: HashからStructを作る — Yukihiro Matsumoto <matz@...> 2008/01/29

まつもと ゆきひろです

[#33508] Re: HashからStructを作る — rubikitch@... 2008/01/29

From: Yukihiro Matsumoto <matz@ruby-lang.org>

[#33433] Win32OLE: set encoding to OLE string — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

16 messages 2008/01/28

[#33461] Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...>

=1B$B?9ED$H?=3D$7$^$9!#=1B(B

19 messages 2008/01/28
[#33473] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Nobuyoshi Nakada <nobu@...> 2008/01/28

なかだです。

[#33503] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/29

森田です。

[#33514] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Nobuyoshi Nakada <nobu@...> 2008/01/29

なかだです。

[#33518] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/30

森田です。

[#33545] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Ryutaro Amano <wn9r-amn@...> 2008/01/31

天野竜太郎と申します。

[#33546] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/31

森田です。

[#33547] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Ryutaro Amano <wn9r-amn@...> 2008/01/31

天野です。

[#33551] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/31

森田です。

[#33488] 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

20 messages 2008/01/29
[#33491] Re: 現在の script encoding の値を得る方法は? — Yukihiro Matsumoto <matz@...> 2008/01/29

まつもと ゆきひろです

[#33500] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/29

永井@知能.九工大です.

[#33501] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/29

成瀬です。

[#33515] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/30

永井@知能.九工大です.

[#33516] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/30

成瀬です。

[#33519] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/30

永井@知能.九工大です.

[#33522] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/30

成瀬です。

[ruby-dev:33308] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward.

From: Nobuyoshi Nakada <nobu@...>
Date: 2008-01-23 06:54:57 UTC
List: ruby-dev #33308
なかだです。

At Mon, 21 Jan 2008 21:05:33 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:33254]:
> |> 変更がないことが確認できればそのほうがいいんですけどね。
> |
> |freezeしたコピーを作っておいて、変更の影響を受けないようにすると
> |いうのを思い付きました。当然のことながら格段に速くなるようです。
> 
> んじゃ、この線でコミットしてください。

もうひとつ思い付きました。

rb_str_modify()がsharedをクリアすることを利用して、ある時点以降
に変更されたか(正確には変更しようとされたか)チェックできそうです。


Index: string.c
===================================================================
--- string.c	(revision 15180)
+++ string.c	(working copy)
@@ -394,9 +394,9 @@ rb_str_new4(VALUE orig)
     if (OBJ_FROZEN(orig)) return orig;
     klass = rb_obj_class(orig);
-    if (STR_SHARED_P(orig) && (str = RSTRING(orig)->as.heap.aux.shared)
-	&& klass == RBASIC(str)->klass) {
+    if (STR_SHARED_P(orig) && (str = RSTRING(orig)->as.heap.aux.shared)) {
 	long ofs;
 	ofs = RSTRING_LEN(str) - RSTRING_LEN(orig);
-	if ((ofs > 0) || (!OBJ_TAINTED(str) && OBJ_TAINTED(orig))) {
+	if ((ofs > 0) || (klass != RBASIC(str)->klass) ||
+	    (!OBJ_TAINTED(str) && OBJ_TAINTED(orig))) {
 	    str = str_new3(klass, str);
 	    RSTRING(str)->as.heap.ptr += ofs;
@@ -980,4 +980,58 @@ rb_str_dup_frozen(VALUE str)
 }
 
+static VALUE
+str_snapshot(VALUE str)
+{
+    VALUE snap;
+
+    if (STR_ASSOC_P(str)) {
+	snap = str_alloc(rb_obj_class(str));
+	FL_SET(str, STR_ASSOC);
+	RSTRING(snap)->as.heap.aux.shared = RSTRING(str)->as.heap.aux.shared;
+	rb_enc_copy(snap, str);
+	OBJ_INFECT(snap, str);
+    }
+    else {
+	snap = rb_str_new4(str);
+    }
+    return snap;
+}
+
+static int
+str_modified_since(VALUE str, VALUE snap)
+{
+    /*
+     * encodings must be same, and snapshot of assocated is also
+     * assocated but unasscociated when to be modified.
+     */
+    const long invariant_bits = STR_ASSOC|ENCODING_MASK;
+    const long strf = RBASIC(str)->flags;
+    const long diff = strf ^ RBASIC(snap)->flags;
+
+    if (diff & invariant_bits) return 1;
+    if (!(strf & STR_NOEMBED)) {
+	/* check first since embeded strings are small */
+	long len = (strf & RSTRING_EMBED_LEN_MASK) >> RSTRING_EMBED_LEN_SHIFT;
+	if (diff & (STR_NOEMBED|RSTRING_EMBED_LEN_MASK))
+	    return 1;
+	if (memcmp(RSTRING(str)->as.ary, RSTRING(snap)->as.ary, len))
+	    return 1;
+    }
+    if (ENCODING_GET_INLINED(str) == ENCODING_INLINE_MAX &&
+	rb_enc_internal_get_index(str) != rb_enc_internal_get_index(snap)) {
+	return 1;
+    }
+    if (strf & STR_ASSOC) {
+	snap = RSTRING(snap)->as.heap.aux.shared;
+    }
+    else if (!(strf & STR_NOEMBED)) {
+	return 0;
+    }
+    else if (!(strf & STR_SHARED)) {
+	return 1;
+    }
+    return RSTRING(str)->as.heap.aux.shared != snap;
+}
+
 VALUE
 rb_str_locktmp(VALUE str)
@@ -4469,10 +4523,9 @@ rb_str_each_line(int argc, VALUE *argv, 
 {
     rb_encoding *enc;
-    VALUE rs;
+    VALUE rs, line;
+    volatile VALUE snapshot;
     int newline;
-    char *p = RSTRING_PTR(str), *pend = p + RSTRING_LEN(str), *s = p;
-    char *ptr = p;
-    long len = RSTRING_LEN(str), rslen;
-    VALUE line;
+    const char *ptr, *pend, *p, *s;
+    long i, len, rslen;
     int n;
 
@@ -4486,8 +4539,14 @@ rb_str_each_line(int argc, VALUE *argv, 
 	return str;
     }
-    StringValue(rs);
+
+    ptr = s = p = RSTRING_PTR(str);
+    len = RSTRING_LEN(str);
+    pend = p + len;
+    snapshot = str_snapshot(str);
+
+    rs = rb_str_new4(StringValue(rs));
     enc = rb_enc_check(str, rs);
     if (rs == rb_default_rs) {
-	while (p < pend) {
+	for (i = 0; p < pend; i++) {
 	    n = rb_enc_mbclen(p, pend, enc);
 	    if (rb_enc_is_newline(p, pend, enc)) {
@@ -4496,5 +4555,14 @@ rb_str_each_line(int argc, VALUE *argv, 
 		rb_enc_copy(line, str);
 		rb_yield(line);
-		str_mod_check(str, ptr, len);
+		if (str_modified_since(str, snapshot)) {
+		    ptr = RSTRING_PTR(str);
+		    len = RSTRING_LEN(str);
+		    pend = ptr + len;
+		    snapshot = str_snapshot(str);
+		    enc = rb_enc_get(str);
+		    p = str_nth(ptr, pend, i, enc, single_byte_optimizable(str));
+		    if (!p) break;
+		    n = rb_enc_mbclen(p, pend, enc);
+		}
 		s = p + n;
 	    }
@@ -4512,5 +4580,5 @@ rb_str_each_line(int argc, VALUE *argv, 
     }
 
-    while (p < pend) {
+    for (i = 0; p < pend; i++) {
 	int c = rb_enc_codepoint(p, pend, enc);
 
@@ -4519,6 +4587,8 @@ rb_str_each_line(int argc, VALUE *argv, 
 	    while (p < pend && rb_enc_codepoint(p, pend, enc) == newline) {
 		p += n;
+		i++;
 	    }
 	    p -= n;
+	    i--;
 	}
 	if (c == newline &&
@@ -4528,5 +4598,15 @@ rb_str_each_line(int argc, VALUE *argv, 
 	    rb_enc_copy(line, str);
 	    rb_yield(line);
-	    str_mod_check(str, ptr, len);
+	    if (str_modified_since(str, snapshot)) {
+		enc = rb_enc_check(str, rs); /* may be forced encoding */
+		ptr = RSTRING_PTR(str);
+		len = RSTRING_LEN(str);
+		pend = ptr + len;
+		snapshot = str_snapshot(str);
+		p = str_nth(ptr, pend, i, rb_enc_get(str),
+			    single_byte_optimizable(str));
+		if (!p) break;
+		n = rb_enc_mbclen(p, pend, enc);
+	    }
 	    s = p + (rslen ? rslen : n);
 	}
@@ -4615,16 +4695,24 @@ static VALUE
 rb_str_each_char(VALUE str)
 {
-    int i, len, n;
-    const char *ptr;
+    long i, n;
+    const char *ptr, *pend, *p;
     rb_encoding *enc;
+    volatile VALUE snapshot;
 
     RETURN_ENUMERATOR(str, 0, 0);
-    str = rb_str_new4(str);
-    ptr = RSTRING_PTR(str);
-    len = RSTRING_LEN(str);
+    snapshot = str_snapshot(str);
+    pend = (ptr = RSTRING_PTR(str)) + RSTRING_LEN(str);
     enc = rb_enc_get(str);
-    for (i = 0; i < len; i += n) {
-	n = rb_enc_mbclen(ptr + i, ptr + len, enc);
-	rb_yield(rb_str_subseq(str, i, n));
+    for (i = 0, p = ptr; p < pend; i++, p += n) {
+	n = rb_enc_mbclen(p, pend, enc);
+	rb_yield(rb_str_subseq(str, p - ptr, n));
+	if (str_modified_since(str, snapshot)) {
+	    snapshot = str_snapshot(str);
+	    pend = (ptr = RSTRING_PTR(str)) + RSTRING_LEN(str);
+	    enc = rb_enc_get(str);
+	    p = str_nth(ptr, pend, i, enc, single_byte_optimizable(str));
+	    if (!p) break;
+	    n = rb_enc_mbclen(p, pend, enc);
+	}
     }
     return str;


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next