Chromium Code Reviews| Index: src/jsregexp.cc |
| diff --git a/src/jsregexp.cc b/src/jsregexp.cc |
| index f88511f4a1d266c89984c4b46aa25bd6be642af2..41e9d2175279384316ca11a1c2db378e7bb30725 100644 |
| --- a/src/jsregexp.cc |
| +++ b/src/jsregexp.cc |
| @@ -820,24 +820,24 @@ Handle<Object> RegExpImpl::IrregexpExec(Handle<JSRegExp> jsregexp, |
| // the event that code generation is requested for an identical trace. |
| -void RegExpTree::AppendToText(RegExpText* text) { |
| +void RegExpTree::AppendToText(RegExpText* text, Zone* zone) { |
| UNREACHABLE(); |
| } |
| -void RegExpAtom::AppendToText(RegExpText* text) { |
| - text->AddElement(TextElement::Atom(this)); |
| +void RegExpAtom::AppendToText(RegExpText* text, Zone* zone) { |
| + text->AddElement(TextElement::Atom(this), zone); |
| } |
| -void RegExpCharacterClass::AppendToText(RegExpText* text) { |
| - text->AddElement(TextElement::CharClass(this)); |
| +void RegExpCharacterClass::AppendToText(RegExpText* text, Zone* zone) { |
| + text->AddElement(TextElement::CharClass(this), zone); |
| } |
| -void RegExpText::AppendToText(RegExpText* text) { |
| +void RegExpText::AppendToText(RegExpText* text, Zone* zone) { |
| for (int i = 0; i < elements()->length(); i++) |
| - text->AddElement(elements()->at(i)); |
| + text->AddElement(elements()->at(i), zone); |
| } |
| @@ -868,8 +868,8 @@ int TextElement::length() { |
| DispatchTable* ChoiceNode::GetTable(bool ignore_case) { |
| if (table_ == NULL) { |
| - table_ = new DispatchTable(); |
| - DispatchTableConstructor cons(table_, ignore_case); |
| + table_ = new(zone()) DispatchTable(); |
| + DispatchTableConstructor cons(table_, ignore_case, zone()); |
| cons.BuildTable(this); |
| } |
| return table_; |
| @@ -966,7 +966,7 @@ class RegExpCompiler { |
| current_expansion_factor_ = value; |
| } |
| - Zone* zone() { return zone_; } |
| + Zone* zone() const { return zone_; } |
| static const int kNoRegister = -1; |
| @@ -1014,7 +1014,7 @@ RegExpCompiler::RegExpCompiler(int capture_count, bool ignore_case, bool ascii, |
| current_expansion_factor_(1), |
| frequency_collator_(), |
| zone_(zone) { |
| - accept_ = new EndNode(EndNode::ACCEPT, zone); |
| + accept_ = new(zone) EndNode(EndNode::ACCEPT, zone); |
| ASSERT(next_register_ - 1 <= RegExpMacroAssembler::kMaxRegister); |
| } |
| @@ -1110,7 +1110,8 @@ bool Trace::GetStoredPosition(int reg, int* cp_offset) { |
| } |
| -int Trace::FindAffectedRegisters(OutSet* affected_registers) { |
| +int Trace::FindAffectedRegisters(OutSet* affected_registers, |
| + Zone* zone) { |
| int max_register = RegExpCompiler::kNoRegister; |
| for (DeferredAction* action = actions_; |
| action != NULL; |
| @@ -1118,10 +1119,10 @@ int Trace::FindAffectedRegisters(OutSet* affected_registers) { |
| if (action->type() == ActionNode::CLEAR_CAPTURES) { |
| Interval range = static_cast<DeferredClearCaptures*>(action)->range(); |
| for (int i = range.from(); i <= range.to(); i++) |
| - affected_registers->Set(i); |
| + affected_registers->Set(i, zone); |
| if (range.to() > max_register) max_register = range.to(); |
| } else { |
| - affected_registers->Set(action->reg()); |
| + affected_registers->Set(action->reg(), zone); |
| if (action->reg() > max_register) max_register = action->reg(); |
| } |
| } |
| @@ -1150,7 +1151,8 @@ void Trace::PerformDeferredActions(RegExpMacroAssembler* assembler, |
| int max_register, |
| OutSet& affected_registers, |
| OutSet* registers_to_pop, |
| - OutSet* registers_to_clear) { |
| + OutSet* registers_to_clear, |
| + Zone* zone) { |
| // The "+1" is to avoid a push_limit of zero if stack_limit_slack() is 1. |
| const int push_limit = (assembler->stack_limit_slack() + 1) / 2; |
| @@ -1256,9 +1258,9 @@ void Trace::PerformDeferredActions(RegExpMacroAssembler* assembler, |
| } |
| assembler->PushRegister(reg, stack_check); |
| - registers_to_pop->Set(reg); |
| + registers_to_pop->Set(reg, zone); |
| } else if (undo_action == CLEAR) { |
| - registers_to_clear->Set(reg); |
| + registers_to_clear->Set(reg, zone); |
| } |
| // Perform the chronologically last action (or accumulated increment) |
| // for the register. |
| @@ -1304,14 +1306,16 @@ void Trace::Flush(RegExpCompiler* compiler, RegExpNode* successor) { |
| assembler->PushCurrentPosition(); |
| } |
| - int max_register = FindAffectedRegisters(&affected_registers); |
| + int max_register = FindAffectedRegisters(&affected_registers, |
| + compiler->zone()); |
| OutSet registers_to_pop; |
| OutSet registers_to_clear; |
| PerformDeferredActions(assembler, |
| max_register, |
| affected_registers, |
| ®isters_to_pop, |
| - ®isters_to_clear); |
| + ®isters_to_clear, |
| + compiler->zone()); |
| if (cp_offset_ != 0) { |
| assembler->AdvanceCurrentPosition(cp_offset_); |
| } |
| @@ -1388,17 +1392,18 @@ void EndNode::Emit(RegExpCompiler* compiler, Trace* trace) { |
| } |
| -void GuardedAlternative::AddGuard(Guard* guard) { |
| +void GuardedAlternative::AddGuard(Guard* guard, Zone* zone) { |
| if (guards_ == NULL) |
| - guards_ = new ZoneList<Guard*>(1); |
| - guards_->Add(guard); |
| + guards_ = new(zone) ZoneList<Guard*>(1, zone); |
| + guards_->Add(guard, zone); |
| } |
| ActionNode* ActionNode::SetRegister(int reg, |
| int val, |
| RegExpNode* on_success) { |
| - ActionNode* result = new ActionNode(SET_REGISTER, on_success); |
| + ActionNode* result = |
| + new(on_success->zone()) ActionNode(SET_REGISTER, on_success); |
| result->data_.u_store_register.reg = reg; |
| result->data_.u_store_register.value = val; |
| return result; |
| @@ -1406,7 +1411,8 @@ ActionNode* ActionNode::SetRegister(int reg, |
| ActionNode* ActionNode::IncrementRegister(int reg, RegExpNode* on_success) { |
| - ActionNode* result = new ActionNode(INCREMENT_REGISTER, on_success); |
| + ActionNode* result = |
| + new(on_success->zone()) ActionNode(INCREMENT_REGISTER, on_success); |
| result->data_.u_increment_register.reg = reg; |
| return result; |
| } |
| @@ -1415,7 +1421,8 @@ ActionNode* ActionNode::IncrementRegister(int reg, RegExpNode* on_success) { |
| ActionNode* ActionNode::StorePosition(int reg, |
| bool is_capture, |
| RegExpNode* on_success) { |
| - ActionNode* result = new ActionNode(STORE_POSITION, on_success); |
| + ActionNode* result = |
| + new(on_success->zone()) ActionNode(STORE_POSITION, on_success); |
| result->data_.u_position_register.reg = reg; |
| result->data_.u_position_register.is_capture = is_capture; |
| return result; |
| @@ -1424,7 +1431,8 @@ ActionNode* ActionNode::StorePosition(int reg, |
| ActionNode* ActionNode::ClearCaptures(Interval range, |
| RegExpNode* on_success) { |
| - ActionNode* result = new ActionNode(CLEAR_CAPTURES, on_success); |
| + ActionNode* result = |
| + new(on_success->zone()) ActionNode(CLEAR_CAPTURES, on_success); |
| result->data_.u_clear_captures.range_from = range.from(); |
| result->data_.u_clear_captures.range_to = range.to(); |
| return result; |
| @@ -1434,7 +1442,8 @@ ActionNode* ActionNode::ClearCaptures(Interval range, |
| ActionNode* ActionNode::BeginSubmatch(int stack_reg, |
| int position_reg, |
| RegExpNode* on_success) { |
| - ActionNode* result = new ActionNode(BEGIN_SUBMATCH, on_success); |
| + ActionNode* result = |
| + new(on_success->zone()) ActionNode(BEGIN_SUBMATCH, on_success); |
| result->data_.u_submatch.stack_pointer_register = stack_reg; |
| result->data_.u_submatch.current_position_register = position_reg; |
| return result; |
| @@ -1446,7 +1455,8 @@ ActionNode* ActionNode::PositiveSubmatchSuccess(int stack_reg, |
| int clear_register_count, |
| int clear_register_from, |
| RegExpNode* on_success) { |
| - ActionNode* result = new ActionNode(POSITIVE_SUBMATCH_SUCCESS, on_success); |
| + ActionNode* result = |
| + new(on_success->zone()) ActionNode(POSITIVE_SUBMATCH_SUCCESS, on_success); |
| result->data_.u_submatch.stack_pointer_register = stack_reg; |
| result->data_.u_submatch.current_position_register = position_reg; |
| result->data_.u_submatch.clear_register_count = clear_register_count; |
| @@ -1459,7 +1469,8 @@ ActionNode* ActionNode::EmptyMatchCheck(int start_register, |
| int repetition_register, |
| int repetition_limit, |
| RegExpNode* on_success) { |
| - ActionNode* result = new ActionNode(EMPTY_MATCH_CHECK, on_success); |
| + ActionNode* result = |
| + new(on_success->zone()) ActionNode(EMPTY_MATCH_CHECK, on_success); |
| result->data_.u_empty_match_check.start_register = start_register; |
| result->data_.u_empty_match_check.repetition_register = repetition_register; |
| result->data_.u_empty_match_check.repetition_limit = repetition_limit; |
| @@ -2039,8 +2050,9 @@ static void EmitCharClass(RegExpMacroAssembler* macro_assembler, |
| Label* on_failure, |
| int cp_offset, |
| bool check_offset, |
| - bool preloaded) { |
| - ZoneList<CharacterRange>* ranges = cc->ranges(); |
| + bool preloaded, |
| + Zone* zone) { |
| + ZoneList<CharacterRange>* ranges = cc->ranges(zone); |
| if (!CharacterRange::IsCanonical(ranges)) { |
| CharacterRange::Canonicalize(ranges); |
| } |
| @@ -2099,7 +2111,7 @@ static void EmitCharClass(RegExpMacroAssembler* macro_assembler, |
| macro_assembler->LoadCurrentCharacter(cp_offset, on_failure, check_offset); |
| } |
| - if (cc->is_standard() && |
| + if (cc->is_standard(zone) && |
| macro_assembler->CheckSpecialCharacterClass(cc->standard_type(), |
| on_failure)) { |
| return; |
| @@ -2112,7 +2124,8 @@ static void EmitCharClass(RegExpMacroAssembler* macro_assembler, |
| // entry at zero which goes to the failure label, but if there |
| // was already one there we fall through for success on that entry. |
| // Subsequent entries have alternating meaning (success/failure). |
| - ZoneList<int>* range_boundaries = new ZoneList<int>(last_valid_range); |
| + ZoneList<int>* range_boundaries = |
| + new(zone) ZoneList<int>(last_valid_range, zone); |
| bool zeroth_entry_is_failure = !cc->is_negated(); |
| @@ -2122,9 +2135,9 @@ static void EmitCharClass(RegExpMacroAssembler* macro_assembler, |
| ASSERT_EQ(i, 0); |
| zeroth_entry_is_failure = !zeroth_entry_is_failure; |
| } else { |
| - range_boundaries->Add(range.from()); |
| + range_boundaries->Add(range.from(), zone); |
| } |
| - range_boundaries->Add(range.to() + 1); |
| + range_boundaries->Add(range.to() + 1, zone); |
| } |
| int end_index = range_boundaries->length() - 1; |
| if (range_boundaries->at(end_index) > max_char) { |
| @@ -2522,7 +2535,7 @@ void TextNode::GetQuickCheckDetails(QuickCheckDetails* details, |
| QuickCheckDetails::Position* pos = |
| details->positions(characters_filled_in); |
| RegExpCharacterClass* tree = elm.data.u_char_class; |
| - ZoneList<CharacterRange>* ranges = tree->ranges(); |
| + ZoneList<CharacterRange>* ranges = tree->ranges(zone()); |
| if (tree->is_negated()) { |
| // A quick check uses multi-character mask and compare. There is no |
| // useful way to incorporate a negative char class into this scheme |
| @@ -2707,7 +2720,7 @@ RegExpNode* TextNode::FilterASCII(int depth) { |
| } else { |
| ASSERT(elm.type == TextElement::CHAR_CLASS); |
| RegExpCharacterClass* cc = elm.data.u_char_class; |
| - ZoneList<CharacterRange>* ranges = cc->ranges(); |
| + ZoneList<CharacterRange>* ranges = cc->ranges(zone()); |
| if (!CharacterRange::IsCanonical(ranges)) { |
| CharacterRange::Canonicalize(ranges); |
| } |
| @@ -2775,13 +2788,13 @@ RegExpNode* ChoiceNode::FilterASCII(int depth) { |
| // Only some of the nodes survived the filtering. We need to rebuild the |
| // alternatives list. |
| ZoneList<GuardedAlternative>* new_alternatives = |
| - new ZoneList<GuardedAlternative>(surviving); |
| + new(zone()) ZoneList<GuardedAlternative>(surviving, zone()); |
| for (int i = 0; i < choice_count; i++) { |
| RegExpNode* replacement = |
| alternatives_->at(i).node()->FilterASCII(depth - 1); |
| if (replacement != NULL) { |
| alternatives_->at(i).set_node(replacement); |
| - new_alternatives->Add(alternatives_->at(i)); |
| + new_alternatives->Add(alternatives_->at(i), zone()); |
| } |
| } |
| alternatives_ = new_alternatives; |
| @@ -2938,7 +2951,7 @@ void AssertionNode::EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace) { |
| EatsAtLeast(kMaxLookaheadForBoyerMoore, 0, not_at_start)); |
| if (eats_at_least >= 1) { |
| BoyerMooreLookahead* bm = |
| - new BoyerMooreLookahead(eats_at_least, compiler, zone()); |
| + new(zone()) BoyerMooreLookahead(eats_at_least, compiler, zone()); |
| FillInBMInfo(0, 0, kFillInBMBudget, bm, not_at_start); |
| if (bm->at(0)->is_non_word()) next_is_word_character = Trace::FALSE; |
| if (bm->at(0)->is_word()) next_is_word_character = Trace::TRUE; |
| @@ -3165,7 +3178,8 @@ void TextNode::TextEmitPass(RegExpCompiler* compiler, |
| backtrack, |
| cp_offset, |
| *checked_up_to < cp_offset, |
| - preloaded); |
| + preloaded, |
| + zone()); |
| UpdateBoundsCheck(cp_offset, checked_up_to); |
| } |
| } |
| @@ -3286,11 +3300,11 @@ void TextNode::MakeCaseIndependent(bool is_ascii) { |
| RegExpCharacterClass* cc = elm.data.u_char_class; |
| // None of the standard character classes is different in the case |
| // independent case and it slows us down if we don't know that. |
| - if (cc->is_standard()) continue; |
| - ZoneList<CharacterRange>* ranges = cc->ranges(); |
| + if (cc->is_standard(zone())) continue; |
| + ZoneList<CharacterRange>* ranges = cc->ranges(zone()); |
| int range_count = ranges->length(); |
| for (int j = 0; j < range_count; j++) { |
| - ranges->at(j).AddCaseEquivalents(ranges, is_ascii); |
| + ranges->at(j).AddCaseEquivalents(ranges, is_ascii, zone()); |
| } |
| } |
| } |
| @@ -3313,7 +3327,7 @@ RegExpNode* TextNode::GetSuccessorOfOmnivorousTextNode( |
| TextElement elm = elms_->at(0); |
| if (elm.type != TextElement::CHAR_CLASS) return NULL; |
| RegExpCharacterClass* node = elm.data.u_char_class; |
| - ZoneList<CharacterRange>* ranges = node->ranges(); |
| + ZoneList<CharacterRange>* ranges = node->ranges(zone()); |
| if (!CharacterRange::IsCanonical(ranges)) { |
| CharacterRange::Canonicalize(ranges); |
| } |
| @@ -3435,13 +3449,13 @@ class AlternativeGeneration: public Malloced { |
| // size then it is on the stack, otherwise the excess is on the heap. |
| class AlternativeGenerationList { |
| public: |
| - explicit AlternativeGenerationList(int count) |
| - : alt_gens_(count) { |
| + AlternativeGenerationList(int count, Zone* zone) |
| + : alt_gens_(count, zone) { |
| for (int i = 0; i < count && i < kAFew; i++) { |
| - alt_gens_.Add(a_few_alt_gens_ + i); |
| + alt_gens_.Add(a_few_alt_gens_ + i, zone); |
| } |
| for (int i = kAFew; i < count; i++) { |
| - alt_gens_.Add(new AlternativeGeneration()); |
| + alt_gens_.Add(new AlternativeGeneration(), zone); |
| } |
| } |
| ~AlternativeGenerationList() { |
| @@ -3527,9 +3541,9 @@ BoyerMooreLookahead::BoyerMooreLookahead( |
| } else { |
| max_char_ = String::kMaxUtf16CodeUnit; |
| } |
| - bitmaps_ = new ZoneList<BoyerMoorePositionInfo*>(length); |
| + bitmaps_ = new(zone) ZoneList<BoyerMoorePositionInfo*>(length, zone); |
| for (int i = 0; i < length; i++) { |
| - bitmaps_->Add(new BoyerMoorePositionInfo(zone)); |
| + bitmaps_->Add(new(zone) BoyerMoorePositionInfo(zone), zone); |
| } |
| } |
| @@ -3875,7 +3889,9 @@ void ChoiceNode::Emit(RegExpCompiler* compiler, Trace* trace) { |
| EatsAtLeast(kMaxLookaheadForBoyerMoore, 0, not_at_start)); |
| if (eats_at_least >= 1) { |
| BoyerMooreLookahead* bm = |
| - new BoyerMooreLookahead(eats_at_least, compiler, zone()); |
| + new(zone()) BoyerMooreLookahead(eats_at_least, |
| + compiler, |
| + zone()); |
| GuardedAlternative alt0 = alternatives_->at(0); |
| alt0.node()->FillInBMInfo(0, 0, kFillInBMBudget, bm, not_at_start); |
| skip_was_emitted = bm->EmitSkipInstructions(macro_assembler); |
| @@ -3897,7 +3913,7 @@ void ChoiceNode::Emit(RegExpCompiler* compiler, Trace* trace) { |
| (current_trace->characters_preloaded() == preload_characters); |
| bool preload_has_checked_bounds = preload_is_current; |
| - AlternativeGenerationList alt_gens(choice_count); |
| + AlternativeGenerationList alt_gens(choice_count, zone()); |
| // For now we just call all choices one after the other. The idea ultimately |
| // is to use the Dispatch table to try only the relevant ones. |
| @@ -4355,13 +4371,14 @@ void DotPrinter::PrintAttributes(RegExpNode* that) { |
| static const bool kPrintDispatchTable = false; |
| void DotPrinter::VisitChoice(ChoiceNode* that) { |
| if (kPrintDispatchTable) { |
| + ZoneAllocationPolicy allocator(that->zone()); |
|
danno
2012/06/05 13:42:35
Why do you need allocator?
sanjoy
2012/06/05 14:21:39
Not needed. Fixed.
|
| stream()->Add(" n%p [shape=Mrecord, label=\"", that); |
| TableEntryHeaderPrinter header_printer(stream()); |
| - that->GetTable(ignore_case_)->ForEach(&header_printer); |
| + that->GetTable(ignore_case_)->ForEach(&header_printer, that->zone()); |
| stream()->Add("\"]\n", that); |
| PrintAttributes(that); |
| TableEntryBodyPrinter body_printer(stream(), that); |
| - that->GetTable(ignore_case_)->ForEach(&body_printer); |
| + that->GetTable(ignore_case_)->ForEach(&body_printer, that->zone()); |
| } else { |
| stream()->Add(" n%p [shape=Mrecord, label=\"?\"];\n", that); |
| for (int i = 0; i < that->alternatives()->length(); i++) { |
| @@ -4377,6 +4394,7 @@ void DotPrinter::VisitChoice(ChoiceNode* that) { |
| void DotPrinter::VisitText(TextNode* that) { |
| + Zone* zone = that->zone(); |
| stream()->Add(" n%p [label=\"", that); |
| for (int i = 0; i < that->elements()->length(); i++) { |
| if (i > 0) stream()->Add(" "); |
| @@ -4391,8 +4409,8 @@ void DotPrinter::VisitText(TextNode* that) { |
| stream()->Add("["); |
| if (node->is_negated()) |
| stream()->Add("^"); |
| - for (int j = 0; j < node->ranges()->length(); j++) { |
| - CharacterRange range = node->ranges()->at(j); |
| + for (int j = 0; j < node->ranges(zone)->length(); j++) { |
| + CharacterRange range = node->ranges(zone)->at(j); |
| stream()->Add("%k-%k", range.from(), range.to()); |
| } |
| stream()->Add("]"); |
| @@ -4529,7 +4547,8 @@ void DispatchTable::Dump() { |
| HeapStringAllocator alloc; |
| StringStream stream(&alloc); |
| DispatchTableDumper dumper(&stream); |
| - tree()->ForEach(&dumper); |
| + Zone* zone = Isolate::Current()->zone(); |
| + tree()->ForEach(&dumper, ZoneAllocationPolicy(zone)); |
| OS::PrintError("%s", *stream.ToCString()); |
| } |
| @@ -4550,15 +4569,16 @@ void RegExpEngine::DotPrint(const char* label, |
| RegExpNode* RegExpAtom::ToNode(RegExpCompiler* compiler, |
| RegExpNode* on_success) { |
| - ZoneList<TextElement>* elms = new ZoneList<TextElement>(1); |
| - elms->Add(TextElement::Atom(this)); |
| - return new TextNode(elms, on_success); |
| + ZoneList<TextElement>* elms = |
| + new(compiler->zone()) ZoneList<TextElement>(1, compiler->zone()); |
| + elms->Add(TextElement::Atom(this), compiler->zone()); |
| + return new(compiler->zone()) TextNode(elms, on_success); |
| } |
| RegExpNode* RegExpText::ToNode(RegExpCompiler* compiler, |
| RegExpNode* on_success) { |
| - return new TextNode(elements(), on_success); |
| + return new(compiler->zone()) TextNode(elements(), on_success); |
| } |
| @@ -4612,7 +4632,7 @@ static bool CompareRanges(ZoneList<CharacterRange>* ranges, |
| } |
| -bool RegExpCharacterClass::is_standard() { |
| +bool RegExpCharacterClass::is_standard(Zone* zone) { |
| // TODO(lrn): Remove need for this function, by not throwing away information |
| // along the way. |
| if (is_negated_) { |
| @@ -4621,31 +4641,31 @@ bool RegExpCharacterClass::is_standard() { |
| if (set_.is_standard()) { |
| return true; |
| } |
| - if (CompareRanges(set_.ranges(), kSpaceRanges, kSpaceRangeCount)) { |
| + if (CompareRanges(set_.ranges(zone), kSpaceRanges, kSpaceRangeCount)) { |
| set_.set_standard_set_type('s'); |
| return true; |
| } |
| - if (CompareInverseRanges(set_.ranges(), kSpaceRanges, kSpaceRangeCount)) { |
| + if (CompareInverseRanges(set_.ranges(zone), kSpaceRanges, kSpaceRangeCount)) { |
| set_.set_standard_set_type('S'); |
| return true; |
| } |
| - if (CompareInverseRanges(set_.ranges(), |
| + if (CompareInverseRanges(set_.ranges(zone), |
| kLineTerminatorRanges, |
| kLineTerminatorRangeCount)) { |
| set_.set_standard_set_type('.'); |
| return true; |
| } |
| - if (CompareRanges(set_.ranges(), |
| + if (CompareRanges(set_.ranges(zone), |
| kLineTerminatorRanges, |
| kLineTerminatorRangeCount)) { |
| set_.set_standard_set_type('n'); |
| return true; |
| } |
| - if (CompareRanges(set_.ranges(), kWordRanges, kWordRangeCount)) { |
| + if (CompareRanges(set_.ranges(zone), kWordRanges, kWordRangeCount)) { |
| set_.set_standard_set_type('w'); |
| return true; |
| } |
| - if (CompareInverseRanges(set_.ranges(), kWordRanges, kWordRangeCount)) { |
| + if (CompareInverseRanges(set_.ranges(zone), kWordRanges, kWordRangeCount)) { |
| set_.set_standard_set_type('W'); |
| return true; |
| } |
| @@ -4655,7 +4675,7 @@ bool RegExpCharacterClass::is_standard() { |
| RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler, |
| RegExpNode* on_success) { |
| - return new TextNode(this, on_success); |
| + return new(compiler->zone()) TextNode(this, on_success); |
| } |
| @@ -4663,7 +4683,8 @@ RegExpNode* RegExpDisjunction::ToNode(RegExpCompiler* compiler, |
| RegExpNode* on_success) { |
| ZoneList<RegExpTree*>* alternatives = this->alternatives(); |
| int length = alternatives->length(); |
| - ChoiceNode* result = new ChoiceNode(length, compiler->zone()); |
| + ChoiceNode* result = |
| + new(compiler->zone()) ChoiceNode(length, compiler->zone()); |
| for (int i = 0; i < length; i++) { |
| GuardedAlternative alternative(alternatives->at(i)->ToNode(compiler, |
| on_success)); |
| @@ -4756,6 +4777,8 @@ RegExpNode* RegExpQuantifier::ToNode(int min, |
| int body_start_reg = RegExpCompiler::kNoRegister; |
| Interval capture_registers = body->CaptureRegisters(); |
| bool needs_capture_clearing = !capture_registers.is_empty(); |
| + Zone* zone = compiler->zone(); |
| + |
| if (body_can_be_empty) { |
| body_start_reg = compiler->AllocateRegister(); |
| } else if (FLAG_regexp_optimization && !needs_capture_clearing) { |
| @@ -4786,7 +4809,7 @@ RegExpNode* RegExpQuantifier::ToNode(int min, |
| // Unroll the optional matches up to max. |
| RegExpNode* answer = on_success; |
| for (int i = 0; i < max; i++) { |
| - ChoiceNode* alternation = new ChoiceNode(2, compiler->zone()); |
| + ChoiceNode* alternation = new(zone) ChoiceNode(2, zone); |
| if (is_greedy) { |
| alternation->AddAlternative( |
| GuardedAlternative(body->ToNode(compiler, answer))); |
| @@ -4809,8 +4832,8 @@ RegExpNode* RegExpQuantifier::ToNode(int min, |
| int reg_ctr = needs_counter |
| ? compiler->AllocateRegister() |
| : RegExpCompiler::kNoRegister; |
| - LoopChoiceNode* center = new LoopChoiceNode(body->min_match() == 0, |
| - compiler->zone()); |
| + LoopChoiceNode* center = new(zone) LoopChoiceNode(body->min_match() == 0, |
| + zone); |
| if (not_at_start) center->set_not_at_start(); |
| RegExpNode* loop_return = needs_counter |
| ? static_cast<RegExpNode*>(ActionNode::IncrementRegister(reg_ctr, center)) |
| @@ -4835,13 +4858,14 @@ RegExpNode* RegExpQuantifier::ToNode(int min, |
| } |
| GuardedAlternative body_alt(body_node); |
| if (has_max) { |
| - Guard* body_guard = new Guard(reg_ctr, Guard::LT, max); |
| - body_alt.AddGuard(body_guard); |
| + Guard* body_guard = |
| + new(zone) Guard(reg_ctr, Guard::LT, max); |
| + body_alt.AddGuard(body_guard, zone); |
| } |
| GuardedAlternative rest_alt(on_success); |
| if (has_min) { |
| - Guard* rest_guard = new Guard(reg_ctr, Guard::GEQ, min); |
| - rest_alt.AddGuard(rest_guard); |
| + Guard* rest_guard = new(compiler->zone()) Guard(reg_ctr, Guard::GEQ, min); |
| + rest_alt.AddGuard(rest_guard, zone); |
| } |
| if (is_greedy) { |
| center->AddLoopAlternative(body_alt); |
| @@ -4861,6 +4885,8 @@ RegExpNode* RegExpQuantifier::ToNode(int min, |
| RegExpNode* RegExpAssertion::ToNode(RegExpCompiler* compiler, |
| RegExpNode* on_success) { |
| NodeInfo info; |
| + Zone* zone = compiler->zone(); |
| + |
| switch (type()) { |
| case START_OF_LINE: |
| return AssertionNode::AfterNewline(on_success); |
| @@ -4879,13 +4905,13 @@ RegExpNode* RegExpAssertion::ToNode(RegExpCompiler* compiler, |
| int stack_pointer_register = compiler->AllocateRegister(); |
| int position_register = compiler->AllocateRegister(); |
| // The ChoiceNode to distinguish between a newline and end-of-input. |
| - ChoiceNode* result = new ChoiceNode(2, compiler->zone()); |
| + ChoiceNode* result = new(zone) ChoiceNode(2, zone); |
| // Create a newline atom. |
| ZoneList<CharacterRange>* newline_ranges = |
| - new ZoneList<CharacterRange>(3); |
| - CharacterRange::AddClassEscape('n', newline_ranges); |
| - RegExpCharacterClass* newline_atom = new RegExpCharacterClass('n'); |
| - TextNode* newline_matcher = new TextNode( |
| + new(zone) ZoneList<CharacterRange>(3, zone); |
| + CharacterRange::AddClassEscape('n', newline_ranges, zone); |
| + RegExpCharacterClass* newline_atom = new(zone) RegExpCharacterClass('n'); |
| + TextNode* newline_matcher = new(zone) TextNode( |
| newline_atom, |
| ActionNode::PositiveSubmatchSuccess(stack_pointer_register, |
| position_register, |
| @@ -4913,9 +4939,10 @@ RegExpNode* RegExpAssertion::ToNode(RegExpCompiler* compiler, |
| RegExpNode* RegExpBackReference::ToNode(RegExpCompiler* compiler, |
| RegExpNode* on_success) { |
| - return new BackReferenceNode(RegExpCapture::StartRegister(index()), |
| - RegExpCapture::EndRegister(index()), |
| - on_success); |
| + return new(compiler->zone()) |
| + BackReferenceNode(RegExpCapture::StartRegister(index()), |
| + RegExpCapture::EndRegister(index()), |
| + on_success); |
| } |
| @@ -4960,18 +4987,20 @@ RegExpNode* RegExpLookahead::ToNode(RegExpCompiler* compiler, |
| // for a negative lookahead. The NegativeLookaheadChoiceNode is a special |
| // ChoiceNode that knows to ignore the first exit when calculating quick |
| // checks. |
| + Zone* zone = compiler->zone(); |
| + |
| GuardedAlternative body_alt( |
| body()->ToNode( |
| compiler, |
| - success = new NegativeSubmatchSuccess(stack_pointer_register, |
| - position_register, |
| - register_count, |
| - register_start, |
| - compiler->zone()))); |
| + success = new(zone) NegativeSubmatchSuccess(stack_pointer_register, |
| + position_register, |
| + register_count, |
| + register_start, |
| + zone))); |
| ChoiceNode* choice_node = |
| - new NegativeLookaheadChoiceNode(body_alt, |
| - GuardedAlternative(on_success), |
| - compiler->zone()); |
| + new(zone) NegativeLookaheadChoiceNode(body_alt, |
| + GuardedAlternative(on_success), |
| + zone); |
| return ActionNode::BeginSubmatch(stack_pointer_register, |
| position_register, |
| choice_node); |
| @@ -5010,19 +5039,21 @@ RegExpNode* RegExpAlternative::ToNode(RegExpCompiler* compiler, |
| static void AddClass(const int* elmv, |
| int elmc, |
| - ZoneList<CharacterRange>* ranges) { |
| + ZoneList<CharacterRange>* ranges, |
| + Zone* zone) { |
| elmc--; |
| ASSERT(elmv[elmc] == 0x10000); |
| for (int i = 0; i < elmc; i += 2) { |
| ASSERT(elmv[i] < elmv[i + 1]); |
| - ranges->Add(CharacterRange(elmv[i], elmv[i + 1] - 1)); |
| + ranges->Add(CharacterRange(elmv[i], elmv[i + 1] - 1), zone); |
| } |
| } |
| static void AddClassNegated(const int *elmv, |
| int elmc, |
| - ZoneList<CharacterRange>* ranges) { |
| + ZoneList<CharacterRange>* ranges, |
| + Zone* zone) { |
| elmc--; |
| ASSERT(elmv[elmc] == 0x10000); |
| ASSERT(elmv[0] != 0x0000); |
| @@ -5031,51 +5062,54 @@ static void AddClassNegated(const int *elmv, |
| for (int i = 0; i < elmc; i += 2) { |
| ASSERT(last <= elmv[i] - 1); |
| ASSERT(elmv[i] < elmv[i + 1]); |
| - ranges->Add(CharacterRange(last, elmv[i] - 1)); |
| + ranges->Add(CharacterRange(last, elmv[i] - 1), zone); |
| last = elmv[i + 1]; |
| } |
| - ranges->Add(CharacterRange(last, String::kMaxUtf16CodeUnit)); |
| + ranges->Add(CharacterRange(last, String::kMaxUtf16CodeUnit), zone); |
| } |
| void CharacterRange::AddClassEscape(uc16 type, |
| - ZoneList<CharacterRange>* ranges) { |
| + ZoneList<CharacterRange>* ranges, |
| + Zone* zone) { |
| switch (type) { |
| case 's': |
| - AddClass(kSpaceRanges, kSpaceRangeCount, ranges); |
| + AddClass(kSpaceRanges, kSpaceRangeCount, ranges, zone); |
| break; |
| case 'S': |
| - AddClassNegated(kSpaceRanges, kSpaceRangeCount, ranges); |
| + AddClassNegated(kSpaceRanges, kSpaceRangeCount, ranges, zone); |
| break; |
| case 'w': |
| - AddClass(kWordRanges, kWordRangeCount, ranges); |
| + AddClass(kWordRanges, kWordRangeCount, ranges, zone); |
| break; |
| case 'W': |
| - AddClassNegated(kWordRanges, kWordRangeCount, ranges); |
| + AddClassNegated(kWordRanges, kWordRangeCount, ranges, zone); |
| break; |
| case 'd': |
| - AddClass(kDigitRanges, kDigitRangeCount, ranges); |
| + AddClass(kDigitRanges, kDigitRangeCount, ranges, zone); |
| break; |
| case 'D': |
| - AddClassNegated(kDigitRanges, kDigitRangeCount, ranges); |
| + AddClassNegated(kDigitRanges, kDigitRangeCount, ranges, zone); |
| break; |
| case '.': |
| AddClassNegated(kLineTerminatorRanges, |
| kLineTerminatorRangeCount, |
| - ranges); |
| + ranges, |
| + zone); |
| break; |
| // This is not a character range as defined by the spec but a |
| // convenient shorthand for a character class that matches any |
| // character. |
| case '*': |
| - ranges->Add(CharacterRange::Everything()); |
| + ranges->Add(CharacterRange::Everything(), zone); |
| break; |
| // This is the set of characters matched by the $ and ^ symbols |
| // in multiline mode. |
| case 'n': |
| AddClass(kLineTerminatorRanges, |
| kLineTerminatorRangeCount, |
| - ranges); |
| + ranges, |
| + zone); |
| break; |
| default: |
| UNREACHABLE(); |
| @@ -5091,9 +5125,11 @@ Vector<const int> CharacterRange::GetWordBounds() { |
| class CharacterRangeSplitter { |
| public: |
| CharacterRangeSplitter(ZoneList<CharacterRange>** included, |
| - ZoneList<CharacterRange>** excluded) |
| + ZoneList<CharacterRange>** excluded, |
| + Zone* zone) |
| : included_(included), |
| - excluded_(excluded) { } |
| + excluded_(excluded), |
| + zone_(zone) { } |
| void Call(uc16 from, DispatchTable::Entry entry); |
| static const int kInBase = 0; |
| @@ -5102,6 +5138,7 @@ class CharacterRangeSplitter { |
| private: |
| ZoneList<CharacterRange>** included_; |
| ZoneList<CharacterRange>** excluded_; |
| + Zone* zone_; |
| }; |
| @@ -5110,31 +5147,33 @@ void CharacterRangeSplitter::Call(uc16 from, DispatchTable::Entry entry) { |
| ZoneList<CharacterRange>** target = entry.out_set()->Get(kInOverlay) |
| ? included_ |
| : excluded_; |
| - if (*target == NULL) *target = new ZoneList<CharacterRange>(2); |
| - (*target)->Add(CharacterRange(entry.from(), entry.to())); |
| + if (*target == NULL) *target = new(zone_) ZoneList<CharacterRange>(2, zone_); |
| + (*target)->Add(CharacterRange(entry.from(), entry.to()), zone_); |
| } |
| void CharacterRange::Split(ZoneList<CharacterRange>* base, |
| Vector<const int> overlay, |
| ZoneList<CharacterRange>** included, |
| - ZoneList<CharacterRange>** excluded) { |
| + ZoneList<CharacterRange>** excluded, |
| + Zone* zone) { |
| ASSERT_EQ(NULL, *included); |
| ASSERT_EQ(NULL, *excluded); |
| DispatchTable table; |
| for (int i = 0; i < base->length(); i++) |
| - table.AddRange(base->at(i), CharacterRangeSplitter::kInBase); |
| + table.AddRange(base->at(i), CharacterRangeSplitter::kInBase, zone); |
| for (int i = 0; i < overlay.length(); i += 2) { |
| table.AddRange(CharacterRange(overlay[i], overlay[i + 1] - 1), |
| - CharacterRangeSplitter::kInOverlay); |
| + CharacterRangeSplitter::kInOverlay, zone); |
| } |
| - CharacterRangeSplitter callback(included, excluded); |
| - table.ForEach(&callback); |
| + CharacterRangeSplitter callback(included, excluded, zone); |
| + table.ForEach(&callback, zone); |
| } |
| void CharacterRange::AddCaseEquivalents(ZoneList<CharacterRange>* ranges, |
| - bool is_ascii) { |
| + bool is_ascii, |
| + Zone* zone) { |
| Isolate* isolate = Isolate::Current(); |
| uc16 bottom = from(); |
| uc16 top = to(); |
| @@ -5149,7 +5188,7 @@ void CharacterRange::AddCaseEquivalents(ZoneList<CharacterRange>* ranges, |
| for (int i = 0; i < length; i++) { |
| uc32 chr = chars[i]; |
| if (chr != bottom) { |
| - ranges->Add(CharacterRange::Singleton(chars[i])); |
| + ranges->Add(CharacterRange::Singleton(chars[i]), zone); |
| } |
| } |
| } else { |
| @@ -5189,7 +5228,7 @@ void CharacterRange::AddCaseEquivalents(ZoneList<CharacterRange>* ranges, |
| uc16 range_from = c - (block_end - pos); |
| uc16 range_to = c - (block_end - end); |
| if (!(bottom <= range_from && range_to <= top)) { |
| - ranges->Add(CharacterRange(range_from, range_to)); |
| + ranges->Add(CharacterRange(range_from, range_to), zone); |
| } |
| } |
| pos = end + 1; |
| @@ -5212,10 +5251,10 @@ bool CharacterRange::IsCanonical(ZoneList<CharacterRange>* ranges) { |
| } |
| -ZoneList<CharacterRange>* CharacterSet::ranges() { |
| +ZoneList<CharacterRange>* CharacterSet::ranges(Zone* zone) { |
| if (ranges_ == NULL) { |
| - ranges_ = new ZoneList<CharacterRange>(2); |
| - CharacterRange::AddClassEscape(standard_set_type_, ranges_); |
| + ranges_ = new(zone) ZoneList<CharacterRange>(2, zone); |
| + CharacterRange::AddClassEscape(standard_set_type_, ranges_, zone); |
| } |
| return ranges_; |
| } |
| @@ -5344,7 +5383,8 @@ void CharacterRange::Canonicalize(ZoneList<CharacterRange>* character_ranges) { |
| void CharacterRange::Negate(ZoneList<CharacterRange>* ranges, |
| - ZoneList<CharacterRange>* negated_ranges) { |
| + ZoneList<CharacterRange>* negated_ranges, |
| + Zone* zone) { |
| ASSERT(CharacterRange::IsCanonical(ranges)); |
| ASSERT_EQ(0, negated_ranges->length()); |
| int range_count = ranges->length(); |
| @@ -5356,12 +5396,13 @@ void CharacterRange::Negate(ZoneList<CharacterRange>* ranges, |
| } |
| while (i < range_count) { |
| CharacterRange range = ranges->at(i); |
| - negated_ranges->Add(CharacterRange(from + 1, range.from() - 1)); |
| + negated_ranges->Add(CharacterRange(from + 1, range.from() - 1), zone); |
| from = range.to(); |
| i++; |
| } |
| if (from < String::kMaxUtf16CodeUnit) { |
| - negated_ranges->Add(CharacterRange(from + 1, String::kMaxUtf16CodeUnit)); |
| + negated_ranges->Add(CharacterRange(from + 1, String::kMaxUtf16CodeUnit), |
| + zone); |
| } |
| } |
| @@ -5370,33 +5411,33 @@ void CharacterRange::Negate(ZoneList<CharacterRange>* ranges, |
| // Splay tree |
| -OutSet* OutSet::Extend(unsigned value) { |
| +OutSet* OutSet::Extend(unsigned value, Zone* zone) { |
| if (Get(value)) |
| return this; |
| - if (successors() != NULL) { |
| - for (int i = 0; i < successors()->length(); i++) { |
| - OutSet* successor = successors()->at(i); |
| + if (successors(zone) != NULL) { |
| + for (int i = 0; i < successors(zone)->length(); i++) { |
| + OutSet* successor = successors(zone)->at(i); |
| if (successor->Get(value)) |
| return successor; |
| } |
| } else { |
| - successors_ = new ZoneList<OutSet*>(2); |
| + successors_ = new(zone) ZoneList<OutSet*>(2, zone); |
| } |
| - OutSet* result = new OutSet(first_, remaining_); |
| - result->Set(value); |
| - successors()->Add(result); |
| + OutSet* result = new(zone) OutSet(first_, remaining_); |
| + result->Set(value, zone); |
| + successors(zone)->Add(result, zone); |
| return result; |
| } |
| -void OutSet::Set(unsigned value) { |
| +void OutSet::Set(unsigned value, Zone *zone) { |
| if (value < kFirstLimit) { |
| first_ |= (1 << value); |
| } else { |
| if (remaining_ == NULL) |
| - remaining_ = new ZoneList<unsigned>(1); |
| + remaining_ = new(zone) ZoneList<unsigned>(1, zone); |
| if (remaining_->is_empty() || !remaining_->Contains(value)) |
| - remaining_->Add(value); |
| + remaining_->Add(value, zone); |
| } |
| } |
| @@ -5415,13 +5456,16 @@ bool OutSet::Get(unsigned value) { |
| const uc16 DispatchTable::Config::kNoKey = unibrow::Utf8::kBadChar; |
| -void DispatchTable::AddRange(CharacterRange full_range, int value) { |
| +void DispatchTable::AddRange(CharacterRange full_range, int value, |
| + Zone* zone) { |
| CharacterRange current = full_range; |
| + ZoneAllocationPolicy allocator(zone); |
| if (tree()->is_empty()) { |
| // If this is the first range we just insert into the table. |
| ZoneSplayTree<Config>::Locator loc; |
| - ASSERT_RESULT(tree()->Insert(current.from(), &loc)); |
| - loc.set_value(Entry(current.from(), current.to(), empty()->Extend(value))); |
| + ASSERT_RESULT(tree()->Insert(current.from(), &loc, allocator)); |
| + loc.set_value(Entry(current.from(), current.to(), |
| + empty()->Extend(value, zone))); |
| return; |
| } |
| // First see if there is a range to the left of this one that |
| @@ -5445,7 +5489,7 @@ void DispatchTable::AddRange(CharacterRange full_range, int value) { |
| // to the map and let the next step deal with merging it with |
| // the range we're adding. |
| ZoneSplayTree<Config>::Locator loc; |
| - ASSERT_RESULT(tree()->Insert(right.from(), &loc)); |
| + ASSERT_RESULT(tree()->Insert(right.from(), &loc, allocator)); |
| loc.set_value(Entry(right.from(), |
| right.to(), |
| entry->out_set())); |
| @@ -5461,10 +5505,10 @@ void DispatchTable::AddRange(CharacterRange full_range, int value) { |
| // then we have to add a range covering just that space. |
| if (current.from() < entry->from()) { |
| ZoneSplayTree<Config>::Locator ins; |
| - ASSERT_RESULT(tree()->Insert(current.from(), &ins)); |
| + ASSERT_RESULT(tree()->Insert(current.from(), &ins, allocator)); |
| ins.set_value(Entry(current.from(), |
| entry->from() - 1, |
| - empty()->Extend(value))); |
| + empty()->Extend(value, zone))); |
| current.set_from(entry->from()); |
| } |
| ASSERT_EQ(current.from(), entry->from()); |
| @@ -5472,7 +5516,7 @@ void DispatchTable::AddRange(CharacterRange full_range, int value) { |
| // we have to snap the right part off and add it separately. |
| if (entry->to() > current.to()) { |
| ZoneSplayTree<Config>::Locator ins; |
| - ASSERT_RESULT(tree()->Insert(current.to() + 1, &ins)); |
| + ASSERT_RESULT(tree()->Insert(current.to() + 1, &ins, allocator)); |
| ins.set_value(Entry(current.to() + 1, |
| entry->to(), |
| entry->out_set())); |
| @@ -5482,7 +5526,7 @@ void DispatchTable::AddRange(CharacterRange full_range, int value) { |
| // The overlapping range is now completely contained by the range |
| // we're adding so we can just update it and move the start point |
| // of the range we're adding just past it. |
| - entry->AddValue(value); |
| + entry->AddValue(value, zone); |
| // Bail out if the last interval ended at 0xFFFF since otherwise |
| // adding 1 will wrap around to 0. |
| if (entry->to() == String::kMaxUtf16CodeUnit) |
| @@ -5492,10 +5536,10 @@ void DispatchTable::AddRange(CharacterRange full_range, int value) { |
| } else { |
| // There is no overlap so we can just add the range |
| ZoneSplayTree<Config>::Locator ins; |
| - ASSERT_RESULT(tree()->Insert(current.from(), &ins)); |
| + ASSERT_RESULT(tree()->Insert(current.from(), &ins, allocator)); |
| ins.set_value(Entry(current.from(), |
| current.to(), |
| - empty()->Extend(value))); |
| + empty()->Extend(value, zone))); |
| break; |
| } |
| } |
| @@ -5695,7 +5739,7 @@ void TextNode::FillInBMInfo(int initial_offset, |
| } else { |
| ASSERT(text.type == TextElement::CHAR_CLASS); |
| RegExpCharacterClass* char_class = text.data.u_char_class; |
| - ZoneList<CharacterRange>* ranges = char_class->ranges(); |
| + ZoneList<CharacterRange>* ranges = char_class->ranges(zone()); |
| if (char_class->is_negated()) { |
| bm->SetAll(offset); |
| } else { |
| @@ -5763,7 +5807,7 @@ void DispatchTableConstructor::VisitChoice(ChoiceNode* node) { |
| return; |
| DispatchTable* table = node->GetTable(ignore_case_); |
| AddDispatchRange adder(this); |
| - table->ForEach(&adder); |
| + table->ForEach(&adder, node->zone()); |
| } |
| @@ -5815,7 +5859,7 @@ void DispatchTableConstructor::VisitText(TextNode* that) { |
| } |
| case TextElement::CHAR_CLASS: { |
| RegExpCharacterClass* tree = elm.data.u_char_class; |
| - ZoneList<CharacterRange>* ranges = tree->ranges(); |
| + ZoneList<CharacterRange>* ranges = tree->ranges(that->zone()); |
| if (tree->is_negated()) { |
| AddInverse(ranges); |
| } else { |
| @@ -5879,7 +5923,7 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( |
| RegExpQuantifier::ToNode(0, |
| RegExpTree::kInfinity, |
| false, |
| - new RegExpCharacterClass('*'), |
| + new(zone) RegExpCharacterClass('*'), |
| &compiler, |
| captured_body, |
| data->contains_anchor); |
| @@ -5887,10 +5931,10 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( |
| if (data->contains_anchor) { |
| // Unroll loop once, to take care of the case that might start |
| // at the start of input. |
| - ChoiceNode* first_step_node = new ChoiceNode(2, zone); |
| + ChoiceNode* first_step_node = new(zone) ChoiceNode(2, zone); |
| first_step_node->AddAlternative(GuardedAlternative(captured_body)); |
| first_step_node->AddAlternative(GuardedAlternative( |
| - new TextNode(new RegExpCharacterClass('*'), loop_node))); |
| + new(zone) TextNode(new(zone) RegExpCharacterClass('*'), loop_node))); |
| node = first_step_node; |
| } else { |
| node = loop_node; |
| @@ -5903,7 +5947,7 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( |
| if (node != NULL) node = node->FilterASCII(RegExpCompiler::kMaxRecursion); |
| } |
| - if (node == NULL) node = new EndNode(EndNode::BACKTRACK, zone); |
| + if (node == NULL) node = new(zone) EndNode(EndNode::BACKTRACK, zone); |
| data->node = node; |
| Analysis analysis(ignore_case, is_ascii); |
| analysis.EnsureAnalyzed(node); |
| @@ -5921,11 +5965,14 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( |
| : NativeRegExpMacroAssembler::UC16; |
| #if V8_TARGET_ARCH_IA32 |
| - RegExpMacroAssemblerIA32 macro_assembler(mode, (data->capture_count + 1) * 2); |
| + RegExpMacroAssemblerIA32 macro_assembler(mode, (data->capture_count + 1) * 2, |
| + zone); |
| #elif V8_TARGET_ARCH_X64 |
| - RegExpMacroAssemblerX64 macro_assembler(mode, (data->capture_count + 1) * 2); |
| + RegExpMacroAssemblerX64 macro_assembler(mode, (data->capture_count + 1) * 2, |
| + zone); |
| #elif V8_TARGET_ARCH_ARM |
| - RegExpMacroAssemblerARM macro_assembler(mode, (data->capture_count + 1) * 2); |
| + RegExpMacroAssemblerARM macro_assembler(mode, (data->capture_count + 1) * 2, |
| + zone); |
| #elif V8_TARGET_ARCH_MIPS |
| RegExpMacroAssemblerMIPS macro_assembler(mode, (data->capture_count + 1) * 2); |
| #endif |