5#ifndef RUNTIME_VM_REGEXP_H_
6#define RUNTIME_VM_REGEXP_H_
18class RegExpMacroAssembler;
21class BoyerMooreLookahead;
35 bool add_unicode_case_equivalents);
53 bool Contains(int32_t
i)
const {
return from_ <=
i &&
i <= to_; }
54 int32_t
from()
const {
return from_; }
56 int32_t
to()
const {
return to_; }
87 DISALLOW_ALLOCATION();
94 OutSet() : first_(0), remaining_(nullptr), successors_(nullptr) {}
111 : first_(first), remaining_(remaining), successors_(nullptr) {}
113 ZoneGrowableArray<unsigned>* remaining_;
114 ZoneGrowableArray<OutSet*>* successors_;
126 Entry() : from_(0), to_(0), out_set_(nullptr) {}
131 int32_t
from() {
return from_; }
132 int32_t
to() {
return to_; }
165 template <
typename Callback>
173 OutSet* empty() {
return &empty_; }
175 ZoneSplayTree<Config>* tree() {
return &tree_; }
176 ZoneSplayTree<Config> tree_;
187 return lead_surrogates_;
190 return trail_surrogates_;
195 static constexpr int kBase = 0;
197 static constexpr int kBmpCodePoints = 1;
198 static constexpr int kLeadSurrogates = 2;
199 static constexpr int kTrailSurrogates = 3;
200 static constexpr int kNonBmpCodePoints = 4;
210#define FOR_EACH_NODE_TYPE(VISIT) \
214 VISIT(BackReference) \
218#define FOR_EACH_REG_EXP_TREE_TYPE(VISIT) \
222 VISIT(CharacterClass) \
227 VISIT(BackReference) \
231#define FORWARD_DECLARE(Name) class RegExp##Name;
233#undef FORWARD_DECLARE
268 DISALLOW_ALLOCATION();
273class GreedyLoopState;
274class AlternativeGenerationList;
342 : characters_(0), mask_(0), value_(0), cannot_match_(
false) {}
344 : characters_(
characters), mask_(0), value_(0), cannot_match_(
false) {}
349 void Advance(intptr_t by,
bool one_byte);
363 ASSERT(index < characters_);
364 return positions_ + index;
366 uint32_t
mask() {
return mask_; }
372 intptr_t characters_;
373 Position positions_[4];
381 DISALLOW_ALLOCATION();
388 bm_info_[0] = bm_info_[1] =
nullptr;
403 bool not_at_start) = 0;
408 Trace* bounds_check_trace,
410 bool preload_has_checked_bounds,
413 bool fall_through_on_failure);
420 intptr_t characters_filled_in,
421 bool not_at_start) = 0;
480 return bm_info_[not_at_start ? 1 : 0];
492 bm_info_[not_at_start ? 1 : 0] = bm;
496 static constexpr intptr_t kFirstCharBudget = 10;
504 intptr_t trace_count_;
516 if (that.from_ ==
kNone)
518 else if (from_ ==
kNone)
528 intptr_t
from()
const {
return from_; }
529 intptr_t
to()
const {
return to_; }
531 static constexpr intptr_t
kNone = -1;
537 DISALLOW_ALLOCATION();
582 intptr_t position_reg,
585 intptr_t restore_reg,
586 intptr_t clear_capture_count,
587 intptr_t clear_capture_from,
595 virtual intptr_t
EatsAtLeast(intptr_t still_to_find,
679 virtual intptr_t
EatsAtLeast(intptr_t still_to_find,
684 intptr_t characters_filled_in,
700 enum TextEmitPassType {
702 SIMPLE_CHARACTER_MATCH,
703 NON_LETTER_CHARACTER_MATCH,
704 CASE_CHARACTER_MATCH,
705 CHARACTER_CLASS_MATCH
707 static bool SkipPass(intptr_t pass,
bool ignore_case);
708 static constexpr intptr_t kFirstRealPass = SIMPLE_CHARACTER_MATCH;
709 static constexpr intptr_t kLastPass = CHARACTER_CLASS_MATCH;
710 void TextEmitPass(RegExpCompiler*
compiler,
711 TextEmitPassType pass,
714 bool first_element_checked,
715 intptr_t* checked_up_to);
717 ZoneGrowableArray<TextElement>* elms_;
747 virtual intptr_t
EatsAtLeast(intptr_t still_to_find,
762 enum IfPrevious { kIsNonWord, kIsWord };
763 void BacktrackIfPrevious(RegExpCompiler*
compiler,
765 IfPrevious backtrack_if_previous);
779 start_reg_(start_reg),
788 virtual intptr_t
EatsAtLeast(intptr_t still_to_find,
789 intptr_t recursion_depth,
793 intptr_t characters_filled_in,
817 intptr_t recursion_depth,
823 intptr_t characters_filled_in,
843 intptr_t position_reg,
844 intptr_t clear_capture_count,
845 intptr_t clear_capture_start,
848 stack_pointer_register_(stack_pointer_reg),
849 current_position_register_(position_reg),
850 clear_capture_count_(clear_capture_count),
851 clear_capture_start_(clear_capture_start) {}
855 intptr_t stack_pointer_register_;
856 intptr_t current_position_register_;
857 intptr_t clear_capture_count_;
858 intptr_t clear_capture_start_;
866 intptr_t
reg() {
return reg_; }
879 : node_(
node), guards_(nullptr) {}
889 DISALLOW_ALLOCATION();
892struct AlternativeGeneration;
900 not_at_start_(
false),
901 being_calculated_(
false) {}
908 virtual intptr_t
EatsAtLeast(intptr_t still_to_find,
917 intptr_t characters_filled_in,
945 intptr_t eats_at_least);
950 intptr_t preload_characters,
951 bool next_expects_preload);
953 Trace* current_trace,
955 void AssertGuardsMentionRegisters(
Trace* trace);
963 intptr_t text_length);
966 intptr_t first_choice,
972 bool being_calculated_;
984 virtual intptr_t
EatsAtLeast(intptr_t still_to_find,
989 intptr_t characters_filled_in,
995 (*alternatives_)[1].node()->FillInBMInfo(
offset, budget - 1, bm,
1016 loop_node_(nullptr),
1017 continue_node_(nullptr),
1023 virtual intptr_t
EatsAtLeast(intptr_t still_to_find,
1028 intptr_t characters_filled_in,
1051 bool body_can_be_zero_length_;
1052 bool read_backward_;
1092 const intptr_t* ranges,
1093 intptr_t ranges_size,
1110 bool&
at(intptr_t
i) {
return (*map_)[
i]; }
1125 intptr_t map_count_;
1141 return bitmaps_->At(map_number)->map_count();
1153 if (interval.
from() > max_char_)
return;
1155 if (interval.
to() > max_char_) {
1158 info->SetInterval(interval);
1162 void SetAll(intptr_t map_number) { bitmaps_->At(map_number)->SetAll(); }
1165 for (intptr_t
i = from_map;
i < length_;
i++)
1181 intptr_t GetSkipTable(intptr_t min_lookahead,
1182 intptr_t max_lookahead,
1184 bool FindWorthwhileInterval(intptr_t* from, intptr_t* to);
1185 intptr_t FindBestInterval(intptr_t max_number_of_chars,
1186 intptr_t old_biggest_points,
1214 intptr_t
reg() {
return reg_; }
1236 intptr_t cp_offset_;
1270 backtrack_(nullptr),
1271 stop_node_(nullptr),
1272 loop_label_(nullptr),
1273 characters_preloaded_(0),
1274 bound_checked_up_to_(0),
1296 return backtrack_ ==
nullptr && actions_ ==
nullptr && cp_offset_ == 0 &&
1297 characters_preloaded_ == 0 && bound_checked_up_to_ == 0 &&
1317 ASSERT(new_action->next_ ==
nullptr);
1318 new_action->next_ = actions_;
1319 actions_ = new_action;
1325 characters_preloaded_ =
count;
1330 quick_check_performed_ = *
d;
1336 intptr_t FindAffectedRegisters(
OutSet* affected_registers,
Zone* zone);
1338 intptr_t max_register,
1339 const OutSet& affected_registers,
1340 OutSet* registers_to_pop,
1341 OutSet* registers_to_clear,
1344 intptr_t max_register,
1345 const OutSet& registers_to_pop,
1346 const OutSet& registers_to_clear);
1347 intptr_t cp_offset_;
1348 DeferredAction* actions_;
1352 intptr_t characters_preloaded_;
1353 intptr_t bound_checked_up_to_;
1355 intptr_t flush_budget_;
1358 DISALLOW_ALLOCATION();
1370 Trace counter_backtrack_trace_;
1387#define DECLARE_VISIT(Type) virtual void Visit##Type(Type##Node* that) = 0;
1408 : is_one_byte_(is_one_byte), error_message_(nullptr) {}
1411#define DECLARE_VISIT(Type) virtual void Visit##Type(Type##Node* that);
1418 ASSERT(error_message_ !=
nullptr);
1419 return error_message_;
1425 const char* error_message_;
1427 DISALLOW_IMPLICIT_CONSTRUCTORS(
Analysis);
1453#
if !defined(DART_PRECOMPILED_RUNTIME)
1454 backtrack_goto(nullptr),
1455 graph_entry(nullptr),
1457 num_stack_locals(-1),
1465#
if !defined(DART_PRECOMPILED_RUNTIME)
1466 backtrack_goto(nullptr),
1467 graph_entry(nullptr),
1469 num_stack_locals(-1),
1475#if !defined(DART_PRECOMPILED_RUNTIME)
1478 intptr_t num_blocks,
1479 intptr_t num_stack_locals,
1482 backtrack_goto(backtrack_goto),
1483 graph_entry(graph_entry),
1484 num_blocks(num_blocks),
1485 num_stack_locals(num_stack_locals),
1500#if !defined(DART_PRECOMPILED_RUNTIME)
1524 intptr_t specialization_cid,
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
struct dart::ActionNode::@202::@208 u_clear_captures
struct dart::ActionNode::@202::@206 u_submatch
intptr_t clear_register_from
struct dart::ActionNode::@202::@204 u_increment_register
intptr_t clear_register_count
struct dart::ActionNode::@202::@203 u_store_register
static ActionNode * BeginSubmatch(intptr_t stack_pointer_reg, intptr_t position_reg, RegExpNode *on_success)
static ActionNode * EmptyMatchCheck(intptr_t start_register, intptr_t repetition_register, intptr_t repetition_limit, RegExpNode *on_success)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t filled_in, bool not_at_start)
struct dart::ActionNode::@202::@205 u_position_register
@ POSITIVE_SUBMATCH_SUCCESS
virtual intptr_t GreedyLoopTextLength()
intptr_t repetition_register
static ActionNode * SetRegister(intptr_t reg, intptr_t val, RegExpNode *on_success)
virtual void Accept(NodeVisitor *visitor)
static ActionNode * PositiveSubmatchSuccess(intptr_t stack_pointer_reg, intptr_t restore_reg, intptr_t clear_capture_count, intptr_t clear_capture_from, RegExpNode *on_success)
intptr_t repetition_limit
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget, bool not_at_start)
intptr_t stack_pointer_register
static ActionNode * IncrementRegister(intptr_t reg, RegExpNode *on_success)
static ActionNode * ClearCaptures(Interval range, RegExpNode *on_success)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
struct dart::ActionNode::@202::@207 u_empty_match_check
static ActionNode * StorePosition(intptr_t reg, bool is_capture, RegExpNode *on_success)
intptr_t current_position_register
void fail(const char *error_message)
void EnsureAnalyzed(RegExpNode *node)
const char * error_message()
virtual void VisitLoopChoice(LoopChoiceNode *that)
Analysis(bool is_one_byte)
static AssertionNode * AfterNewline(RegExpNode *on_success)
virtual void Accept(NodeVisitor *visitor)
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget, bool not_at_start)
static AssertionNode * AtNonBoundary(RegExpNode *on_success)
static AssertionNode * AtStart(RegExpNode *on_success)
static AssertionNode * AtEnd(RegExpNode *on_success)
static AssertionNode * AtBoundary(RegExpNode *on_success)
AssertionType assertion_type()
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t filled_in, bool not_at_start)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t characters_filled_in, bool not_at_start)
intptr_t start_register()
virtual void Accept(NodeVisitor *visitor)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
BackReferenceNode(intptr_t start_reg, intptr_t end_reg, RegExpFlags flags, bool read_backward, RegExpNode *on_success)
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t recursion_depth, bool not_at_start)
Convenience wrapper around a BlockEntryInstr pointer.
void SetAll(intptr_t map_number)
RegExpCompiler * compiler()
void SetInterval(intptr_t map_number, const Interval &interval)
void Set(intptr_t map_number, intptr_t character)
BoyerMooreLookahead(intptr_t length, RegExpCompiler *compiler, Zone *Zone)
intptr_t Count(intptr_t map_number)
void SetRest(intptr_t from_map)
void EmitSkipInstructions(RegExpMacroAssembler *masm)
BoyerMoorePositionInfo * at(intptr_t i)
void Set(intptr_t character)
static constexpr intptr_t kMapSize
BoyerMoorePositionInfo(Zone *zone)
intptr_t map_count() const
void SetInterval(const Interval &interval)
static constexpr intptr_t kMask
CharacterRange(int32_t from, int32_t to)
static constexpr intptr_t kPayloadMask
bool IsEverything(int32_t max) const
static bool IsCanonical(ZoneGrowableArray< CharacterRange > *ranges)
static void AddClassEscape(uint16_t type, ZoneGrowableArray< CharacterRange > *ranges)
static CharacterRange Range(int32_t from, int32_t to)
static CharacterRange Everything()
bool Contains(int32_t i) const
static CharacterRange Singleton(int32_t value)
static void Split(ZoneGrowableArray< CharacterRange > *base, GrowableArray< const intptr_t > overlay, ZoneGrowableArray< CharacterRange > **included, ZoneGrowableArray< CharacterRange > **excluded, Zone *zone)
static GrowableArray< const intptr_t > GetWordBounds()
void set_from(int32_t value)
static constexpr intptr_t kStartMarker
static void Canonicalize(ZoneGrowableArray< CharacterRange > *ranges)
void set_to(int32_t value)
static void AddCaseEquivalents(ZoneGrowableArray< CharacterRange > *ranges, bool is_one_byte, Zone *zone)
static void Negate(ZoneGrowableArray< CharacterRange > *src, ZoneGrowableArray< CharacterRange > *dst)
static ZoneGrowableArray< CharacterRange > * List(Zone *zone, CharacterRange range)
virtual bool try_to_emit_quick_check_for_alternative(bool is_first)
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget, bool not_at_start)
ChoiceNode(intptr_t expected_size, Zone *zone)
ZoneGrowableArray< GuardedAlternative > * alternatives_
virtual RegExpNode * FilterOneByte(intptr_t depth)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
intptr_t EatsAtLeastHelper(intptr_t still_to_find, intptr_t budget, RegExpNode *ignore_this_node, bool not_at_start)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t characters_filled_in, bool not_at_start)
void AddAlternative(GuardedAlternative node)
void set_being_calculated(bool b)
intptr_t GreedyLoopTextLengthForAlternative(const GuardedAlternative *alternative)
ZoneGrowableArray< GuardedAlternative > * alternatives()
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
virtual bool read_backward()
virtual void Accept(NodeVisitor *visitor)
static const Entry NoValue()
static int Compare(int32_t a, int32_t b)
static const int32_t kNoKey
void set_to(int32_t value)
Entry(int32_t from, int32_t to, OutSet *out_set)
void AddValue(int value, Zone *zone)
OutSet * Get(int32_t value)
void AddRange(CharacterRange range, int32_t value, Zone *zone)
void ForEach(Callback *callback)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t characters_filled_in, bool not_at_start)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t recursion_depth, bool not_at_start)
EndNode(Action action, Zone *zone)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
@ NEGATIVE_SUBMATCH_SUCCESS
virtual void Accept(NodeVisitor *visitor)
GreedyLoopState(bool not_at_start)
Trace * counter_backtrack_trace()
Guard(intptr_t reg, Relation op, intptr_t value)
RegExpNode * node() const
GuardedAlternative(RegExpNode *node)
void set_node(RegExpNode *node)
ZoneGrowableArray< Guard * > * guards() const
void AddGuard(Guard *guard, Zone *zone)
bool Contains(intptr_t value) const
Interval(intptr_t from, intptr_t to)
static constexpr intptr_t kNone
Interval Union(Interval that)
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget, bool not_at_start)
virtual void Accept(NodeVisitor *visitor)
void AddContinueAlternative(GuardedAlternative alt)
virtual bool read_backward()
bool body_can_be_zero_length()
RegExpNode * continue_node()
LoopChoiceNode(bool body_can_be_zero_length, bool read_backward, Zone *zone)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t characters_filled_in, bool not_at_start)
void AddLoopAlternative(GuardedAlternative alt)
virtual RegExpNode * FilterOneByte(intptr_t depth)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget, bool not_at_start)
virtual RegExpNode * FilterOneByte(intptr_t depth)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t characters_filled_in, bool not_at_start)
virtual bool try_to_emit_quick_check_for_alternative(bool is_first)
NegativeLookaroundChoiceNode(GuardedAlternative this_must_fail, GuardedAlternative then_do_this, Zone *zone)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
NegativeSubmatchSuccess(intptr_t stack_pointer_reg, intptr_t position_reg, intptr_t clear_capture_count, intptr_t clear_capture_start, Zone *zone)
virtual void VisitLoopChoice(LoopChoiceNode *that)
OutSet * Extend(unsigned value, Zone *zone)
bool Get(unsigned value) const
static constexpr unsigned kFirstLimit
Position * positions(intptr_t index)
void set_characters(intptr_t characters)
bool Rationalize(bool one_byte)
QuickCheckDetails(intptr_t characters)
void Advance(intptr_t by, bool one_byte)
void Merge(QuickCheckDetails *other, intptr_t from_index)
static void DotPrint(const char *label, RegExpNode *node, bool ignore_case)
static CompilationResult CompileBytecode(RegExpCompileData *data, const RegExp ®exp, bool is_one_byte, bool sticky, Zone *zone)
static CompilationResult CompileIR(RegExpCompileData *input, const ParsedFunction *parsed_function, const ZoneGrowableArray< const ICData * > &ic_data_array, intptr_t osr_id)
static RegExpPtr CreateRegExp(Thread *thread, const String &pattern, RegExpFlags flags)
static constexpr intptr_t kMaxCopiesCodeGenerated
virtual void Accept(NodeVisitor *visitor)=0
virtual void Emit(RegExpCompiler *compiler, Trace *trace)=0
void SaveBMInfo(BoyerMooreLookahead *bm, bool not_at_start, intptr_t offset)
RegExpNode * replacement_
static constexpr intptr_t kNodeIsTooComplexForGreedyLoops
virtual RegExpNode * FilterOneByte(intptr_t depth)
LimitResult LimitVersions(RegExpCompiler *compiler, Trace *trace)
virtual RegExpNode * GetSuccessorOfOmnivorousTextNode(RegExpCompiler *compiler)
bool EmitQuickCheck(RegExpCompiler *compiler, Trace *bounds_check_trace, Trace *trace, bool preload_has_checked_bounds, BlockLabel *on_possible_success, QuickCheckDetails *details_return, bool fall_through_on_failure)
void set_bm_info(bool not_at_start, BoyerMooreLookahead *bm)
BoyerMooreLookahead * bm_info(bool not_at_start)
RegExpNode * set_replacement(RegExpNode *replacement)
virtual intptr_t GreedyLoopTextLength()
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
static constexpr intptr_t kRecursionBudget
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget, bool not_at_start)=0
RegExpNode * replacement()
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t characters_filled_in, bool not_at_start)=0
RegExpNode * on_success()
SeqRegExpNode(RegExpNode *on_success)
void set_on_success(RegExpNode *node)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual RegExpNode * FilterOneByte(intptr_t depth)
RegExpNode * FilterSuccessor(intptr_t depth)
static TextElement CharClass(RegExpCharacterClass *char_class)
TextType text_type() const
RegExpCharacterClass * char_class() const
static TextElement Atom(RegExpAtom *atom)
intptr_t cp_offset() const
RegExpAtom * atom() const
RegExpTree * tree() const
void set_cp_offset(intptr_t cp_offset)
virtual void Accept(NodeVisitor *visitor)
virtual RegExpNode * FilterOneByte(intptr_t depth)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
virtual RegExpNode * GetSuccessorOfOmnivorousTextNode(RegExpCompiler *compiler)
TextNode(ZoneGrowableArray< TextElement > *elms, bool read_backward, RegExpNode *on_success)
virtual intptr_t GreedyLoopTextLength()
static TextNode * CreateForCharacterRanges(ZoneGrowableArray< CharacterRange > *ranges, bool read_backward, RegExpNode *on_success, RegExpFlags flags)
TextNode(RegExpCharacterClass *that, bool read_backward, RegExpNode *on_success)
virtual intptr_t EatsAtLeast(intptr_t still_to_find, intptr_t budget, bool not_at_start)
virtual void FillInBMInfo(intptr_t offset, intptr_t budget, BoyerMooreLookahead *bm, bool not_at_start)
ZoneGrowableArray< TextElement > * elements()
void MakeCaseIndependent(bool is_one_byte)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, intptr_t characters_filled_in, bool not_at_start)
static TextNode * CreateForSurrogatePair(CharacterRange lead, CharacterRange trail, bool read_backward, RegExpNode *on_success, RegExpFlags flags)
DeferredAction(ActionNode::ActionType action_type, intptr_t reg)
bool Mentions(intptr_t reg)
ActionNode::ActionType action_type()
DeferredCapture(intptr_t reg, bool is_capture, Trace *trace)
DeferredClearCaptures(Interval range)
DeferredIncrementRegister(intptr_t reg)
DeferredSetRegister(intptr_t reg, intptr_t value)
intptr_t characters_preloaded()
QuickCheckDetails * quick_check_performed()
bool GetStoredPosition(intptr_t reg, intptr_t *cp_offset)
void set_loop_label(BlockLabel *label)
void InvalidateCurrentCharacter()
void set_at_start(TriBool at_start)
void set_bound_checked_up_to(intptr_t to)
BlockLabel * loop_label()
void Flush(RegExpCompiler *compiler, RegExpNode *successor)
void set_characters_preloaded(intptr_t count)
bool mentions_reg(intptr_t reg)
void set_stop_node(RegExpNode *node)
intptr_t bound_checked_up_to()
void set_quick_check_performed(QuickCheckDetails *d)
DeferredAction * actions()
void add_action(DeferredAction *new_action)
void set_flush_budget(intptr_t to)
void AdvanceCurrentPositionInTrace(intptr_t by, RegExpCompiler *compiler)
void set_backtrack(BlockLabel *backtrack)
ZoneGrowableArray< CharacterRange > * lead_surrogates()
UnicodeRangeSplitter(Zone *zone, ZoneGrowableArray< CharacterRange > *base)
ZoneGrowableArray< CharacterRange > * trail_surrogates()
ZoneGrowableArray< CharacterRange > * non_bmp() const
ZoneGrowableArray< CharacterRange > * bmp()
void Call(uint32_t from, ChoiceTable::Entry entry)
static constexpr int32_t kMaxCodePoint
static constexpr T Maximum(T x, T y)
static T Minimum(T x, T y)
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
FlutterSemanticsFlag flags
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
static float max(float r, float g, float b)
ContainedInLattice AddRange(ContainedInLattice containment, const int32_t *ranges, intptr_t ranges_length, Interval new_range)
void CreateSpecializedFunction(Thread *thread, Zone *zone, const RegExp ®exp, intptr_t specialization_cid, bool sticky, const Object &owner)
ContainedInLattice Combine(ContainedInLattice a, ContainedInLattice b)
static int8_t data[kExtLength]
std::function< void(MTLRenderPipelineDescriptor *)> Callback
#define FOR_EACH_REG_EXP_TREE_TYPE(VISIT)
#define DECLARE_VISIT(Type)
#define FORWARD_DECLARE(Name)
#define FOR_EACH_NODE_TYPE(VISIT)
bool Matches(NodeInfo *that)
void AddFromFollowing(NodeInfo *that)
bool follows_word_interest
bool follows_newline_interest
void AddFromPreceding(NodeInfo *that)
bool replacement_calculated
void ResetCompilationState()
bool follows_start_interest
static constexpr intptr_t kEatsAtLeastNotYetInitialized
intptr_t preload_characters_
bool preload_has_checked_bounds_
bool determines_perfectly
const char * error_message
NOT_IN_PRECOMPILED(const intptr_t num_blocks)
CompilationResult(TypedData *bytecode, intptr_t num_registers)
NOT_IN_PRECOMPILED(IndirectGotoInstr *backtrack_goto)
CompilationResult(IndirectGotoInstr *backtrack_goto, GraphEntryInstr *graph_entry, intptr_t num_blocks, intptr_t num_stack_locals, intptr_t num_registers)
NOT_IN_PRECOMPILED(const intptr_t num_stack_locals)
NOT_IN_PRECOMPILED(GraphEntryInstr *graph_entry)
CompilationResult(const char *error_message)