diff options
author | Ryan Harrison <rharrison@chromium.org> | 2018-09-11 19:19:32 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-09-11 19:19:32 +0000 |
commit | 5c86fd4c5110a99606316721786f1ba9bf0d855a (patch) | |
tree | 8494b7ff5d1ce649359c87b792605550487bfdf9 | |
parent | 7a45d5722c7e75bfd9c53b0a2ba1e42a2fcc9626 (diff) | |
download | pdfium-5c86fd4c5110a99606316721786f1ba9bf0d855a.tar.xz |
Small optimizations for CBC_HighLevelEncoder::lookAheadTestchromium/3550
Currently ClusterFuzz is timing out when running cases that cause a
large number of calls to this method. Looking at the cases, I believe
these to be valid calls, so this CL attempts to lower the cost of
making each individual call.
Adds in pre-allocation of a vector that has a fixed size and uses a
const-ref for passing in |msg| to avoid copying.
BUG=chromium:881678
Change-Id: I61ec4dc96e79c84def5b10102cc58a96773ce07f
Reviewed-on: https://pdfium-review.googlesource.com/42230
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
-rw-r--r-- | fxbarcode/datamatrix/BC_HighLevelEncoder.cpp | 18 | ||||
-rw-r--r-- | fxbarcode/datamatrix/BC_HighLevelEncoder.h | 2 |
2 files changed, 5 insertions, 15 deletions
diff --git a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp index 56a8847066..f143ac29d0 100644 --- a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp +++ b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp @@ -127,27 +127,17 @@ WideString CBC_HighLevelEncoder::encodeHighLevel(WideString msg, } return codewords; } -int32_t CBC_HighLevelEncoder::lookAheadTest(WideString msg, +int32_t CBC_HighLevelEncoder::lookAheadTest(const WideString& msg, int32_t startpos, int32_t currentMode) { if (startpos >= pdfium::base::checked_cast<int32_t>(msg.GetLength())) { return currentMode; } - std::vector<float> charCounts; + std::vector<float> charCounts(6); if (currentMode == ASCII_ENCODATION) { - charCounts.push_back(0); - charCounts.push_back(1); - charCounts.push_back(1); - charCounts.push_back(1); - charCounts.push_back(1); - charCounts.push_back(1.25f); + charCounts = {0, 1, 1, 1, 1, 1.25f}; } else { - charCounts.push_back(1); - charCounts.push_back(2); - charCounts.push_back(2); - charCounts.push_back(2); - charCounts.push_back(2); - charCounts.push_back(2.25f); + charCounts = {1, 2, 2, 2, 2, 2.25f}; charCounts[currentMode] = 0; } int32_t charsProcessed = 0; diff --git a/fxbarcode/datamatrix/BC_HighLevelEncoder.h b/fxbarcode/datamatrix/BC_HighLevelEncoder.h index 50cfc8c592..9ad0d705be 100644 --- a/fxbarcode/datamatrix/BC_HighLevelEncoder.h +++ b/fxbarcode/datamatrix/BC_HighLevelEncoder.h @@ -29,7 +29,7 @@ class CBC_HighLevelEncoder { WideString ecLevel, bool allowRectangular, int32_t& e); - static int32_t lookAheadTest(WideString msg, + static int32_t lookAheadTest(const WideString& msg, int32_t startpos, int32_t currentMode); static bool isDigit(wchar_t ch); |