From 495c054041f1483cdc813259d25f2ca65e5b64cc Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 19 Jun 2008 08:25:50 +0000 Subject: * string.c (rb_str_scan): String#scan should preserve last successful match data. [ruby-dev:35106] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@17426 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index d123207fd..3949a6e33 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; } -- cgit