Skip to content

Commit

Permalink
src: remove static variables from string_search
Browse files Browse the repository at this point in the history
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: ayojs/ayo#82
  • Loading branch information
addaleax committed May 9, 2018
1 parent 5bb5d61 commit d0f65aa
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 41 deletions.
1 change: 0 additions & 1 deletion node.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
11 changes: 0 additions & 11 deletions src/string_search.cc

This file was deleted.

38 changes: 9 additions & 29 deletions src/string_search.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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++) {
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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_;
Expand Down

0 comments on commit d0f65aa

Please sign in to comment.