Index: src/string-search.h |
=================================================================== |
--- src/string-search.h (revision 7267) |
+++ src/string-search.h (working copy) |
@@ -44,7 +44,7 @@ |
// limit, we can fix the size of tables. For a needle longer than this limit, |
// search will not be optimal, since we only build tables for a suffix |
// of the string, but it is a safe approximation. |
- static const int kBMMaxShift = 250; |
+ static const int kBMMaxShift = Isolate::kBMMaxShift; |
// Reduce alphabet to this size. |
// One of the tables used by Boyer-Moore and Boyer-Moore-Horspool has size |
@@ -54,7 +54,7 @@ |
// For needles using only characters in the same Unicode 256-code point page, |
// there is no search speed degradation. |
static const int kAsciiAlphabetSize = 128; |
- static const int kUC16AlphabetSize = 256; |
+ static const int kUC16AlphabetSize = Isolate::kUC16AlphabetSize; |
// Bad-char shift table stored in the state. It's length is the alphabet size. |
// For patterns below this length, the skip length of Boyer-Moore is too short |
@@ -69,25 +69,16 @@ |
return String::IsAscii(string.start(), string.length()); |
} |
- // The following tables are shared by all searches. |
- // TODO(lrn): Introduce a way for a pattern to keep its tables |
- // between searches (e.g., for an Atom RegExp). |
- |
- // Store for the BoyerMoore(Horspool) bad char shift table. |
- static int kBadCharShiftTable[kUC16AlphabetSize]; |
- // Store for the BoyerMoore good suffix shift table. |
- static int kGoodSuffixShiftTable[kBMMaxShift + 1]; |
- // Table used temporarily while building the BoyerMoore good suffix |
- // shift table. |
- static int kSuffixTable[kBMMaxShift + 1]; |
+ friend class Isolate; |
}; |
template <typename PatternChar, typename SubjectChar> |
class StringSearch : private StringSearchBase { |
public: |
- explicit StringSearch(Vector<const PatternChar> pattern) |
- : pattern_(pattern), |
+ StringSearch(Isolate* isolate, Vector<const PatternChar> pattern) |
+ : isolate_(isolate), |
+ pattern_(pattern), |
start_(Max(0, pattern.length() - kBMMaxShift)) { |
if (sizeof(PatternChar) > sizeof(SubjectChar)) { |
if (!IsAsciiString(pattern_)) { |
@@ -175,24 +166,33 @@ |
return bad_char_occurrence[equiv_class]; |
} |
+ // The following tables are shared by all searches. |
+ // TODO(lrn): Introduce a way for a pattern to keep its tables |
+ // between searches (e.g., for an Atom RegExp). |
+ |
+ // 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; |
+ return isolate_->bad_char_shift_table(); |
} |
+ // 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_; |
+ return isolate_->good_suffix_shift_table() - 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_; |
+ return isolate_->suffix_table() - start_; |
} |
+ Isolate* isolate_; |
// The pattern to search for. |
Vector<const PatternChar> pattern_; |
// Pointer to implementation of the search. |
@@ -555,10 +555,11 @@ |
// object should be constructed once and the Search function then called |
// for each search. |
template <typename SubjectChar, typename PatternChar> |
-static int SearchString(Vector<const SubjectChar> subject, |
+static int SearchString(Isolate* isolate, |
+ Vector<const SubjectChar> subject, |
Vector<const PatternChar> pattern, |
int start_index) { |
- StringSearch<PatternChar, SubjectChar> search(pattern); |
+ StringSearch<PatternChar, SubjectChar> search(isolate, pattern); |
return search.Search(subject, start_index); |
} |