OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1772 } | 1772 } |
1773 return bad_char_occurrence[char_code]; | 1773 return bad_char_occurrence[char_code]; |
1774 } | 1774 } |
1775 return bad_char_occurrence[char_code % kBMAlphabetSize]; | 1775 return bad_char_occurrence[char_code % kBMAlphabetSize]; |
1776 } | 1776 } |
1777 | 1777 |
1778 // Restricted simplified Boyer-Moore string matching. | 1778 // Restricted simplified Boyer-Moore string matching. |
1779 // Uses only the bad-shift table of Boyer-Moore and only uses it | 1779 // Uses only the bad-shift table of Boyer-Moore and only uses it |
1780 // for the character compared to the last character of the needle. | 1780 // for the character compared to the last character of the needle. |
1781 template <typename schar, typename pchar> | 1781 template <typename schar, typename pchar> |
1782 static int BoyerMooreHorsepool(Vector<const schar> subject, | 1782 static int BoyerMooreHorspool(Vector<const schar> subject, |
1783 Vector<const pchar> pattern, | 1783 Vector<const pchar> pattern, |
1784 int start_index, | 1784 int start_index, |
1785 bool* complete) { | 1785 bool* complete) { |
1786 int n = subject.length(); | 1786 int n = subject.length(); |
1787 int m = pattern.length(); | 1787 int m = pattern.length(); |
1788 // Only preprocess at most kBMMaxShift last characters of pattern. | 1788 // Only preprocess at most kBMMaxShift last characters of pattern. |
1789 int start = m < kBMMaxShift ? 0 : m - kBMMaxShift; | 1789 int start = m < kBMMaxShift ? 0 : m - kBMMaxShift; |
1790 | 1790 |
1791 BoyerMoorePopulateBadCharTable(pattern, start); | 1791 BoyerMoorePopulateBadCharTable(pattern, start); |
1792 | 1792 |
1793 int badness = -m; // How bad we are doing without a good-suffix table. | 1793 int badness = -m; // How bad we are doing without a good-suffix table. |
1794 int idx; // No matches found prior to this index. | 1794 int idx; // No matches found prior to this index. |
1795 pchar last_char = pattern[m - 1]; | 1795 pchar last_char = pattern[m - 1]; |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1975 if (pat.length() < kBMMinPatternLength) { | 1975 if (pat.length() < kBMMinPatternLength) { |
1976 // We don't believe fancy searching can ever be more efficient. | 1976 // We don't believe fancy searching can ever be more efficient. |
1977 // The max shift of Boyer-Moore on a pattern of this length does | 1977 // The max shift of Boyer-Moore on a pattern of this length does |
1978 // not compensate for the overhead. | 1978 // not compensate for the overhead. |
1979 return SimpleIndexOf(sub, pat, start_index); | 1979 return SimpleIndexOf(sub, pat, start_index); |
1980 } | 1980 } |
1981 // Try algorithms in order of increasing setup cost and expected performance. | 1981 // Try algorithms in order of increasing setup cost and expected performance. |
1982 bool complete; | 1982 bool complete; |
1983 int idx = SimpleIndexOf(sub, pat, start_index, &complete); | 1983 int idx = SimpleIndexOf(sub, pat, start_index, &complete); |
1984 if (complete) return idx; | 1984 if (complete) return idx; |
1985 idx = BoyerMooreHorsepool(sub, pat, idx, &complete); | 1985 idx = BoyerMooreHorspool(sub, pat, idx, &complete); |
1986 if (complete) return idx; | 1986 if (complete) return idx; |
1987 return BoyerMooreIndexOf(sub, pat, idx); | 1987 return BoyerMooreIndexOf(sub, pat, idx); |
1988 } | 1988 } |
1989 | 1989 |
1990 // Perform string match of pattern on subject, starting at start index. | 1990 // Perform string match of pattern on subject, starting at start index. |
1991 // Caller must ensure that 0 <= start_index <= sub->length(), | 1991 // Caller must ensure that 0 <= start_index <= sub->length(), |
1992 // and should check that pat->length() + start_index <= sub->length() | 1992 // and should check that pat->length() + start_index <= sub->length() |
1993 int Runtime::StringMatch(Handle<String> sub, | 1993 int Runtime::StringMatch(Handle<String> sub, |
1994 Handle<String> pat, | 1994 Handle<String> pat, |
1995 int start_index) { | 1995 int start_index) { |
(...skipping 4644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6640 } else { | 6640 } else { |
6641 // Handle last resort GC and make sure to allow future allocations | 6641 // Handle last resort GC and make sure to allow future allocations |
6642 // to grow the heap without causing GCs (if possible). | 6642 // to grow the heap without causing GCs (if possible). |
6643 Counters::gc_last_resort_from_js.Increment(); | 6643 Counters::gc_last_resort_from_js.Increment(); |
6644 Heap::CollectAllGarbage(); | 6644 Heap::CollectAllGarbage(); |
6645 } | 6645 } |
6646 } | 6646 } |
6647 | 6647 |
6648 | 6648 |
6649 } } // namespace v8::internal | 6649 } } // namespace v8::internal |
OLD | NEW |