28 #ifndef V8_JSREGEXP_H_
29 #define V8_JSREGEXP_H_
40 class RegExpMacroAssembler;
43 class BoyerMooreLookahead;
49 #ifdef V8_INTERPRETED_REGEXP
61 bool* has_pending_exception);
88 int capture_register_count);
117 int registers_per_match,
201 static String* last_ascii_string_;
202 static String* two_byte_cached_string_;
204 static bool CompileIrregexp(
207 static inline bool EnsureCompiledIrregexp(
214 static void SetSubjectCache(
String* subject,
217 int character_position,
223 static char* utf8_subject_cache_;
224 static int utf8_length_cache_;
225 static int utf8_position_;
226 static int character_position_;
303 bool Get(
unsigned value);
310 void Set(
unsigned value,
Zone* zone);
318 : first_(first), remaining_(remaining), successors_(
NULL) { }
320 ZoneList<unsigned>* remaining_;
321 ZoneList<OutSet*>* successors_;
336 : from_(from), to_(to), out_set_(out_set) { }
341 out_set_ = out_set_->
Extend(value, zone);
370 template <
typename Callback>
372 return tree()->ForEach(callback);
378 OutSet* empty() {
return &empty_; }
380 ZoneSplayTree<Config>* tree() {
return &tree_; }
381 ZoneSplayTree<Config> tree_;
385 #define FOR_EACH_NODE_TYPE(VISIT) \
389 VISIT(BackReference) \
394 #define FOR_EACH_REG_EXP_TREE_TYPE(VISIT) \
398 VISIT(CharacterClass) \
403 VISIT(BackReference) \
408 #define FORWARD_DECLARE(Name) class RegExp##Name;
410 #undef FORWARD_DECLARE
504 cannot_match_(
false) { }
506 : characters_(characters),
509 cannot_match_(
false) { }
514 void Advance(
int by,
bool ascii);
528 ASSERT(index < characters_);
529 return positions_ + index;
531 uint32_t
mask() {
return mask_; }
555 bm_info_[0] = bm_info_[1] =
NULL;
570 bool not_at_start) = 0;
576 bool preload_has_checked_bounds,
577 Label* on_possible_success,
579 bool fall_through_on_failure);
586 int characters_filled_in,
587 bool not_at_start) = 0;
645 return bm_info_[not_at_start ? 1 : 0];
657 bm_info_[not_at_start ? 1 : 0] = bm;
661 static const int kFirstCharBudget = 10;
682 if (that.from_ ==
kNone)
684 else if (from_ ==
kNone)
690 return (from_ <= value) && (value <= to_);
693 int from()
const {
return from_; }
694 int to()
const {
return to_; }
716 offset, recursion_depth + 1, budget - 1, bm, not_at_start);
750 int clear_capture_count,
751 int clear_capture_from,
767 details, compiler, filled_in, not_at_start);
834 int characters_filled_in,
850 enum TextEmitPassType {
852 SIMPLE_CHARACTER_MATCH,
853 NON_LETTER_CHARACTER_MATCH,
854 CASE_CHARACTER_MATCH,
855 CHARACTER_CLASS_MATCH
857 static bool SkipPass(
int pass,
bool ignore_case);
858 static const int kFirstRealPass = SIMPLE_CHARACTER_MATCH;
859 static const int kLastPass = CHARACTER_CLASS_MATCH;
860 void TextEmitPass(RegExpCompiler* compiler,
861 TextEmitPassType pass,
864 bool first_element_checked,
867 ZoneList<TextElement>* elms_;
914 enum IfPrevious { kIsNonWord, kIsWord };
915 void BacktrackIfPrevious(RegExpCompiler* compiler,
917 IfPrevious backtrack_if_previous);
930 start_reg_(start_reg),
931 end_reg_(end_reg) { }
941 int characters_filled_in,
966 bool not_at_start) {
return 0; }
969 int characters_filled_in,
992 int clear_capture_count,
993 int clear_capture_start,
996 stack_pointer_register_(stack_pointer_reg),
997 current_position_register_(position_reg),
998 clear_capture_count_(clear_capture_count),
999 clear_capture_start_(clear_capture_start) { }
1003 int stack_pointer_register_;
1004 int current_position_register_;
1005 int clear_capture_count_;
1006 int clear_capture_start_;
1042 class AlternativeGeneration;
1052 not_at_start_(
false),
1053 being_calculated_(
false) { }
1062 int recursion_depth,
1065 int recursion_depth,
1070 int characters_filled_in,
1073 int recursion_depth,
1095 int CalculatePreloadCharacters(
RegExpCompiler* compiler,
int eats_at_least);
1100 int preload_characters,
1101 bool next_expects_preload);
1106 bool being_calculated_;
1120 int recursion_depth,
1124 int characters_filled_in,
1127 int recursion_depth,
1132 offset, recursion_depth + 1, budget - 1, bm, not_at_start);
1150 continue_node_(
NULL),
1151 body_can_be_zero_length_(body_can_be_zero_length) { }
1156 int recursion_depth,
1160 int characters_filled_in,
1163 int recursion_depth,
1183 bool body_can_be_zero_length_;
1228 Interval new_range);
1240 for (
int i = 0; i <
kMapSize; i++) {
1241 map_->
Add(
false, zone);
1245 bool&
at(
int i) {
return map_->
at(i); }
1252 void Set(
int character);
1277 return bitmaps_->at(map_number)->map_count();
1282 void Set(
int map_number,
int character) {
1283 if (character > max_char_)
return;
1285 info->
Set(character);
1289 if (interval.
from() > max_char_)
return;
1291 if (interval.
to() > max_char_) {
1299 bitmaps_->at(map_number)->SetAll();
1303 for (
int i = from_map; i < length_; i++)
SetAll(i);
1318 int GetSkipTable(
int min_lookahead,
1321 bool FindWorthwhileInterval(
int* from,
int* to);
1322 int FindBestInterval(
1323 int max_number_of_chars,
int old_biggest_points,
int* from,
int* to);
1349 : type_(type), reg_(reg), next_(
NULL) { }
1366 is_capture_(is_capture) { }
1407 characters_preloaded_(0),
1408 bound_checked_up_to_(0),
1430 return backtrack_ ==
NULL &&
1433 characters_preloaded_ == 0 &&
1434 bound_checked_up_to_ == 0 &&
1456 new_action->next_ = actions_;
1457 actions_ = new_action;
1466 quick_check_performed_ = *d;
1472 int FindAffectedRegisters(
OutSet* affected_registers,
Zone* zone);
1475 OutSet& affected_registers,
1476 OutSet* registers_to_pop,
1477 OutSet* registers_to_clear,
1481 OutSet& registers_to_pop,
1482 OutSet& registers_to_clear);
1484 DeferredAction* actions_;
1488 int characters_preloaded_;
1489 int bound_checked_up_to_;
1499 #define DECLARE_VISIT(Type) \
1500 virtual void Visit##Type(Type##Node* that) = 0;
1502 #undef DECLARE_VISIT
1526 #define DECLARE_VISIT(Type) \
1527 virtual void Visit##Type(Type##Node* that);
1529 #undef DECLARE_VISIT
1557 : ignore_case_(ignore_case),
1558 is_ascii_(is_ascii),
1559 error_message_(
NULL) { }
1562 #define DECLARE_VISIT(Type) \
1563 virtual void Visit##Type(Type##Node* that);
1565 #undef DECLARE_VISIT
1571 return error_message_;
1580 const char* error_message_;
1582 DISALLOW_IMPLICIT_CONSTRUCTORS(
Analysis);
1606 : error_message(error_message),
1624 bool is_ascii,
Zone* zone);
1633 : offsets_vector_length_(num_registers) {
1635 vector_ = NewArray<int>(offsets_vector_length_);
1637 vector_ = isolate->jsregexp_static_offsets_vector();
1647 inline int length() {
return offsets_vector_length_; }
1654 return reinterpret_cast<Address>(isolate->jsregexp_static_offsets_vector());
1658 int offsets_vector_length_;
1666 #endif // V8_JSREGEXP_H_
#define FORWARD_DECLARE(Name)
void SetInterval(const Interval &interval)
Analysis(bool ignore_case, bool is_ascii)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
#define FOR_EACH_REG_EXP_TREE_TYPE(VISIT)
int GreedyLoopTextLengthForAlternative(GuardedAlternative *alternative)
virtual void Accept(NodeVisitor *visitor)
int current_position_register
static Vector< const int > GetWordBounds()
virtual bool try_to_emit_quick_check_for_alternative(int i)
static AssertionNode * AtStart(RegExpNode *on_success)
void SetInterval(int map_number, const Interval &interval)
static ActionNode * SetRegister(int reg, int val, RegExpNode *on_success)
static Code * IrregexpNativeCode(FixedArray *re, bool is_ascii)
void set(int index, Object *value)
RegExpNode * continue_node()
TextNode(RegExpCharacterClass *that, RegExpNode *on_success)
static const int kStaticOffsetsVectorSize
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
DeferredCapture(int reg, bool is_capture, Trace *trace)
static ActionNode * BeginSubmatch(int stack_pointer_reg, int position_reg, RegExpNode *on_success)
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
void set_characters(int characters)
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
virtual RegExpNode * GetSuccessorOfOmnivorousTextNode(RegExpCompiler *compiler)
static Smi * FromInt(int value)
void set_at_start(bool at_start)
static const int kLastCaptureCount
bool follows_word_interest
bool EmitQuickCheck(RegExpCompiler *compiler, Trace *trace, bool preload_has_checked_bounds, Label *on_possible_success, QuickCheckDetails *details_return, bool fall_through_on_failure)
void set_loop_label(Label *label)
static const int kJSRegexpStaticOffsetsVectorSize
static ActionNode * EmptyMatchCheck(int start_register, int repetition_register, int repetition_limit, RegExpNode *on_success)
Position * positions(int index)
virtual RegExpNode * GetSuccessorOfOmnivorousTextNode(RegExpCompiler *compiler)
bool replacement_calculated
OffsetsVector(int num_registers, Isolate *isolate)
LimitResult LimitVersions(RegExpCompiler *compiler, Trace *trace)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
static Handle< Object > CreateRegExpLiteral(Handle< JSFunction > constructor, Handle< String > pattern, Handle< String > flags, bool *has_pending_exception)
static TextElement CharClass(RegExpCharacterClass *char_class)
virtual RegExpNode * FilterASCII(int depth)
virtual int GreedyLoopTextLength()
void AddFromFollowing(NodeInfo *that)
static int IrregexpPrepare(Handle< JSRegExp > regexp, Handle< String > subject, Zone *zone)
static ActionNode * IncrementRegister(int reg, RegExpNode *on_success)
void AddRange(CharacterRange range, int value, Zone *zone)
static int IrregexpExecRaw(Handle< JSRegExp > regexp, Handle< String > subject, int index, Vector< int > registers, Zone *zone)
static int IrregexpNumberOfCaptures(FixedArray *re)
RegExpNode * replacement_
static void Canonicalize(ZoneList< CharacterRange > *ranges)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)
void EnsureAnalyzed(RegExpNode *node)
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
void set_flush_budget(int to)
CompilationResult(Object *code, int registers)
static CharacterRange Everything()
DispatchTableConstructor(DispatchTable *table, bool ignore_case, Zone *zone)
#define DECLARE_VISIT(Type)
virtual bool try_to_emit_quick_check_for_alternative(int i)
CharacterRange(void *null)
void AddValue(int value, Zone *zone)
static int GlobalOffsetsVectorSize(Handle< JSRegExp > regexp, int registers_per_match, int *max_matches)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
#define ASSERT(condition)
static ActionNode * StorePosition(int reg, bool is_capture, RegExpNode *on_success)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
void set_characters_preloaded(int count)
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
struct v8::internal::ActionNode::@6::@8 u_increment_register
void AdvanceCurrentPositionInTrace(int by, RegExpCompiler *compiler)
const char * error_message()
friend class ExternalReference
void BuildTable(ChoiceNode *node)
RegExpCompiler * compiler()
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
Interval(int from, int to)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)
bool EmitSkipInstructions(RegExpMacroAssembler *masm)
ZoneList< TextElement > * elements()
DeferredSetRegister(int reg, int value)
void set_type(AssertionNodeType type)
void SetAll(int map_number)
struct v8::internal::ActionNode::@6::@12 u_clear_captures
BoyerMoorePositionInfo * at(int i)
static void SetLastSubject(FixedArray *array, String *to)
static void Negate(ZoneList< CharacterRange > *src, ZoneList< CharacterRange > *dst, Zone *zone)
static const int kLastSubjectOffset
static Handle< Object > AtomExec(Handle< JSRegExp > regexp, Handle< String > subject, int index, Handle< JSArray > lastMatchInfo)
static Smi * cast(Object *object)
static const int kRegExpExecutableMemoryLimit
virtual void Emit(RegExpCompiler *compiler, Trace *trace)=0
static ActionNode * PositiveSubmatchSuccess(int stack_pointer_reg, int restore_reg, int clear_capture_count, int clear_capture_from, RegExpNode *on_success)
static void Split(ZoneList< CharacterRange > *base, Vector< const int > overlay, ZoneList< CharacterRange > **included, ZoneList< CharacterRange > **excluded, Zone *zone)
static const int kLastCaptureCountOffset
RegExpCharacterClass * u_char_class
bool follows_start_interest
RegExpNode * FilterSuccessor(int depth)
static void SetLastInput(FixedArray *array, String *to)
GuardedAlternative(RegExpNode *node)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
static const int kRegWxpCompiledLimit
void Advance(int by, bool ascii)
void Merge(QuickCheckDetails *other, int from_index)
struct v8::internal::ActionNode::@6::@11 u_empty_match_check
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
NegativeLookaheadChoiceNode(GuardedAlternative this_must_fail, GuardedAlternative then_do_this, Zone *zone)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
union v8::internal::TextElement::@5 data
static const unsigned kFirstLimit
void AddAlternative(GuardedAlternative node)
static const int kLastSubject
static void SetLastCaptureCount(FixedArray *array, int to)
void fail(const char *error_message)
static CharacterRange Range(uc16 from, uc16 to)
RegExpNode * replacement()
CharacterRange(uc16 from, uc16 to)
Interval Union(Interval that)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
void set_bound_checked_up_to(int to)
void set_backtrack(Label *backtrack)
virtual void Accept(NodeVisitor *visitor)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int filled_in, bool not_at_start)
ChoiceNode(int expected_size, Zone *zone)
virtual RegExpNode * FilterASCII(int depth)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)
struct v8::internal::ActionNode::@6::@10 u_submatch
static bool IsCanonical(ZoneList< CharacterRange > *ranges)
virtual void Accept(NodeVisitor *visitor)
QuickCheckDetails * quick_check_performed()
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)=0
void AddGuard(Guard *guard, Zone *zone)
static int GetCapture(FixedArray *array, int index)
static Handle< Object > IrregexpExec(Handle< JSRegExp > regexp, Handle< String > subject, int index, Handle< JSArray > lastMatchInfo, Zone *zone)
void set_bm_info(bool not_at_start, BoyerMooreLookahead *bm)
LoopChoiceNode(bool body_can_be_zero_length, Zone *zone)
void AddInverse(ZoneList< CharacterRange > *ranges)
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
virtual void VisitLoopChoice(LoopChoiceNode *that)
void AddCaseEquivalents(ZoneList< CharacterRange > *ranges, bool is_ascii, Zone *zone)
struct v8::internal::ActionNode::@6::@7 u_store_register
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
static void IrregexpInitialize(Handle< JSRegExp > re, Handle< String > pattern, JSRegExp::Flags flags, int capture_register_count)
static const int kFirstCapture
DeferredClearCaptures(Interval range)
Entry(uc16 from, uc16 to, OutSet *out_set)
virtual int EatsAtLeast(int still_to_find, int recursion_depth, bool not_at_start)
virtual RegExpNode * FilterASCII(int depth)
ContainedInLattice Combine(ContainedInLattice a, ContainedInLattice b)
static const int kMapSize
static Handle< Object > Exec(Handle< JSRegExp > regexp, Handle< String > subject, int index, Handle< JSArray > lastMatchInfo, Zone *zone)
bool determines_perfectly
EndNode(Action action, Zone *zone)
void add_action(DeferredAction *new_action)
static int Compare(uc16 a, uc16 b)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
int stack_pointer_register
static int GetLastCaptureCount(FixedArray *array)
virtual void Accept(NodeVisitor *visitor)
BoyerMooreLookahead(int length, RegExpCompiler *compiler, Zone *zone)
NegativeSubmatchSuccess(int stack_pointer_reg, int position_reg, int clear_capture_count, int clear_capture_start, Zone *zone)
void SaveBMInfo(BoyerMooreLookahead *bm, bool not_at_start, int offset)
static const int kLastInput
void AddRange(CharacterRange range)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
void set_being_calculated(bool b)
static void AtomCompile(Handle< JSRegExp > re, Handle< String > pattern, JSRegExp::Flags flags, Handle< String > match_pattern)
void ResetCompilationState()
int characters_preloaded()
DeferredAction * actions()
static const int kNodeIsTooComplexForGreedyLoops
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
DispatchTable * GetTable(bool ignore_case)
static int IrregexpMaxRegisterCount(FixedArray *re)
RegExpNode * on_success()
static void SetIrregexpMaxRegisterCount(FixedArray *re, int value)
BoyerMooreLookahead * bm_info(bool not_at_start)
static Handle< String > ToString(Handle< Object > value)
static const int kLastMatchOverhead
BoyerMoorePositionInfo(Zone *zone)
static const int kHeaderSize
void set_from(uc16 value)
int bound_checked_up_to()
virtual int GreedyLoopTextLength()
void AddContinueAlternative(GuardedAlternative alt)
Guard(int reg, Relation op, int value)
struct v8::internal::ActionNode::@6::@9 u_position_register
bool GetStoredPosition(int reg, int *cp_offset)
static AssertionNode * AfterNewline(RegExpNode *on_success)
static AssertionNode * AtNonBoundary(RegExpNode *on_success)
BackReferenceNode(int start_reg, int end_reg, RegExpNode *on_success)
virtual void VisitLoopChoice(LoopChoiceNode *that)
static bool UsesNativeRegExp()
static const int kMaxCopiesCodeGenerated
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)=0
static const int kFirstCaptureOffset
int Count(int map_number)
static const int kLastInputOffset
void MakeCaseIndependent(bool is_ascii)
virtual void Accept(NodeVisitor *visitor)
ZoneList< GuardedAlternative > * alternatives()
static const int kPayloadMask
virtual RegExpNode * FilterASCII(int depth)
void SetRest(int from_map)
static const int kStartMarker
#define ASSERT_EQ(v1, v2)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
void ForEach(Callback *callback)
OutSet * Extend(unsigned value, Zone *zone)
static void DotPrint(const char *label, RegExpNode *node, bool ignore_case)
ZoneList< GuardedAlternative > * alternatives_
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping true
ContainedInLattice AddRange(ContainedInLattice containment, const int *ranges, int ranges_length, Interval new_range)
virtual int GreedyLoopTextLength()
static ByteArray * IrregexpByteCode(FixedArray *re, bool is_ascii)
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
RegExpNode * set_replacement(RegExpNode *replacement)
static ActionNode * ClearCaptures(Interval range, RegExpNode *on_success)
void Set(int map_number, int character)
static int IrregexpNumberOfRegisters(FixedArray *re)
virtual RegExpNode * FilterASCII(int depth)
void Add(const T &element, AllocationPolicy allocator=AllocationPolicy())
bool Rationalize(bool ascii)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int characters_filled_in, bool not_at_start)
TextNode(ZoneList< TextElement > *elms, RegExpNode *on_success)
void AddLoopAlternative(GuardedAlternative alt)
CompilationResult(const char *error_message)
DeferredIncrementRegister(int reg)
void set_choice_index(int value)
SeqRegExpNode(RegExpNode *on_success)
DispatchTable(Zone *zone)
virtual void Accept(NodeVisitor *visitor)=0
int EatsAtLeastHelper(int still_to_find, int recursion_depth, RegExpNode *ignore_this_node, bool not_at_start)
static Handle< Object > Compile(Handle< JSRegExp > re, Handle< String > pattern, Handle< String > flags)
static TextElement Atom(RegExpAtom *atom)
ZoneList< Guard * > * guards()
const char * error_message
virtual void Accept(NodeVisitor *visitor)
static const int kFillInBMBudget
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
bool Matches(NodeInfo *that)
#define FOR_EACH_NODE_TYPE(VISIT)
void DeleteArray(T *array)
void set_on_success(RegExpNode *node)
bool body_can_be_zero_length()
virtual void Accept(NodeVisitor *visitor)
void Flush(RegExpCompiler *compiler, RegExpNode *successor)
int kUninitializedRegExpNodePlaceHolder
void set_quick_check_performed(QuickCheckDetails *d)
bool follows_newline_interest
DeferredAction(ActionNode::Type type, int reg)
void InvalidateCurrentCharacter()
bool IsEverything(uc16 max)
static const Entry NoValue()
static void AddClassEscape(uc16 type, ZoneList< CharacterRange > *ranges, Zone *zone)
static CharacterRange Singleton(uc16 value)
static AssertionNode * AtEnd(RegExpNode *on_success)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
virtual void GetQuickCheckDetails(QuickCheckDetails *details, RegExpCompiler *compiler, int filled_in, bool not_at_start)
QuickCheckDetails(int characters)
void AddFromPreceding(NodeInfo *that)
void set_stop_node(RegExpNode *node)
static CompilationResult Compile(RegExpCompileData *input, bool ignore_case, bool global, bool multiline, Handle< String > pattern, Handle< String > sample_subject, bool is_ascii, Zone *zone)
virtual RegExpNode * FilterASCII(int depth)
virtual void FillInBMInfo(int offset, int recursion_depth, int budget, BoyerMooreLookahead *bm, bool not_at_start)
static void SetCapture(FixedArray *array, int index, int to)
static AssertionNode * AtBoundary(RegExpNode *on_success)
bool mentions_reg(int reg)
void set_node(RegExpNode *node)