[#1058] ruby 0.99.3-961119 available — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです.

19 messages 1996/11/19
[#1059] segm fault (Re ruby 0.99.3-961119 available) — sinara@... 1996/11/19

原です。

[ruby-list:1135] Re: [BUG]gsub (Re: ruby 0.99.3-961128)

From: matz@... (Yukihiro Matsumoto)
Date: 1996-11-28 08:03:45 UTC
List: ruby-list #1135
まつもと ゆきひろです.

In message "[ruby-list:1131] [BUG]gsub (Re: ruby 0.99.3-961128)"
    on 96/11/28, sinara@blade.nagaokaut.ac.jp <sinara@blade.nagaokaut.ac.jp> writes:
|
|原です。
|
|どうもよく現象が分からないのですが、つぎの関数に
|str = "と ゆ" を jis にしたもの
|を食わせると無限ループに入ります。

gsubのイテレータブロックの中でなんらかのマッチが発生すると変
数$~の値が書き換っちゃてダメということだったようです.

# また,明日もリリースか….ふう

いちおうパッチつけときます.前の比較演算子の書き換えも含んで
います.
                                まつもと ゆきひろ /:|)

--- string.c~	Thu Nov 28 00:04:37 1996
+++ string.c	Thu Nov 28 16:57:12 1996
@@ -268,3 +268,3 @@
 
-    if (len > 0) {
+    if (len >= 0) {
 	if (str->len < len || str->len - len > 1024) {
@@ -830,3 +830,3 @@
     VALUE val, result;
-    int beg, offset, n;
+    int beg, offset, n, null;
     struct re_registers *regs;
@@ -852,3 +852,3 @@
     result = str_new(0,0);
-    n = 0; offset=0;
+    n = 0; offset = 0;
     while ((beg=reg_search(pat, str, offset, 0)) >= 0) {
@@ -856,2 +856,3 @@
 
+	null = 0;
 	regs = RMATCH(backref_get())->regs;
@@ -859,8 +860,4 @@
 
-	val = rb_yield(reg_nth_match(0, backref_get()));
-	val = obj_as_string(val);
-	str_cat(result, RSTRING(val)->ptr, RSTRING(val)->len);
-
 	if (END(0) == offset) {
-	    str_cat(result, str->ptr+END(0), 1);
+	    null = 1;
 	    offset = END(0)+1;
@@ -871,2 +868,9 @@
 
+	val = rb_yield(reg_nth_match(0, backref_get()));
+	val = obj_as_string(val);
+	str_cat(result, RSTRING(val)->ptr, RSTRING(val)->len);
+	if (null) {
+	    str_cat(result, str->ptr+offset-1, 1);
+	}
+
 	if (once) break;
@@ -950,3 +954,3 @@
     if (rb_scan_args(argc, argv, "11", &pat, &val) == 1) {
-	v =  str_sub_iter_s(str_dup(str), pat, 0);
+	v =  str_sub_iter_s(str, pat, 0);
     }

In This Thread

Prev Next