[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24425] Re: IO#read with 1 argument dumps core

From: nobu@...
Date: 2004-10-04 04:46:10 UTC
List: ruby-dev #24425
なかだです。

At Mon, 4 Oct 2004 12:22:44 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:24420]:
> あー、すでに手元では直してました。[ruby-dev:24411]も。コミッ
> トが遅れる時にはリプライしておいた方が良かったですね。

[ruby-dev:24412]だと、read中に例外で抜けたときにfreezeされたま
まになってしまうので、こうするのはどうでしょうか。


Index: string.c
===================================================================
RCS file: /cvs/ruby/src/ruby/string.c,v
retrieving revision 1.203
diff -U2 -p -d -r1.203 string.c
--- string.c	2 Oct 2004 11:30:39 -0000	1.203
+++ string.c	4 Oct 2004 04:38:01 -0000
@@ -232,5 +232,5 @@ rb_str_to_str(str)
 }
 
-static void
+void
 rb_str_shared_replace(str, str2)
     VALUE str, str2;
Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.293
diff -U2 -p -d -r1.293 io.c
--- io.c	1 Oct 2004 15:56:04 -0000	1.293
+++ io.c	4 Oct 2004 04:37:59 -0000
@@ -1172,5 +1172,5 @@ io_read(argc, argv, io)
     OpenFile *fptr;
     long n, len;
-    VALUE length, str;
+    VALUE length, str, buf;
 
     rb_scan_args(argc, argv, "02", &length, &str);
@@ -1195,11 +1195,10 @@ io_read(argc, argv, io)
 	rb_str_modify(str);
 	rb_str_resize(str,len);
-	FL_SET(str, FL_FREEZE);
     }
     if (len == 0) return str;
 
+    buf = rb_str_new4(str);
     READ_CHECK(fptr->f);
-    n = rb_io_fread(RSTRING(str)->ptr, len, fptr->f);
-    FL_UNSET(str, FL_FREEZE);
+    n = rb_io_fread(RSTRING(buf)->ptr, len, fptr->f);
     if (n == 0) {
 	rb_str_resize(str,0);
@@ -1208,7 +1207,8 @@ io_read(argc, argv, io)
 	if (len > 0) rb_sys_fail(fptr->path);
     }
-    RSTRING(str)->len = n;
-    RSTRING(str)->ptr[n] = '\0';
-    OBJ_TAINT(str);
+    RSTRING(buf)->len = n;
+    RSTRING(buf)->ptr[n] = '\0';
+    OBJ_TAINT(buf);
+    rb_str_shared_replace(str, buf);
 
     return str;


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

In This Thread