Index: src/jsregexp.cc |
diff --git a/src/jsregexp.cc b/src/jsregexp.cc |
index d078d07d5e6af408bd42d48e1faab8bc77619379..8111a127eea3320e6272304b422450e2a35dab8a 100644 |
--- a/src/jsregexp.cc |
+++ b/src/jsregexp.cc |
@@ -1027,6 +1027,8 @@ class RegExpCompiler { |
inline bool ignore_case() { return ignore_case_; } |
inline bool one_byte() { return one_byte_; } |
+ inline bool optimize() { return optimize_; } |
+ inline void set_optimize(bool value) { optimize_ = value; } |
FrequencyCollator* frequency_collator() { return &frequency_collator_; } |
int current_expansion_factor() { return current_expansion_factor_; } |
@@ -1047,6 +1049,7 @@ class RegExpCompiler { |
bool ignore_case_; |
bool one_byte_; |
bool reg_exp_too_big_; |
+ bool optimize_; |
int current_expansion_factor_; |
FrequencyCollator frequency_collator_; |
Zone* zone_; |
@@ -1079,6 +1082,7 @@ RegExpCompiler::RegExpCompiler(int capture_count, bool ignore_case, |
ignore_case_(ignore_case), |
one_byte_(one_byte), |
reg_exp_too_big_(false), |
+ optimize_(FLAG_regexp_optimization), |
current_expansion_factor_(1), |
frequency_collator_(), |
zone_(zone) { |
@@ -1094,16 +1098,6 @@ RegExpEngine::CompilationResult RegExpCompiler::Assemble( |
Handle<String> pattern) { |
Heap* heap = pattern->GetHeap(); |
- bool use_slow_safe_regexp_compiler = false; |
- if (heap->total_regexp_code_generated() > |
- RegExpImpl::kRegWxpCompiledLimit && |
- heap->isolate()->memory_allocator()->SizeExecutable() > |
- RegExpImpl::kRegExpExecutableMemoryLimit) { |
- use_slow_safe_regexp_compiler = true; |
- } |
- |
- macro_assembler->set_slow_safe(use_slow_safe_regexp_compiler); |
- |
#ifdef DEBUG |
if (FLAG_trace_regexp_assembler) |
macro_assembler_ = new RegExpMacroAssemblerTracer(macro_assembler); |
@@ -2257,8 +2251,7 @@ RegExpNode::LimitResult RegExpNode::LimitVersions(RegExpCompiler* compiler, |
// We are being asked to make a non-generic version. Keep track of how many |
// non-generic versions we generate so as not to overdo it. |
trace_count_++; |
- if (FLAG_regexp_optimization && |
- trace_count_ < kMaxCopiesCodeGenerated && |
+ if (compiler->optimize() && trace_count_ < kMaxCopiesCodeGenerated && |
compiler->recursion_depth() <= RegExpCompiler::kMaxRecursion) { |
return CONTINUE; |
} |
@@ -4137,15 +4130,12 @@ void ChoiceNode::EmitChoices(RegExpCompiler* compiler, |
} |
alt_gen->expects_preload = preload->preload_is_current_; |
bool generate_full_check_inline = false; |
- if (FLAG_regexp_optimization && |
+ if (compiler->optimize() && |
try_to_emit_quick_check_for_alternative(i == 0) && |
- alternative.node()->EmitQuickCheck(compiler, |
- trace, |
- &new_trace, |
- preload->preload_has_checked_bounds_, |
- &alt_gen->possible_success, |
- &alt_gen->quick_check_details, |
- fall_through_on_failure)) { |
+ alternative.node()->EmitQuickCheck( |
+ compiler, trace, &new_trace, preload->preload_has_checked_bounds_, |
+ &alt_gen->possible_success, &alt_gen->quick_check_details, |
+ fall_through_on_failure)) { |
// Quick check was generated for this choice. |
preload->preload_is_current_ = true; |
preload->preload_has_checked_bounds_ = true; |
@@ -4943,7 +4933,7 @@ RegExpNode* RegExpQuantifier::ToNode(int min, |
if (body_can_be_empty) { |
body_start_reg = compiler->AllocateRegister(); |
- } else if (FLAG_regexp_optimization && !needs_capture_clearing) { |
+ } else if (compiler->optimize() && !needs_capture_clearing) { |
// Only unroll if there are no captures and the body can't be |
// empty. |
{ |
@@ -6041,6 +6031,8 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( |
} |
RegExpCompiler compiler(data->capture_count, ignore_case, is_one_byte, zone); |
+ compiler.set_optimize(!TooMuchRegExpCode(pattern)); |
+ |
// Sample some characters from the middle of the string. |
static const int kSampleSize = 128; |
@@ -6143,6 +6135,8 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( |
RegExpMacroAssemblerIrregexp macro_assembler(codes, zone); |
#endif // V8_INTERPRETED_REGEXP |
+ macro_assembler.set_slow_safe(TooMuchRegExpCode(pattern)); |
+ |
// Inserted here, instead of in Assembler, because it depends on information |
// in the AST that isn't replicated in the Node structure. |
static const int kMaxBacksearchLimit = 1024; |
@@ -6166,4 +6160,14 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( |
} |
+bool RegExpEngine::TooMuchRegExpCode(Handle<String> pattern) { |
+ Heap* heap = pattern->GetHeap(); |
+ bool too_much = pattern->length() > RegExpImpl::kRegExpTooLargeToOptimize; |
+ if (heap->total_regexp_code_generated() > RegExpImpl::kRegExpCompiledLimit && |
+ heap->isolate()->memory_allocator()->SizeExecutable() > |
+ RegExpImpl::kRegExpExecutableMemoryLimit) { |
+ too_much = true; |
+ } |
+ return too_much; |
+} |
}} // namespace v8::internal |