From b31965cb43e8f6117435acf6f676cb9a4417afff Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 4 Sep 2013 02:13:42 +0000 Subject: string.c: fix for \K * string.c (str_gsub): use BEG(0) for whole matched position not return value from rb_reg_search(), for \K matching. [ruby-dev:47694] [Bug #8856] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42820 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ string.c | 2 +- test/ruby/test_regexp.rb | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index c9f5c7127a..ae6125fa9c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Sep 4 11:13:40 2013 Nobuyoshi Nakada + + * string.c (str_gsub): use BEG(0) for whole matched position not + return value from rb_reg_search(), for \K matching. + [ruby-dev:47694] [Bug #8856] + Wed Sep 4 11:11:37 2013 Nobuyoshi Nakada * configure.in (SOLIBS): LIBRUBY_SO also needs linking with gmp, to diff --git a/string.c b/string.c index 70cedf204b..4bc26df81e 100644 --- a/string.c +++ b/string.c @@ -4079,7 +4079,7 @@ str_gsub(int argc, VALUE *argv, VALUE str, int bang) if (OBJ_TAINTED(val)) tainted = 1; - len = beg - offset; /* copy pre-match substr */ + len = beg0 - offset; /* copy pre-match substr */ if (len) { rb_enc_str_buf_cat(dest, cp, len, str_enc); } diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb index 5982d23e1f..7937fe8867 100644 --- a/test/ruby/test_regexp.rb +++ b/test/ruby/test_regexp.rb @@ -500,6 +500,12 @@ class TestRegexp < Test::Unit::TestCase assert_equal('foo[\z]baz', "foobarbaz".sub!(/(b..)/, '[\z]')) end + def test_regsub_K + bug8856 = '[ruby-dev:47694] [Bug #8856]' + result = "foobarbazquux/foobarbazquux".gsub(/foo\Kbar/, "") + assert_equal('foobazquux/foobazquux', result, bug8856) + end + def test_KCODE assert_nil($KCODE) assert_nothing_raised { $KCODE = nil } -- cgit v1.2.3