| Index: src/jsregexp.h
|
| diff --git a/src/jsregexp.h b/src/jsregexp.h
|
| index f2d6ee73f674e01c46903dbc58d6bccd84b14390..dfbb581ad650a82f7bd1f030aefdd4fafbd43963 100644
|
| --- a/src/jsregexp.h
|
| +++ b/src/jsregexp.h
|
| @@ -445,7 +445,9 @@ class TextElement FINAL BASE_EMBEDDED {
|
|
|
|
|
| class Trace;
|
| -
|
| +struct PreloadState;
|
| +class GreedyLoopState;
|
| +class AlternativeGenerationList;
|
|
|
| struct NodeInfo {
|
| NodeInfo()
|
| @@ -1076,7 +1078,9 @@ class ChoiceNode: public RegExpNode {
|
| bool not_at_start() { return not_at_start_; }
|
| void set_not_at_start() { not_at_start_ = true; }
|
| void set_being_calculated(bool b) { being_calculated_ = b; }
|
| - virtual bool try_to_emit_quick_check_for_alternative(int i) { return true; }
|
| + virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
|
| + return true;
|
| + }
|
| virtual RegExpNode* FilterASCII(int depth, bool ignore_case);
|
|
|
| protected:
|
| @@ -1096,6 +1100,23 @@ class ChoiceNode: public RegExpNode {
|
| AlternativeGeneration* alt_gen,
|
| int preload_characters,
|
| bool next_expects_preload);
|
| + void SetUpPreLoad(RegExpCompiler* compiler,
|
| + Trace* current_trace,
|
| + PreloadState* preloads);
|
| + void AssertGuardsMentionRegisters(Trace* trace);
|
| + int EmitOptimizedUnanchoredSearch(RegExpCompiler* compiler, Trace* trace);
|
| + Trace* EmitGreedyLoop(RegExpCompiler* compiler,
|
| + Trace* trace,
|
| + AlternativeGenerationList* alt_gens,
|
| + PreloadState* preloads,
|
| + GreedyLoopState* greedy_loop_state,
|
| + int text_length);
|
| + void EmitChoices(RegExpCompiler* compiler,
|
| + AlternativeGenerationList* alt_gens,
|
| + int first_choice,
|
| + Trace* trace,
|
| + bool is_greedy_loop,
|
| + PreloadState* preloads);
|
| DispatchTable* table_;
|
| // If true, this node is never checked at the start of the input.
|
| // Allows a new trace to start with at_start() set to false.
|
| @@ -1131,7 +1152,9 @@ class NegativeLookaheadChoiceNode: public ChoiceNode {
|
| // starts by loading enough characters for the alternative that takes fewest
|
| // characters, but on a negative lookahead the negative branch did not take
|
| // part in that calculation (EatsAtLeast) so the assumptions don't hold.
|
| - virtual bool try_to_emit_quick_check_for_alternative(int i) { return i != 0; }
|
| + virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
|
| + return !is_first;
|
| + }
|
| virtual RegExpNode* FilterASCII(int depth, bool ignore_case);
|
| };
|
|
|
| @@ -1142,7 +1165,8 @@ class LoopChoiceNode: public ChoiceNode {
|
| : ChoiceNode(2, zone),
|
| loop_node_(NULL),
|
| continue_node_(NULL),
|
| - body_can_be_zero_length_(body_can_be_zero_length) { }
|
| + body_can_be_zero_length_(body_can_be_zero_length)
|
| + { }
|
| void AddLoopAlternative(GuardedAlternative alt);
|
| void AddContinueAlternative(GuardedAlternative alt);
|
| virtual void Emit(RegExpCompiler* compiler, Trace* trace);
|
| @@ -1293,7 +1317,7 @@ class BoyerMooreLookahead : public ZoneObject {
|
| void SetRest(int from_map) {
|
| for (int i = from_map; i < length_; i++) SetAll(i);
|
| }
|
| - bool EmitSkipInstructions(RegExpMacroAssembler* masm);
|
| + void EmitSkipInstructions(RegExpMacroAssembler* masm);
|
|
|
| private:
|
| // This is the value obtained by EatsAtLeast. If we do not have at least this
|
| @@ -1486,6 +1510,31 @@ class Trace {
|
| };
|
|
|
|
|
| +class GreedyLoopState {
|
| + public:
|
| + explicit GreedyLoopState(bool not_at_start);
|
| +
|
| + Label* label() { return &label_; }
|
| + Trace* counter_backtrack_trace() { return &counter_backtrack_trace_; }
|
| +
|
| + private:
|
| + Label label_;
|
| + Trace counter_backtrack_trace_;
|
| +};
|
| +
|
| +
|
| +struct PreloadState {
|
| + static const int kEatsAtLeastNotYetInitialized = -1;
|
| + bool preload_is_current_;
|
| + bool preload_has_checked_bounds_;
|
| + int preload_characters_;
|
| + int eats_at_least_;
|
| + void init() {
|
| + eats_at_least_ = kEatsAtLeastNotYetInitialized;
|
| + }
|
| +};
|
| +
|
| +
|
| class NodeVisitor {
|
| public:
|
| virtual ~NodeVisitor() { }
|
|
|