diff --git a/lib/Support/StringRef.cpp b/lib/Support/StringRef.cpp index e577b954c55..ae2640b5b94 100644 --- a/lib/Support/StringRef.cpp +++ b/lib/Support/StringRef.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/StringRef.h" -#include using namespace llvm; @@ -52,21 +51,18 @@ unsigned StringRef::edit_distance(llvm::StringRef Other, size_type m = size(); size_type n = Other.size(); - unsigned SmallPrevious[32]; - unsigned SmallCurrent[32]; - - unsigned *previous = SmallPrevious; - unsigned *current = SmallCurrent; - if (n + 1 > 32) { - previous = new unsigned [n+1]; - current = new unsigned [n+1]; - } + const unsigned SmallBufferSize = 64; + unsigned SmallBuffer[SmallBufferSize]; + unsigned *Allocated = 0; + unsigned *previous = SmallBuffer; + if (2*(n + 1) > SmallBufferSize) + Allocated = previous = new unsigned [2*(n+1)]; + unsigned *current = previous + (n + 1); for (unsigned i = 0; i <= n; ++i) previous[i] = i; for (size_type y = 1; y <= m; ++y) { - std::memset(current, 0, (n + 1) * sizeof(unsigned)); current[0] = y; for (size_type x = 1; x <= n; ++x) { if (AllowReplacements) { @@ -85,10 +81,7 @@ unsigned StringRef::edit_distance(llvm::StringRef Other, } unsigned Result = previous[n]; - if (n + 1 > 32) { - delete [] previous; - delete [] current; - } + delete [] Allocated; return Result; }