authorgravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-05-22 04:55:28-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-05-22 10:55:28+02:00
logf4101c1153980b887e9aa8850ac0a9dd88192140
tree0cd4c7586b1c1949f92e471525718fb4ae67c4db
parent4b69bd61e41f1a49bb0b00ac00a7e499ab7974a7
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

fix accidental quadratic dependence on haystack length in replace and replacementSize (#8859)


1 files changed, 2 insertions(+), 2 deletions(-)

lib/std/mem.zig+2-2
...@@ -2074,7 +2074,7 @@ pub fn replace(comptime T: type, input: []const T, needle: []const T, replacemen...@@ -2074,7 +2074,7 @@ pub fn replace(comptime T: type, input: []const T, needle: []const T, replacemen
2074 var slide: usize = 0;2074 var slide: usize = 0;
2075 var replacements: usize = 0;2075 var replacements: usize = 0;
2076 while (slide < input.len) {2076 while (slide < input.len) {
2077 if (mem.indexOf(T, input[slide..], needle) == @as(usize, 0)) {2077 if (mem.startsWith(T, input[slide..], needle)) {
2078 mem.copy(T, output[i .. i + replacement.len], replacement);2078 mem.copy(T, output[i .. i + replacement.len], replacement);
2079 i += replacement.len;2079 i += replacement.len;
2080 slide += needle.len;2080 slide += needle.len;
...@@ -2129,7 +2129,7 @@ pub fn replacementSize(comptime T: type, input: []const T, needle: []const T, re...@@ -2129,7 +2129,7 @@ pub fn replacementSize(comptime T: type, input: []const T, needle: []const T, re
2129 var i: usize = 0;2129 var i: usize = 0;
2130 var size: usize = input.len;2130 var size: usize = input.len;
2131 while (i < input.len) {2131 while (i < input.len) {
2132 if (mem.indexOf(T, input[i..], needle) == @as(usize, 0)) {2132 if (mem.startsWith(T, input[i..], needle)) {
2133 size = size - needle.len + replacement.len;2133 size = size - needle.len + replacement.len;
2134 i += needle.len;2134 i += needle.len;
2135 } else {2135 } else {