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);
171 int current_match_index_;
172 int registers_per_match_;
175 int register_array_size_;
240 static bool CompileIrregexp(
242 static inline bool EnsureCompiledIrregexp(
320 bool Get(
unsigned value);
327 void Set(
unsigned value,
Zone* zone);
335 : first_(first), remaining_(remaining), successors_(
NULL) { }
337 ZoneList<unsigned>* remaining_;
338 ZoneList<OutSet*>* successors_;
353 : from_(from), to_(to), out_set_(out_set) { }
358 out_set_ = out_set_->
Extend(value, zone);
387 template <
typename Callback>
389 return tree()->ForEach(callback);
395 OutSet* empty() {
return &empty_; }
397 ZoneSplayTree<Config>* tree() {
return &tree_; }
398 ZoneSplayTree<Config> tree_;
402 #define FOR_EACH_NODE_TYPE(VISIT) \
406 VISIT(BackReference) \
411 #define FOR_EACH_REG_EXP_TREE_TYPE(VISIT) \
415 VISIT(CharacterClass) \
420 VISIT(BackReference) \
425 #define FORWARD_DECLARE(Name) class RegExp##Name;
427 #undef FORWARD_DECLARE
521 cannot_match_(
false) { }
523 : characters_(characters),
526 cannot_match_(
false) { }
531 void Advance(
int by,
bool ascii);
545 ASSERT(index < characters_);
546 return positions_ + index;
548 uint32_t
mask() {
return mask_; }
572 bm_info_[0] = bm_info_[1] =
NULL;
587 bool not_at_start) = 0;
593 bool preload_has_checked_bounds,
594 Label* on_possible_success,
596 bool fall_through_on_failure);
603 int characters_filled_in,
604 bool not_at_start) = 0;
662 return bm_info_[not_at_start ? 1 : 0];
674 bm_info_[not_at_start ? 1 : 0] = bm;
678 static const int kFirstCharBudget = 10;
699 if (that.from_ ==
kNone)
701 else if (from_ ==
kNone)
707 return (from_ <= value) && (value <= to_);
710 int from()
const {
return from_; }
711 int to()
const {
return to_; }
733 offset, recursion_depth + 1, budget - 1, bm, not_at_start);
767 int clear_capture_count,
768 int clear_capture_from,
784 details, compiler, filled_in, not_at_start);
851 int characters_filled_in,
867 enum TextEmitPassType {
869 SIMPLE_CHARACTER_MATCH,
870 NON_LETTER_CHARACTER_MATCH,
871 CASE_CHARACTER_MATCH,
872 CHARACTER_CLASS_MATCH
874 static bool SkipPass(
int pass,
bool ignore_case);
875 static const int kFirstRealPass = SIMPLE_CHARACTER_MATCH;
876 static const int kLastPass = CHARACTER_CLASS_MATCH;
877 void TextEmitPass(RegExpCompiler* compiler,
878 TextEmitPassType pass,
881 bool first_element_checked,
884 ZoneList<TextElement>* elms_;
931 enum IfPrevious { kIsNonWord, kIsWord };
932 void BacktrackIfPrevious(RegExpCompiler* compiler,
934 IfPrevious backtrack_if_previous);
947 start_reg_(start_reg),
948 end_reg_(end_reg) { }
958 int characters_filled_in,
983 bool not_at_start) {
return 0; }
986 int characters_filled_in,
1009 int clear_capture_count,
1010 int clear_capture_start,
1013 stack_pointer_register_(stack_pointer_reg),
1014 current_position_register_(position_reg),
1015 clear_capture_count_(clear_capture_count),
1016 clear_capture_start_(clear_capture_start) { }
1020 int stack_pointer_register_;
1021 int current_position_register_;
1022 int clear_capture_count_;
1023 int clear_capture_start_;
1059 class AlternativeGeneration;
1069 not_at_start_(
false),
1070 being_calculated_(
false) { }
1079 int recursion_depth,
1082 int recursion_depth,
1087 int characters_filled_in,
1090 int recursion_depth,
1112 int CalculatePreloadCharacters(
RegExpCompiler* compiler,
int eats_at_least);
1117 int preload_characters,
1118 bool next_expects_preload);
1123 bool being_calculated_;
1137 int recursion_depth,
1141 int characters_filled_in,
1144 int recursion_depth,
1149 offset, recursion_depth + 1, budget - 1, bm, not_at_start);
1167 continue_node_(
NULL),
1168 body_can_be_zero_length_(body_can_be_zero_length) { }
1173 int recursion_depth,
1177 int characters_filled_in,
1180 int recursion_depth,
1200 bool body_can_be_zero_length_;
1245 Interval new_range);
1257 for (
int i = 0; i <
kMapSize; i++) {
1258 map_->
Add(
false, zone);
1262 bool&
at(
int i) {
return map_->
at(i); }
1269 void Set(
int character);
1294 return bitmaps_->at(map_number)->map_count();
1299 void Set(
int map_number,
int character) {
1300 if (character > max_char_)
return;
1302 info->
Set(character);
1306 if (interval.
from() > max_char_)
return;
1308 if (interval.
to() > max_char_) {
1316 bitmaps_->at(map_number)->SetAll();
1320 for (
int i = from_map; i < length_; i++)
SetAll(i);
1335 int GetSkipTable(
int min_lookahead,
1338 bool FindWorthwhileInterval(
int* from,
int* to);
1339 int FindBestInterval(
1340 int max_number_of_chars,
int old_biggest_points,
int* from,
int* to);
1366 : type_(type), reg_(reg), next_(
NULL) { }
1383 is_capture_(is_capture) { }
1424 characters_preloaded_(0),
1425 bound_checked_up_to_(0),
1447 return backtrack_ ==
NULL &&
1450 characters_preloaded_ == 0 &&
1451 bound_checked_up_to_ == 0 &&
1473 new_action->next_ = actions_;
1474 actions_ = new_action;
1483 quick_check_performed_ = *d;
1489 int FindAffectedRegisters(
OutSet* affected_registers,
Zone* zone);
1492 OutSet& affected_registers,
1493 OutSet* registers_to_pop,
1494 OutSet* registers_to_clear,
1498 OutSet& registers_to_pop,
1499 OutSet& registers_to_clear);
1501 DeferredAction* actions_;
1505 int characters_preloaded_;
1506 int bound_checked_up_to_;
1516 #define DECLARE_VISIT(Type) \
1517 virtual void Visit##Type(Type##Node* that) = 0;
1519 #undef DECLARE_VISIT
1543 #define DECLARE_VISIT(Type) \
1544 virtual void Visit##Type(Type##Node* that);
1546 #undef DECLARE_VISIT
1574 : ignore_case_(ignore_case),
1575 is_ascii_(is_ascii),
1576 error_message_(
NULL) { }
1579 #define DECLARE_VISIT(Type) \
1580 virtual void Visit##Type(Type##Node* that);
1582 #undef DECLARE_VISIT
1588 return error_message_;
1597 const char* error_message_;
1599 DISALLOW_IMPLICIT_CONSTRUCTORS(
Analysis);
1623 : error_message(error_message),
1641 bool is_ascii,
Zone* zone);
1649 #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)
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)
struct v8::internal::ActionNode::@10::@12 u_increment_register
void set_at_start(bool at_start)
static const int kLastCaptureCount
GlobalCache(Handle< JSRegExp > regexp, Handle< String > subject, bool is_global, Isolate *isolate)
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 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
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 ActionNode * IncrementRegister(int reg, RegExpNode *on_success)
void AddRange(CharacterRange range, int value, 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)
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)
void AdvanceCurrentPositionInTrace(int by, RegExpCompiler *compiler)
const char * error_message()
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)
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)
struct v8::internal::ActionNode::@10::@14 u_submatch
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)
union v8::internal::TextElement::@9 data
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)
static int IrregexpPrepare(Handle< JSRegExp > regexp, Handle< String > subject)
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)
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)
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
static Handle< JSArray > SetLastMatchInfo(Handle< JSArray > last_match_info, Handle< String > subject, int capture_count, int32_t *match)
void AddGuard(Guard *guard, Zone *zone)
int32_t * LastSuccessfulMatch()
static int GetCapture(FixedArray *array, int index)
void set_bm_info(bool not_at_start, BoyerMooreLookahead *bm)
LoopChoiceNode(bool body_can_be_zero_length, Zone *zone)
void AddInverse(ZoneList< CharacterRange > *ranges)
struct v8::internal::ActionNode::@10::@13 u_position_register
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)
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
static Handle< Object > Compile(Handle< JSRegExp > re, Handle< String > pattern, Handle< String > flags, Zone *zone)
DeferredClearCaptures(Interval range)
struct v8::internal::ActionNode::@10::@15 u_empty_match_check
static Handle< Object > Exec(Handle< JSRegExp > regexp, Handle< String > subject, int index, Handle< JSArray > lastMatchInfo)
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)
static int IrregexpExecRaw(Handle< JSRegExp > regexp, Handle< String > subject, int index, int32_t *output, int output_size)
ContainedInLattice Combine(ContainedInLattice a, ContainedInLattice b)
static const int kMapSize
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()
activate correct semantics for inheriting readonliness false
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 int AtomExecRaw(Handle< JSRegExp > regexp, Handle< String > subject, int index, int32_t *output, int output_size)
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)
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)
void ForEach(Callback *callback)
OutSet * Extend(unsigned value, Zone *zone)
static void DotPrint(const char *label, RegExpNode *node, bool ignore_case)
ZoneList< GuardedAlternative > * alternatives_
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)
struct v8::internal::ActionNode::@10::@16 u_clear_captures
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)
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 use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra 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 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if NULL
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 TextElement Atom(RegExpAtom *atom)
ZoneList< Guard * > * guards()
const char * error_message
virtual void Accept(NodeVisitor *visitor)
static const int kFillInBMBudget
struct v8::internal::ActionNode::@10::@11 u_store_register
virtual void Emit(RegExpCompiler *compiler, Trace *trace)
static Handle< Object > IrregexpExec(Handle< JSRegExp > regexp, Handle< String > subject, int index, Handle< JSArray > lastMatchInfo)
bool Matches(NodeInfo *that)
#define FOR_EACH_NODE_TYPE(VISIT)
void set_on_success(RegExpNode *node)
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 use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra 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 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if expose natives in global object expose gc extension number of stack frames to capture disable builtin natives files print a stack trace if an assertion failure occurs use random jit cookie to mask large constants trace lazy optimization use adaptive optimizations prepare for turning on always opt minimum length for automatic enable preparsing maximum number of optimization attempts before giving up cache prototype transitions automatically set the debug break flag when debugger commands are in the queue always cause a debug break before aborting maximum length of function source code printed in a stack trace max size of the new max size of the old max size of executable always perform global GCs print one trace line following each garbage collection do not print trace line after scavenger collection print more details following each garbage collection print amount of external allocated memory after each time it is adjusted flush code that we expect not to use again before full gc do incremental marking steps track object counts and memory usage use caching Perform compaction on every full GC Never perform compaction on full GC testing only Compact code space on full incremental collections Default seed for initializing random allows verbose printing trace parsing and preparsing Check icache flushes in ARM and MIPS simulator Stack alingment in bytes in print stack trace when throwing exceptions randomize hashes to avoid predictable hash Fixed seed to use to hash property activate a timer that switches between V8 threads testing_bool_flag float flag Seed used for threading test randomness A filename with extra code to be included in the Print usage including flags
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)