5#ifndef V8_REGEXP_REGEXP_NODES_H_
6#define V8_REGEXP_REGEXP_NODES_H_
15class AlternativeGenerationList;
16class BoyerMooreLookahead;
19class QuickCheckDetails;
25#define FOR_EACH_NODE_TYPE(VISIT) \
30 VISIT(NegativeLookaroundChoice) \
31 VISIT(BackReference) \
35#define FORWARD_DECLARE(type) class type##Node;
53 return (
at_end == that->at_end) &&
106 if (other.eats_at_least_from_possibly_start <
109 other.eats_at_least_from_possibly_start;
165 Trace* trace,
bool preload_has_checked_bounds,
166 Label* on_possible_success,
168 bool fall_through_on_failure,
ChoiceNode* predecessor);
175 int characters_filled_in,
176 bool not_at_start) = 0;
186 int characters_filled_in,
261 return bm_info_[not_at_start ? 1 : 0];
264#define DECLARE_CAST(type) \
265 virtual type##Node* As##type##Node() { return nullptr; }
280 bm_info_[not_at_start ? 1 : 0] = bm;
352 int clear_capture_count,
353 int clear_capture_from,
365 bool not_at_start)
override;
379 return data_.u_submatch.success_node;
456 bool not_at_start)
override;
479 bool preloaded,
Trace* trace,
bool first_element_checked,
514 bool not_at_start)
override;
547 bool not_at_start)
override {
568 bool not_at_start)
override {
585 int clear_capture_count,
int clear_capture_start,
667 template <
typename...>
676 int preload_characters,
677 bool next_expects_preload);
702 AddAlternative(this_must_fail);
703 AddAlternative(then_do_this);
707 bool not_at_start)
override;
710 continue_node()->FillInBMInfo(isolate,
offset, budget - 1, bm,
712 if (
offset == 0) set_bm_info(not_at_start, bm);
714 static constexpr int kLookaroundIndex = 0;
715 static constexpr int kContinueIndex = 1;
717 return alternatives()->at(kLookaroundIndex).node();
720 return alternatives()->at(kContinueIndex).node();
740 int min_loop_iterations,
Zone* zone)
743 continue_node_(nullptr),
744 body_can_be_zero_length_(body_can_be_zero_length),
745 read_backward_(read_backward),
746 traversed_loop_initialization_node_(false),
747 min_loop_iterations_(min_loop_iterations) {}
753 bool not_at_start)
override;
756 int characters_filled_in,
757 bool not_at_start)
override;
803#define DECLARE_VISIT(Type) virtual void Visit##Type(Type##Node* that) = 0;
#define DECLARE_CAST(CamelName)
#define DECLARE_VISIT(type)
#define FORWARD_DECLARE(Name, Argc)
ActionNode * AsActionNode() override
static ActionNode * EmptyMatchCheck(int start_register, int repetition_register, int repetition_limit, RegExpNode *on_success)
int stack_pointer_register
static ActionNode * ModifyFlags(RegExpFlags flags, RegExpNode *on_success)
struct v8::internal::ActionNode::@137::@143 u_clear_captures
RegExpFlags flags() const
ActionNode(ActionType action_type, RegExpNode *on_success)
ActionType action_type() const
int current_position_register
void Accept(NodeVisitor *visitor) override
ActionNode * success_node
static ActionNode * StorePosition(int reg, bool is_capture, RegExpNode *on_success)
int GreedyLoopTextLength() override
ActionNode * success_node() const
static ActionNode * PositiveSubmatchSuccess(int stack_pointer_reg, int restore_reg, int clear_capture_count, int clear_capture_from, RegExpNode *on_success)
union v8::internal::ActionNode::@137 data_
static ActionNode * BeginNegativeSubmatch(int stack_pointer_reg, int position_reg, RegExpNode *on_success)
static ActionNode * SetRegisterForLoop(int reg, int val, RegExpNode *on_success)
struct v8::internal::ActionNode::@137::@140 u_position_register
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
struct v8::internal::ActionNode::@137::@144 u_modify_flags
@ POSITIVE_SUBMATCH_SUCCESS
@ BEGIN_POSITIVE_SUBMATCH
@ BEGIN_NEGATIVE_SUBMATCH
static ActionNode * IncrementRegister(int reg, RegExpNode *on_success)
struct v8::internal::ActionNode::@137::@138 u_store_register
void Emit(RegExpCompiler *compiler, Trace *trace) override
struct v8::internal::ActionNode::@137::@139 u_increment_register
void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int filled_in, bool not_at_start) override
static ActionNode * BeginPositiveSubmatch(int stack_pointer_reg, int position_reg, RegExpNode *body, ActionNode *success_node)
struct v8::internal::ActionNode::@137::@141 u_submatch
struct v8::internal::ActionNode::@137::@142 u_empty_match_check
static ActionNode * ClearCaptures(Interval range, RegExpNode *on_success)
AssertionNode * AsAssertionNode() override
AssertionNode(AssertionType t, RegExpNode *on_success)
AssertionType assertion_type()
void EmitBoundaryCheck(RegExpCompiler *compiler, Trace *trace)
static AssertionNode * AtStart(RegExpNode *on_success)
static AssertionNode * AtBoundary(RegExpNode *on_success)
AssertionType assertion_type_
static AssertionNode * AtEnd(RegExpNode *on_success)
void Accept(NodeVisitor *visitor) override
static AssertionNode * AtNonBoundary(RegExpNode *on_success)
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
void BacktrackIfPrevious(RegExpCompiler *compiler, Trace *trace, IfPrevious backtrack_if_previous)
void Emit(RegExpCompiler *compiler, Trace *trace) override
void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int filled_in, bool not_at_start) override
static AssertionNode * AfterNewline(RegExpNode *on_success)
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start) override
void Accept(NodeVisitor *visitor) override
void Emit(RegExpCompiler *compiler, Trace *trace) override
BackReferenceNode * AsBackReferenceNode() override
BackReferenceNode(int start_reg, int end_reg, bool read_backward, RegExpNode *on_success)
ChoiceNode(int expected_size, Zone *zone)
int EmitOptimizedUnanchoredSearch(RegExpCompiler *compiler, Trace *trace)
ZoneList< GuardedAlternative > * alternatives_
ChoiceNode * AsChoiceNode() override
void AddAlternative(GuardedAlternative node)
int GreedyLoopTextLengthForAlternative(GuardedAlternative *alternative)
ZoneList< GuardedAlternative > * alternatives()
int CalculatePreloadCharacters(RegExpCompiler *compiler, int eats_at_least)
Trace * EmitGreedyLoop(RegExpCompiler *compiler, Trace *trace, AlternativeGenerationList *alt_gens, PreloadState *preloads, GreedyLoopState *greedy_loop_state, int text_length)
void set_being_calculated(bool b)
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start) override
virtual bool read_backward()
virtual bool try_to_emit_quick_check_for_alternative(bool is_first)
void EmitChoices(RegExpCompiler *compiler, AlternativeGenerationList *alt_gens, int first_choice, Trace *trace, PreloadState *preloads)
void Accept(NodeVisitor *visitor) override
RegExpNode * FilterOneByte(int depth, RegExpCompiler *compiler) override
void EmitOutOfLineContinuation(RegExpCompiler *compiler, Trace *trace, GuardedAlternative alternative, AlternativeGeneration *alt_gen, int preload_characters, bool next_expects_preload)
void SetUpPreLoad(RegExpCompiler *compiler, Trace *current_trace, PreloadState *preloads)
void AssertGuardsMentionRegisters(Trace *trace)
void GenerateGuard(RegExpMacroAssembler *macro_assembler, Guard *guard, Trace *trace)
void Emit(RegExpCompiler *compiler, Trace *trace) override
EndNode * AsEndNode() override
void Accept(NodeVisitor *visitor) override
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
void Emit(RegExpCompiler *compiler, Trace *trace) override
EndNode(Action action, Zone *zone)
void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start) override
@ NEGATIVE_SUBMATCH_SUCCESS
Guard(int reg, Relation op, int value)
void AddGuard(Guard *guard, Zone *zone)
void set_node(RegExpNode *node)
GuardedAlternative(RegExpNode *node)
ZoneList< Guard * > * guards_
ZoneList< Guard * > * guards()
int min_loop_iterations() const
bool body_can_be_zero_length()
bool read_backward() override
friend class LoopInitializationMarker
bool traversed_loop_initialization_node_
RegExpNode * continue_node_
friend class IterationDecrementer
bool body_can_be_zero_length_
LoopChoiceNode * AsLoopChoiceNode() override
LoopChoiceNode(bool body_can_be_zero_length, bool read_backward, int min_loop_iterations, Zone *zone)
void AddAlternative(GuardedAlternative node)
void Accept(NodeVisitor *visitor) override
RegExpNode * continue_node()
RegExpNode * continue_node()
bool try_to_emit_quick_check_for_alternative(bool is_first) override
void Accept(NodeVisitor *visitor) override
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
RegExpNode * lookaround_node()
NegativeLookaroundChoiceNode * AsNegativeLookaroundChoiceNode() override
NegativeLookaroundChoiceNode(GuardedAlternative this_must_fail, GuardedAlternative then_do_this, Zone *zone)
void Emit(RegExpCompiler *compiler, Trace *trace) override
NegativeSubmatchSuccess(int stack_pointer_reg, int position_reg, int clear_capture_count, int clear_capture_start, Zone *zone)
int stack_pointer_register_
int current_position_register_
virtual ~NodeVisitor()=default
void set_bm_info(bool not_at_start, BoyerMooreLookahead *bm)
virtual EatsAtLeastInfo EatsAtLeastFromLoopEntry()
virtual void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual RegExpNode * GetSuccessorOfOmnivorousTextNode(RegExpCompiler *compiler)
BoyerMooreLookahead * bm_info(bool not_at_start)
BoyerMooreLookahead * bm_info_[2]
bool KeepRecursing(RegExpCompiler *compiler)
const EatsAtLeastInfo * eats_at_least_info() const
LimitResult LimitVersions(RegExpCompiler *compiler, Trace *trace)
void SaveBMInfo(BoyerMooreLookahead *bm, bool not_at_start, int offset)
uint32_t EatsAtLeast(bool not_at_start)
bool EmitQuickCheck(RegExpCompiler *compiler, Trace *bounds_check_trace, Trace *trace, bool preload_has_checked_bounds, Label *on_possible_success, QuickCheckDetails *details_return, bool fall_through_on_failure, ChoiceNode *predecessor)
void set_eats_at_least_info(const EatsAtLeastInfo &eats_at_least)
virtual SeqRegExpNode * AsSeqRegExpNode()
virtual int GreedyLoopTextLength()
EatsAtLeastInfo eats_at_least_
virtual RegExpNode * FilterOneByte(int depth, RegExpCompiler *compiler)
RegExpNode * replacement_
virtual void GetQuickCheckDetailsFromLoopEntry(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)=0
virtual void Accept(NodeVisitor *visitor)=0
static const int kRecursionBudget
static const int kNodeIsTooComplexForGreedyLoops
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)=0
static const int kMaxCopiesCodeGenerated
void set_on_work_list(bool value)
static const int kFirstCharBudget
RegExpNode * set_replacement(RegExpNode *replacement)
RegExpNode * replacement()
RegExpNode * FilterSuccessor(int depth, RegExpCompiler *compiler)
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
RegExpNode * on_success()
void set_on_success(RegExpNode *node)
SeqRegExpNode(RegExpNode *on_success)
RegExpNode * FilterOneByte(int depth, RegExpCompiler *compiler) override
SeqRegExpNode * AsSeqRegExpNode() override
static TextElement ClassRanges(RegExpClassRanges *class_ranges)
void Accept(NodeVisitor *visitor) override
static TextNode * CreateForSurrogatePair(Zone *zone, CharacterRange lead, ZoneList< CharacterRange > *trail_ranges, bool read_backward, RegExpNode *on_success)
@ NON_LETTER_CHARACTER_MATCH
static TextNode * CreateForCharacterRanges(Zone *zone, ZoneList< CharacterRange > *ranges, bool read_backward, RegExpNode *on_success)
RegExpNode * GetSuccessorOfOmnivorousTextNode(RegExpCompiler *compiler) override
ZoneList< TextElement > * elements()
void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start) override
int GreedyLoopTextLength() override
ZoneList< TextElement > * elms_
TextNode(RegExpClassRanges *that, bool read_backward, RegExpNode *on_success)
RegExpNode * FilterOneByte(int depth, RegExpCompiler *compiler) override
void Emit(RegExpCompiler *compiler, Trace *trace) override
void TextEmitPass(RegExpCompiler *compiler, TextEmitPassType pass, bool preloaded, Trace *trace, bool first_element_checked, int *checked_up_to)
TextNode * AsTextNode() override
void FillInBMInfo(Isolate *isolate, int offset, int budget, BoyerMooreLookahead *bm, bool not_at_start) override
TextNode(ZoneList< TextElement > *elms, bool read_backward, RegExpNode *on_success)
void MakeCaseIndependent(Isolate *isolate, bool is_one_byte, RegExpFlags flags)
#define FOR_EACH_NODE_TYPE(VISIT)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
EatsAtLeastInfo(uint8_t eats)
uint8_t eats_at_least_from_not_start
void SetMin(const EatsAtLeastInfo &other)
uint8_t eats_at_least_from_possibly_start
void AddFromFollowing(NodeInfo *that)
bool follows_start_interest
void ResetCompilationState()
void AddFromPreceding(NodeInfo *that)
bool follows_newline_interest
bool replacement_calculated
bool Matches(NodeInfo *that)
bool follows_word_interest