[#32910] NKF,Kconv — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#32913] openの"b"とencoding — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#32922] SEGV by regexp match in while loop — Tanaka Akira <akr@...>
Debian GNU/Linux (sarge) の gcc-3.4 を使ってビルドした ruby
[#32935] queue and timeout — Tanaka Akira <akr@...>
timeout で Queue#pop に時間制限をつけた時、タイムアウト時に
まつもと ゆきひろです
[#32940] ripper cannot build on win32 — yukimi_sake <yukimi_sake@...>
雪見酒です。
[#32945] Shift_JIS variants and UTF-16 support — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
中村さん、こんにちは。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
成瀬です。
こんにちは、なかむら(う)です。
成瀬です。
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#32946] replica と alias の違い(encoding) — KIMURA Koichi <kimura.koichi@...>
木村です。
[#32987] error with open-uri (instance_eval?) — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#32988] Re: [ruby-cvs:22194] Ruby:r14957 (trunk): * encoding.c (rb_enc_init): UTF-{16,32}{BE,LE} are not builtin. — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#32992] ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...>
成瀬です。
まつもと ゆきひろです
At 18:13 08/01/09, Yukihiro Matsumoto wrote:
成瀬です。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
[#32996] binmode and ASCII-8BIT — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#33069] Re: [ruby-cvs:22244] Ruby:r15007 (trunk): * enc/make_encdb.rb: added. search enc/*.c and make encoding database. — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
まつもと ゆきひろです
[#33076] Encoding.compatible? and dummy encodings — sheepman <sheepman@...>
こんにちは sheepman です。
成瀬です。
まつもと ゆきひろです
[#33078] NEW REPLICA ENCODINGS AND ENCODING ALIASES — "NARUSE, Yui" <naruse@...>
成瀬です。
[#33101] String#valid_encoding? shoud be strict? — Masayoshi Takahashi <maki@...>
高橋征義です。1.9のエンコーディングとString#valid_encoding?について。
[#33139] Bignum#* might invoke GC parallelly? — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#33156] default script encoding and -K option — sheepman <sheepman@...>
こんばんは sheepman です。
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#33164] default encoding for Marshal.load — "Shugo Maeda" <shugo@...>
前田です。
まつもと ゆきひろです
[#33185] コンパイルの問題 (r15218) — Martin Duerst <duerst@...>
r15128 当たりで (実はもう少し前から) コンパイルできなくなりました。
[#33218] Re: Ruby1.9String バイト列へのインデックス アクセス — "Hisanori Kiryu" <hkiryu@...>
> ちなみに、byte のではなく bytes の方が妥当だと思います。
[#33224] printf "%0x" — Tanaka Akira <akr@...>
printf の %0x に負の整数を与えると、値によって .. がついたり
[#33226] [PATCH] warnings of enc/trans/utf_16_32.c — Nobuyoshi Nakada <nobu@...>
なかだです。
[#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>,
なかだです。
In article <20080121065650.55F60E0662@mail.bc9.jp>,
なかだです。
まつもと ゆきひろです
[#33247] requests to transcode — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#33303] Time#strftimeのエンコーディング — rubikitch@...
るびきちです。
まつもと ゆきひろです
なかだです。
西山和広です。
[#33368] summary of script encoding — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
永井@知能.九工大です.
[#33387] HashからStructを作る — rubikitch@...
るびきちです。
まつもと ゆきひろです
From: Yukihiro Matsumoto <matz@ruby-lang.org>
まつもと ゆきひろです
From: Yukihiro Matsumoto <matz@ruby-lang.org>
まつもと ゆきひろです
From: Yukihiro Matsumoto <matz@ruby-lang.org>
まつもと ゆきひろです
[#33399] regexp match /.../n against to UTF-8 string — Tanaka Akira <akr@...>
以下のように、つけてもいない正規表現の n オプションに関して
[#33400] /#{}/e.encoding — Tanaka Akira <akr@...>
以下のように /#{}/e の encoding が US-ASCII になります。
[#33403] wrapped String#gsub — "Park Ji-In" <tisphie@...>
こんにちは、朴 芝印です。
[#33417] コンパイルの問題 — Martin Duerst <duerst@...>
現在 (r15264 で) コンパイル使用とすると、エラーになります:
At 16:28 08/01/27, you wrote:
[#33433] Win32OLE: set encoding to OLE string — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
成瀬です。
助田です。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
[#33452] enc/euc_kr.c (euckr_mbc_enc_len) euc_kr.c is also used by CP942 — "NARUSE, Yui" <naruse@...>
成瀬です。
まつもと ゆきひろです
成瀬です。
[#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
なかだです。
森田です。
なかだです。
森田です。
天野竜太郎と申します。
森田です。
天野です。
森田です。
天野です。
森田です。
天野です。
森田です。
天野です。
[#33488] 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
成瀬です。
永井@知能.九工大です.
成瀬です。
永井@知能.九工大です.
成瀬です。
In article <47A00E86.4010701@airemix.com>,
成瀬です。
In article <47A03C9D.2090008@airemix.com>,
In article <87hcgvu1ng.fsf@fsij.org>,
[#33521] nkf の CP932 — Martin Duerst <duerst@...>
成瀬さん、皆さん、こんにちは。
[#33548] block parameter of String#gsub — "NARUSE, Yui" <naruse@...>
成瀬です。
まつもと ゆきひろです
[ruby-dev:33308] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward.
なかだです。
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はできる。
中田 伸悦