summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-19 08:25:50 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-19 08:25:50 +0000
commit768380583a4a2527994fa33e78fdcfbeee20b6a8 (patch)
treee17a61055e26352f4e1aba0de3d7ef5f57080b40
parent363b0bddde815a459f04e1d167d56bd1f498275c (diff)
* string.c (rb_str_scan): String#scan should preserve last
successful match data. [ruby-dev:35106] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17426 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--string.c11
2 files changed, 12 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index ea83cb89c8..fb7d6ab70b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Jun 19 17:19:14 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * string.c (rb_str_scan): String#scan should preserve last
+ successful match data. [ruby-dev:35106]
+
Thu Jun 19 16:49:36 2008 NAKAMURA Usaku <usa@ruby-lang.org>
* missing/acosh.c (atanh): should set ERANGE to errno if parameter
diff --git a/string.c b/string.c
index d123207fd4..3949a6e33a 100644
--- a/string.c
+++ b/string.c
@@ -5689,7 +5689,7 @@ rb_str_scan(VALUE str, VALUE pat)
{
VALUE result;
long start = 0;
- VALUE match = Qnil;
+ long last = -1, prev = 0;
char *p = RSTRING_PTR(str); long len = RSTRING_LEN(str);
pat = get_pat(pat, 1);
@@ -5697,18 +5697,21 @@ rb_str_scan(VALUE str, VALUE pat)
VALUE ary = rb_ary_new();
while (!NIL_P(result = scan_once(str, pat, &start))) {
- match = rb_backref_get();
+ last = prev;
+ prev = start;
rb_ary_push(ary, result);
}
- rb_backref_set(match);
+ if (last >= 0) rb_reg_search(pat, str, last, 0);
return ary;
}
while (!NIL_P(result = scan_once(str, pat, &start))) {
+ last = prev;
+ prev = start;
rb_yield(result);
str_mod_check(str, p, len);
}
- rb_backref_set(match);
+ if (last >= 0) rb_reg_search(pat, str, last, 0);
return str;
}