Commit f9ed15d8 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #3496 from ksss/string-gsub

Avoid infinity loop when empty string pattern
parents 431f474b 7590482d
......@@ -54,17 +54,22 @@ class String
# ISO 15.2.10.5.18
def gsub(*args, &block)
if args.size == 2
s = ""
i = 0
while j = index(args[0], i)
seplen = args[0].length
k = j + seplen
pre = self[0, j]
post = self[k, length-k]
s += self[i, j-i] + args[1].__sub_replace(pre, args[0], post)
i = k
pattern, replace = *args
plen = pattern.length
replace = replace.to_str
offset = 0
result = []
while found = index(pattern, offset)
result << self[offset, found - offset]
offset = found + plen
result << replace.__sub_replace(self[0, found], pattern, self[offset..-1] || "")
if plen == 0
result << self[offset, 1]
offset += 1
end
end
s + self[i, length-i]
result << self[offset..-1] if offset < length
result.join
elsif args.size == 1 && block
split(args[0], -1).join(block.call(args[0]))
else
......
......@@ -366,6 +366,7 @@ assert('String#gsub', '15.2.10.5.18') do
assert_equal('A', 'a'.gsub('a', 'A'))
assert_equal('A', 'a'.gsub('a'){|w| w.capitalize })
assert_equal("<a><><>", 'a'.gsub('a', '<\0><\1><\2>'))
assert_equal(".h.e.l.l.o.", "hello".gsub("", "."))
end
assert('String#gsub with backslash') do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment