src: remove static variables from string_search

These variables can as well be stack-allocated. This avoids
relying on global state that is not protected by mutexes.

Thanks to Stephen Belanger for reviewing this change in its original PR.

Refs: https://github.com/ayojs/ayo/pull/82

PR-URL: https://github.com/nodejs/node/pull/20541
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
Anna Henningsen 2018-05-05 16:19:59 +02:00
parent 60349bbe0d
commit 945da6d22d
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
3 changed files with 9 additions and 41 deletions

View File

@ -346,7 +346,6 @@
'src/spawn_sync.cc',
'src/string_bytes.cc',
'src/string_decoder.cc',
'src/string_search.cc',
'src/stream_base.cc',
'src/stream_pipe.cc',
'src/stream_wrap.cc',

View File

@ -1,11 +0,0 @@
#include "string_search.h"
namespace node {
namespace stringsearch {
int StringSearchBase::kBadCharShiftTable[kUC16AlphabetSize];
int StringSearchBase::kGoodSuffixShiftTable[kBMMaxShift + 1];
int StringSearchBase::kSuffixTable[kBMMaxShift + 1];
} // namespace stringsearch
} // namespace node

View File

@ -80,12 +80,12 @@ class StringSearchBase {
static const int kBMMinPatternLength = 8;
// Store for the BoyerMoore(Horspool) bad char shift table.
static int kBadCharShiftTable[kUC16AlphabetSize];
int bad_char_shift_table_[kUC16AlphabetSize];
// Store for the BoyerMoore good suffix shift table.
static int kGoodSuffixShiftTable[kBMMaxShift + 1];
int good_suffix_shift_table_[kBMMaxShift + 1];
// Table used temporarily while building the BoyerMoore good suffix
// shift table.
static int kSuffixTable[kBMMaxShift + 1];
int suffix_table_[kBMMaxShift + 1];
};
template <typename Char>
@ -152,26 +152,6 @@ class StringSearch : private StringSearchBase {
return bad_char_occurrence[equiv_class];
}
// Store for the BoyerMoore(Horspool) bad char shift table.
// Return a table covering the last kBMMaxShift+1 positions of
// pattern.
int* bad_char_table() { return kBadCharShiftTable; }
// Store for the BoyerMoore good suffix shift table.
int* good_suffix_shift_table() {
// Return biased pointer that maps the range [start_..pattern_.length()
// to the kGoodSuffixShiftTable array.
return kGoodSuffixShiftTable - start_;
}
// Table used temporarily while building the BoyerMoore good suffix
// shift table.
int* suffix_table() {
// Return biased pointer that maps the range [start_..pattern_.length()
// to the kSuffixTable array.
return kSuffixTable - start_;
}
// The pattern to search for.
Vector pattern_;
// Pointer to implementation of the search.
@ -345,8 +325,8 @@ size_t StringSearch<Char>::BoyerMooreSearch(
// Only preprocess at most kBMMaxShift last characters of pattern.
size_t start = start_;
int* bad_char_occurrence = bad_char_table();
int* good_suffix_shift = good_suffix_shift_table();
int* bad_char_occurrence = bad_char_shift_table_;
int* good_suffix_shift = good_suffix_shift_table_ - start_;
Char last_char = pattern_[pattern_length - 1];
size_t index = start_index;
@ -397,8 +377,8 @@ void StringSearch<Char>::PopulateBoyerMooreTable() {
// Biased tables so that we can use pattern indices as table indices,
// even if we only cover the part of the pattern from offset start.
int* shift_table = good_suffix_shift_table();
int* suffix_table = this->suffix_table();
int* shift_table = good_suffix_shift_table_ - start_;
int* suffix_table = suffix_table_ - start_;
// Initialize table.
for (size_t i = start; i < pattern_length; i++) {
@ -462,7 +442,7 @@ size_t StringSearch<Char>::BoyerMooreHorspoolSearch(
size_t start_index) {
const size_t subject_length = subject.length();
const size_t pattern_length = pattern_.length();
int* char_occurrences = bad_char_table();
int* char_occurrences = bad_char_shift_table_;
int64_t badness = -pattern_length;
// How bad we are doing without a good-suffix table.
@ -511,7 +491,7 @@ template <typename Char>
void StringSearch<Char>::PopulateBoyerMooreHorspoolTable() {
const size_t pattern_length = pattern_.length();
int* bad_char_occurrence = bad_char_table();
int* bad_char_occurrence = bad_char_shift_table_;
// Only preprocess at most kBMMaxShift last characters of pattern.
const size_t start = start_;