Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 53fb00e8c4c45912176bf4df749387cb390adc6d..2c918d63383db54ecc148b1a7b7c33fc1af50777 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -55,19 +55,19 @@ namespace internal { |
HBasicBlock::HBasicBlock(HGraph* graph) |
: block_id_(graph->GetNextBlockID()), |
graph_(graph), |
- phis_(4), |
+ phis_(4, graph->zone()), |
first_(NULL), |
last_(NULL), |
end_(NULL), |
loop_information_(NULL), |
- predecessors_(2), |
+ predecessors_(2, graph->zone()), |
dominator_(NULL), |
- dominated_blocks_(4), |
+ dominated_blocks_(4, graph->zone()), |
last_environment_(NULL), |
argument_count_(-1), |
first_instruction_index_(-1), |
last_instruction_index_(-1), |
- deleted_phis_(4), |
+ deleted_phis_(4, graph->zone()), |
parent_loop_header_(NULL), |
is_inline_return_target_(false), |
is_deoptimizing_(false), |
@@ -76,7 +76,7 @@ HBasicBlock::HBasicBlock(HGraph* graph) |
void HBasicBlock::AttachLoopInformation() { |
ASSERT(!IsLoopHeader()); |
- loop_information_ = new(zone()) HLoopInformation(this); |
+ loop_information_ = new(zone()) HLoopInformation(this, zone()); |
} |
@@ -88,7 +88,7 @@ void HBasicBlock::DetachLoopInformation() { |
void HBasicBlock::AddPhi(HPhi* phi) { |
ASSERT(!IsStartBlock()); |
- phis_.Add(phi); |
+ phis_.Add(phi, zone()); |
phi->SetBlock(this); |
} |
@@ -119,13 +119,14 @@ void HBasicBlock::AddInstruction(HInstruction* instr) { |
HDeoptimize* HBasicBlock::CreateDeoptimize( |
HDeoptimize::UseEnvironment has_uses) { |
ASSERT(HasEnvironment()); |
- if (has_uses == HDeoptimize::kNoUses) return new(zone()) HDeoptimize(0); |
+ if (has_uses == HDeoptimize::kNoUses) |
+ return new(zone()) HDeoptimize(0, zone()); |
HEnvironment* environment = last_environment(); |
- HDeoptimize* instr = new(zone()) HDeoptimize(environment->length()); |
+ HDeoptimize* instr = new(zone()) HDeoptimize(environment->length(), zone()); |
for (int i = 0; i < environment->length(); i++) { |
HValue* val = environment->values()->at(i); |
- instr->AddEnvironmentValue(val); |
+ instr->AddEnvironmentValue(val, zone()); |
} |
return instr; |
@@ -141,7 +142,7 @@ HSimulate* HBasicBlock::CreateSimulate(int ast_id) { |
int push_count = environment->push_count(); |
int pop_count = environment->pop_count(); |
- HSimulate* instr = new(zone()) HSimulate(ast_id, pop_count); |
+ HSimulate* instr = new(zone()) HSimulate(ast_id, pop_count, zone()); |
for (int i = push_count - 1; i >= 0; --i) { |
instr->AddPushedValue(environment->ExpressionStackAt(i)); |
} |
@@ -278,7 +279,7 @@ void HBasicBlock::RegisterPredecessor(HBasicBlock* pred) { |
SetInitialEnvironment(pred->last_environment()->Copy()); |
} |
- predecessors_.Add(pred); |
+ predecessors_.Add(pred, zone()); |
} |
@@ -291,7 +292,7 @@ void HBasicBlock::AddDominatedBlock(HBasicBlock* block) { |
dominated_blocks_[index]->block_id() < block->block_id()) { |
++index; |
} |
- dominated_blocks_.InsertAt(index, block); |
+ dominated_blocks_.InsertAt(index, block, zone()); |
} |
@@ -404,7 +405,7 @@ void HBasicBlock::Verify() { |
void HLoopInformation::RegisterBackEdge(HBasicBlock* block) { |
- this->back_edges_.Add(block); |
+ this->back_edges_.Add(block, block->zone()); |
AddBlock(block); |
} |
@@ -430,7 +431,7 @@ void HLoopInformation::AddBlock(HBasicBlock* block) { |
AddBlock(block->parent_loop_header()); |
} else { |
block->set_parent_loop_header(loop_header()); |
- blocks_.Add(block); |
+ blocks_.Add(block, block->zone()); |
for (int i = 0; i < block->predecessors()->length(); ++i) { |
AddBlock(block->predecessors()->at(i)); |
} |
@@ -451,8 +452,8 @@ class ReachabilityAnalyzer BASE_EMBEDDED { |
int block_count, |
HBasicBlock* dont_visit) |
: visited_count_(0), |
- stack_(16), |
- reachable_(block_count, ZONE), |
+ stack_(16, entry_block->zone()), |
+ reachable_(block_count, entry_block->zone()), |
dont_visit_(dont_visit) { |
PushBlock(entry_block); |
Analyze(); |
@@ -466,7 +467,7 @@ class ReachabilityAnalyzer BASE_EMBEDDED { |
if (block != NULL && block != dont_visit_ && |
!reachable_.Contains(block->block_id())) { |
reachable_.Add(block->block_id()); |
- stack_.Add(block); |
+ stack_.Add(block, block->zone()); |
visited_count_++; |
} |
} |
@@ -604,7 +605,8 @@ HConstant* HGraph::GetConstantHole() { |
HGraphBuilder::HGraphBuilder(CompilationInfo* info, |
- TypeFeedbackOracle* oracle) |
+ TypeFeedbackOracle* oracle, |
+ Zone* zone) |
: function_state_(NULL), |
initial_function_state_(this, info, oracle, NORMAL_RETURN), |
ast_context_(NULL), |
@@ -612,8 +614,8 @@ HGraphBuilder::HGraphBuilder(CompilationInfo* info, |
graph_(NULL), |
current_block_(NULL), |
inlined_count_(0), |
- globals_(10), |
- zone_(info->isolate()->zone()), |
+ globals_(10, zone), |
+ zone_(zone), |
inline_bailout_(false) { |
// This is not initialized in the initializer list because the |
// constructor for the initial state relies on function_state_ == NULL |
@@ -672,15 +674,16 @@ void HBasicBlock::FinishExit(HControlInstruction* instruction) { |
} |
-HGraph::HGraph(CompilationInfo* info) |
+HGraph::HGraph(CompilationInfo* info, Zone* zone) |
: isolate_(info->isolate()), |
next_block_id_(0), |
entry_block_(NULL), |
- blocks_(8), |
- values_(16), |
- phi_list_(NULL) { |
+ blocks_(8, zone), |
+ values_(16, zone), |
+ phi_list_(NULL), |
+ zone_(zone) { |
start_environment_ = |
- new(zone()) HEnvironment(NULL, info->scope(), info->closure()); |
+ new(zone) HEnvironment(NULL, info->scope(), info->closure(), zone); |
start_environment_->set_ast_id(AstNode::kFunctionEntryId); |
entry_block_ = CreateBasicBlock(); |
entry_block_->SetInitialEnvironment(start_environment_); |
@@ -730,7 +733,7 @@ Handle<Code> HGraph::Compile(CompilationInfo* info, Zone* zone) { |
HBasicBlock* HGraph::CreateBasicBlock() { |
HBasicBlock* result = new(zone()) HBasicBlock(this); |
- blocks_.Add(result); |
+ blocks_.Add(result, zone()); |
return result; |
} |
@@ -753,7 +756,7 @@ void HGraph::OrderBlocks() { |
HPhase phase("H_Block ordering"); |
BitVector visited(blocks_.length(), zone()); |
- ZoneList<HBasicBlock*> reverse_result(8); |
+ ZoneList<HBasicBlock*> reverse_result(8, zone()); |
HBasicBlock* start = blocks_[0]; |
Postorder(start, &visited, &reverse_result, NULL); |
@@ -761,7 +764,7 @@ void HGraph::OrderBlocks() { |
int index = 0; |
for (int i = reverse_result.length() - 1; i >= 0; --i) { |
HBasicBlock* b = reverse_result[i]; |
- blocks_.Add(b); |
+ blocks_.Add(b, zone()); |
b->set_block_id(index++); |
} |
} |
@@ -807,7 +810,7 @@ void HGraph::Postorder(HBasicBlock* block, |
ASSERT(block->end()->SecondSuccessor() == NULL || |
order->Contains(block->end()->SecondSuccessor()) || |
block->end()->SecondSuccessor()->IsLoopHeader()); |
- order->Add(block); |
+ order->Add(block, zone()); |
} |
@@ -849,9 +852,9 @@ void HGraph::EliminateRedundantPhis() { |
// Worklist of phis that can potentially be eliminated. Initialized with |
// all phi nodes. When elimination of a phi node modifies another phi node |
// the modified phi node is added to the worklist. |
- ZoneList<HPhi*> worklist(blocks_.length()); |
+ ZoneList<HPhi*> worklist(blocks_.length(), zone()); |
for (int i = 0; i < blocks_.length(); ++i) { |
- worklist.AddAll(*blocks_[i]->phis()); |
+ worklist.AddAll(*blocks_[i]->phis(), zone()); |
} |
while (!worklist.is_empty()) { |
@@ -869,7 +872,7 @@ void HGraph::EliminateRedundantPhis() { |
for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) { |
HValue* value = it.value(); |
value->SetOperandAt(it.index(), replacement); |
- if (value->IsPhi()) worklist.Add(HPhi::cast(value)); |
+ if (value->IsPhi()) worklist.Add(HPhi::cast(value), zone()); |
} |
block->RemovePhi(phi); |
} |
@@ -881,18 +884,18 @@ void HGraph::EliminateUnreachablePhis() { |
HPhase phase("H_Unreachable phi elimination", this); |
// Initialize worklist. |
- ZoneList<HPhi*> phi_list(blocks_.length()); |
- ZoneList<HPhi*> worklist(blocks_.length()); |
+ ZoneList<HPhi*> phi_list(blocks_.length(), zone()); |
+ ZoneList<HPhi*> worklist(blocks_.length(), zone()); |
for (int i = 0; i < blocks_.length(); ++i) { |
for (int j = 0; j < blocks_[i]->phis()->length(); j++) { |
HPhi* phi = blocks_[i]->phis()->at(j); |
- phi_list.Add(phi); |
+ phi_list.Add(phi, zone()); |
// We can't eliminate phis in the receiver position in the environment |
// because in case of throwing an error we need this value to |
// construct a stack trace. |
if (phi->HasRealUses() || phi->IsReceiver()) { |
phi->set_is_live(true); |
- worklist.Add(phi); |
+ worklist.Add(phi, zone()); |
} |
} |
} |
@@ -904,7 +907,7 @@ void HGraph::EliminateUnreachablePhis() { |
HValue* operand = phi->OperandAt(i); |
if (operand->IsPhi() && !HPhi::cast(operand)->is_live()) { |
HPhi::cast(operand)->set_is_live(true); |
- worklist.Add(HPhi::cast(operand)); |
+ worklist.Add(HPhi::cast(operand), zone()); |
} |
} |
} |
@@ -951,11 +954,11 @@ bool HGraph::CheckConstPhiUses() { |
void HGraph::CollectPhis() { |
int block_count = blocks_.length(); |
- phi_list_ = new ZoneList<HPhi*>(block_count); |
+ phi_list_ = new(zone()) ZoneList<HPhi*>(block_count, zone()); |
for (int i = 0; i < block_count; ++i) { |
for (int j = 0; j < blocks_[i]->phis()->length(); ++j) { |
HPhi* phi = blocks_[i]->phis()->at(j); |
- phi_list_->Add(phi); |
+ phi_list_->Add(phi, zone()); |
} |
} |
} |
@@ -976,7 +979,7 @@ void HGraph::InferTypes(ZoneList<HValue*>* worklist) { |
HValue* use = it.value(); |
if (!in_worklist.Contains(use->id())) { |
in_worklist.Add(use->id()); |
- worklist->Add(use); |
+ worklist->Add(use, zone()); |
} |
} |
} |
@@ -987,7 +990,7 @@ void HGraph::InferTypes(ZoneList<HValue*>* worklist) { |
class HRangeAnalysis BASE_EMBEDDED { |
public: |
explicit HRangeAnalysis(HGraph* graph) : |
- graph_(graph), zone_(graph->isolate()->zone()), changed_ranges_(16) { } |
+ graph_(graph), zone_(graph->zone()), changed_ranges_(16, zone_) { } |
void Analyze(); |
@@ -1132,7 +1135,7 @@ void HRangeAnalysis::RollBackTo(int index) { |
void HRangeAnalysis::AddRange(HValue* value, Range* range) { |
Range* original_range = value->range(); |
value->AddNewRange(range, zone_); |
- changed_ranges_.Add(value); |
+ changed_ranges_.Add(value, zone_); |
Range* new_range = value->range(); |
TraceRange("Updated range of %d set to [%d,%d]\n", |
value->id(), |
@@ -1260,18 +1263,18 @@ HValue* HValueMap::Lookup(HValue* value) const { |
} |
-void HValueMap::Resize(int new_size) { |
+void HValueMap::Resize(int new_size, Zone* zone) { |
ASSERT(new_size > count_); |
// Hashing the values into the new array has no more collisions than in the |
// old hash map, so we can use the existing lists_ array, if we are careful. |
// Make sure we have at least one free element. |
if (free_list_head_ == kNil) { |
- ResizeLists(lists_size_ << 1); |
+ ResizeLists(lists_size_ << 1, zone); |
} |
HValueMapListElement* new_array = |
- ZONE->NewArray<HValueMapListElement>(new_size); |
+ zone->NewArray<HValueMapListElement>(new_size); |
memset(new_array, 0, sizeof(HValueMapListElement) * new_size); |
HValueMapListElement* old_array = array_; |
@@ -1289,14 +1292,14 @@ void HValueMap::Resize(int new_size) { |
if (old_array[i].value != NULL) { |
int current = old_array[i].next; |
while (current != kNil) { |
- Insert(lists_[current].value); |
+ Insert(lists_[current].value, zone); |
int next = lists_[current].next; |
lists_[current].next = free_list_head_; |
free_list_head_ = current; |
current = next; |
} |
// Rehash the directly stored value. |
- Insert(old_array[i].value); |
+ Insert(old_array[i].value, zone); |
} |
} |
} |
@@ -1305,11 +1308,11 @@ void HValueMap::Resize(int new_size) { |
} |
-void HValueMap::ResizeLists(int new_size) { |
+void HValueMap::ResizeLists(int new_size, Zone* zone) { |
ASSERT(new_size > lists_size_); |
HValueMapListElement* new_lists = |
- ZONE->NewArray<HValueMapListElement>(new_size); |
+ zone->NewArray<HValueMapListElement>(new_size); |
memset(new_lists, 0, sizeof(HValueMapListElement) * new_size); |
HValueMapListElement* old_lists = lists_; |
@@ -1328,10 +1331,10 @@ void HValueMap::ResizeLists(int new_size) { |
} |
-void HValueMap::Insert(HValue* value) { |
+void HValueMap::Insert(HValue* value, Zone* zone) { |
ASSERT(value != NULL); |
// Resizing when half of the hashtable is filled up. |
- if (count_ >= array_size_ >> 1) Resize(array_size_ << 1); |
+ if (count_ >= array_size_ >> 1) Resize(array_size_ << 1, zone); |
ASSERT(count_ < array_size_); |
count_++; |
uint32_t pos = Bound(static_cast<uint32_t>(value->Hashcode())); |
@@ -1340,7 +1343,7 @@ void HValueMap::Insert(HValue* value) { |
array_[pos].next = kNil; |
} else { |
if (free_list_head_ == kNil) { |
- ResizeLists(lists_size_ << 1); |
+ ResizeLists(lists_size_ << 1, zone); |
} |
int new_element_pos = free_list_head_; |
ASSERT(new_element_pos != kNil); |
@@ -1478,12 +1481,14 @@ class HGlobalValueNumberer BASE_EMBEDDED { |
: graph_(graph), |
info_(info), |
removed_side_effects_(false), |
- block_side_effects_(graph->blocks()->length()), |
- loop_side_effects_(graph->blocks()->length()), |
+ block_side_effects_(graph->blocks()->length(), graph->zone()), |
+ loop_side_effects_(graph->blocks()->length(), graph->zone()), |
visited_on_paths_(graph->zone(), graph->blocks()->length()) { |
ASSERT(info->isolate()->heap()->allow_allocation(false)); |
- block_side_effects_.AddBlock(GVNFlagSet(), graph_->blocks()->length()); |
- loop_side_effects_.AddBlock(GVNFlagSet(), graph_->blocks()->length()); |
+ block_side_effects_.AddBlock(GVNFlagSet(), graph_->blocks()->length(), |
+ graph_->zone()); |
+ loop_side_effects_.AddBlock(GVNFlagSet(), graph_->blocks()->length(), |
+ graph_->zone()); |
} |
~HGlobalValueNumberer() { |
ASSERT(!info_->isolate()->heap()->allow_allocation(true)); |
@@ -1509,7 +1514,7 @@ class HGlobalValueNumberer BASE_EMBEDDED { |
HGraph* graph() { return graph_; } |
CompilationInfo* info() { return info_; } |
- Zone* zone() { return graph_->zone(); } |
+ Zone* zone() const { return graph_->zone(); } |
HGraph* graph_; |
CompilationInfo* info_; |
@@ -1949,7 +1954,7 @@ class GvnBasicBlockState: public ZoneObject { |
// GvnBasicBlockState instances. |
void HGlobalValueNumberer::AnalyzeGraph() { |
HBasicBlock* entry_block = graph_->entry_block(); |
- HValueMap* entry_map = new(zone()) HValueMap(); |
+ HValueMap* entry_map = new(zone()) HValueMap(zone()); |
GvnBasicBlockState* current = |
GvnBasicBlockState::CreateEntry(zone(), entry_block, entry_map); |
@@ -1993,7 +1998,7 @@ void HGlobalValueNumberer::AnalyzeGraph() { |
if (instr->HasSideEffects()) removed_side_effects_ = true; |
instr->DeleteAndReplaceWith(other); |
} else { |
- map->Add(instr); |
+ map->Add(instr, zone()); |
} |
} |
if (instr->CheckFlag(HValue::kTrackSideEffectDominators)) { |
@@ -2049,7 +2054,7 @@ class HInferRepresentation BASE_EMBEDDED { |
public: |
explicit HInferRepresentation(HGraph* graph) |
: graph_(graph), |
- worklist_(8), |
+ worklist_(8, graph->zone()), |
in_worklist_(graph->GetMaximumValueID(), graph->zone()) { } |
void Analyze(); |
@@ -2061,7 +2066,7 @@ class HInferRepresentation BASE_EMBEDDED { |
void AddDependantsToWorklist(HValue* current); |
void InferBasedOnUses(HValue* current); |
- Zone* zone() { return graph_->zone(); } |
+ Zone* zone() const { return graph_->zone(); } |
HGraph* graph_; |
ZoneList<HValue*> worklist_; |
@@ -2073,7 +2078,7 @@ void HInferRepresentation::AddToWorklist(HValue* current) { |
if (current->representation().IsSpecialization()) return; |
if (!current->CheckFlag(HValue::kFlexibleRepresentation)) return; |
if (in_worklist_.Contains(current->id())) return; |
- worklist_.Add(current); |
+ worklist_.Add(current, zone()); |
in_worklist_.Add(current->id()); |
} |
@@ -2184,12 +2189,12 @@ void HInferRepresentation::Analyze() { |
// bit-vector of length <number of phis>. |
const ZoneList<HPhi*>* phi_list = graph_->phi_list(); |
int phi_count = phi_list->length(); |
- ZoneList<BitVector*> connected_phis(phi_count); |
+ ZoneList<BitVector*> connected_phis(phi_count, graph_->zone()); |
for (int i = 0; i < phi_count; ++i) { |
phi_list->at(i)->InitRealUses(i); |
BitVector* connected_set = new(zone()) BitVector(phi_count, graph_->zone()); |
connected_set->Add(i); |
- connected_phis.Add(connected_set); |
+ connected_phis.Add(connected_set, zone()); |
} |
// (2) Do a fixed point iteration to find the set of connected phis. A |
@@ -2298,9 +2303,9 @@ void HGraph::InitializeInferredTypes(int from_inclusive, int to_inclusive) { |
i = last_back_edge->block_id(); |
// Update phis of the loop header now after the whole loop body is |
// guaranteed to be processed. |
- ZoneList<HValue*> worklist(block->phis()->length()); |
+ ZoneList<HValue*> worklist(block->phis()->length(), zone()); |
for (int j = 0; j < block->phis()->length(); ++j) { |
- worklist.Add(block->phis()->at(j)); |
+ worklist.Add(block->phis()->at(j), zone()); |
} |
InferTypes(&worklist); |
} |
@@ -2367,8 +2372,8 @@ void HGraph::InsertRepresentationChangeForUse(HValue* value, |
HConstant* constant = HConstant::cast(value); |
// Try to create a new copy of the constant with the new representation. |
new_value = is_truncating |
- ? constant->CopyToTruncatedInt32() |
- : constant->CopyToRepresentation(to); |
+ ? constant->CopyToTruncatedInt32(zone()) |
+ : constant->CopyToRepresentation(to, zone()); |
} |
if (new_value == NULL) { |
@@ -2787,7 +2792,7 @@ void HGraphBuilder::VisitExpressions(ZoneList<Expression*>* exprs) { |
HGraph* HGraphBuilder::CreateGraph() { |
- graph_ = new(zone()) HGraph(info()); |
+ graph_ = new(zone()) HGraph(info(), zone()); |
if (FLAG_hydrogen_stats) HStatistics::Instance()->Initialize(info()); |
{ |
@@ -3138,20 +3143,22 @@ static bool BoundsCheckKeyMatch(void* key1, void* key2) { |
class BoundsCheckTable : private ZoneHashMap { |
public: |
- BoundsCheckBbData** LookupOrInsert(BoundsCheckKey* key) { |
+ BoundsCheckBbData** LookupOrInsert(BoundsCheckKey* key, Zone* zone) { |
return reinterpret_cast<BoundsCheckBbData**>( |
- &(Lookup(key, key->Hash(), true)->value)); |
+ &(Lookup(key, key->Hash(), true, ZoneAllocationPolicy(zone))->value)); |
} |
- void Insert(BoundsCheckKey* key, BoundsCheckBbData* data) { |
- Lookup(key, key->Hash(), true)->value = data; |
+ void Insert(BoundsCheckKey* key, BoundsCheckBbData* data, Zone* zone) { |
+ Lookup(key, key->Hash(), true, ZoneAllocationPolicy(zone))->value = data; |
} |
void Delete(BoundsCheckKey* key) { |
Remove(key, key->Hash()); |
} |
- BoundsCheckTable() : ZoneHashMap(BoundsCheckKeyMatch) { } |
+ explicit BoundsCheckTable(Zone* zone) |
+ : ZoneHashMap(BoundsCheckKeyMatch, ZoneHashMap::kDefaultHashMapCapacity, |
+ ZoneAllocationPolicy(zone)) { } |
}; |
@@ -3174,8 +3181,8 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, |
int32_t offset; |
BoundsCheckKey* key = |
- BoundsCheckKey::Create(bb->zone(), check, &offset); |
- BoundsCheckBbData** data_p = table->LookupOrInsert(key); |
+ BoundsCheckKey::Create(zone(), check, &offset); |
+ BoundsCheckBbData** data_p = table->LookupOrInsert(key, zone()); |
BoundsCheckBbData* data = *data_p; |
if (data == NULL) { |
bb_data_list = new(zone()) BoundsCheckBbData(key, |
@@ -3197,14 +3204,14 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, |
int32_t new_upper_offset = offset > data->UpperOffset() |
? offset |
: data->UpperOffset(); |
- bb_data_list = new(bb->zone()) BoundsCheckBbData(key, |
- new_lower_offset, |
- new_upper_offset, |
- bb, |
- check, |
- bb_data_list, |
- data); |
- table->Insert(key, bb_data_list); |
+ bb_data_list = new(zone()) BoundsCheckBbData(key, |
+ new_lower_offset, |
+ new_upper_offset, |
+ bb, |
+ check, |
+ bb_data_list, |
+ data); |
+ table->Insert(key, bb_data_list, zone()); |
} |
} |
@@ -3217,7 +3224,7 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, |
data = data->NextInBasicBlock()) { |
data->RemoveZeroOperations(); |
if (data->FatherInDominatorTree()) { |
- table->Insert(data->Key(), data->FatherInDominatorTree()); |
+ table->Insert(data->Key(), data->FatherInDominatorTree(), zone()); |
} else { |
table->Delete(data->Key()); |
} |
@@ -3228,7 +3235,7 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, |
void HGraph::EliminateRedundantBoundsChecks() { |
HPhase phase("H_Eliminate bounds checks", this); |
AssertNoAllocation no_gc; |
- BoundsCheckTable checks_table; |
+ BoundsCheckTable checks_table(zone()); |
EliminateRedundantBoundsChecks(entry_block(), &checks_table); |
} |
@@ -3348,9 +3355,9 @@ void HGraphBuilder::PushAndAdd(HInstruction* instr) { |
template <class Instruction> |
HInstruction* HGraphBuilder::PreProcessCall(Instruction* call) { |
int count = call->argument_count(); |
- ZoneList<HValue*> arguments(count); |
+ ZoneList<HValue*> arguments(count, zone()); |
for (int i = 0; i < count; ++i) { |
- arguments.Add(Pop()); |
+ arguments.Add(Pop(), zone()); |
} |
while (!arguments.is_empty()) { |
@@ -3850,13 +3857,13 @@ bool HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
int first_expression_index = environment()->first_expression_index(); |
int length = environment()->length(); |
ZoneList<HUnknownOSRValue*>* osr_values = |
- new(zone()) ZoneList<HUnknownOSRValue*>(length); |
+ new(zone()) ZoneList<HUnknownOSRValue*>(length, zone()); |
for (int i = 0; i < first_expression_index; ++i) { |
HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; |
AddInstruction(osr_value); |
environment()->Bind(i, osr_value); |
- osr_values->Add(osr_value); |
+ osr_values->Add(osr_value, zone()); |
} |
if (first_expression_index != length) { |
@@ -3865,7 +3872,7 @@ bool HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; |
AddInstruction(osr_value); |
environment()->Push(osr_value); |
- osr_values->Add(osr_value); |
+ osr_values->Add(osr_value, zone()); |
} |
} |
@@ -4493,7 +4500,7 @@ void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
// of the property values and is the value of the entire expression. |
PushAndAdd(literal); |
- expr->CalculateEmitStore(); |
+ expr->CalculateEmitStore(zone()); |
for (int i = 0; i < expr->properties()->length(); i++) { |
ObjectLiteral::Property* property = expr->properties()->at(i); |
@@ -4683,7 +4690,7 @@ HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object, |
ASSERT(lookup->IsFound()); |
if (smi_and_map_check) { |
AddInstruction(new(zone()) HCheckNonSmi(object)); |
- AddInstruction(HCheckMaps::NewWithTransitions(object, type)); |
+ AddInstruction(HCheckMaps::NewWithTransitions(object, type, zone())); |
} |
// If the property does not exist yet, we have to check that it wasn't made |
@@ -4828,14 +4835,15 @@ void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
// for all maps. Requires special map check on the set of all handled maps. |
HInstruction* instr; |
if (count == types->length() && is_monomorphic_field) { |
- AddInstruction(new(zone()) HCheckMaps(object, types)); |
+ AddInstruction(new(zone()) HCheckMaps(object, types, zone())); |
instr = BuildLoadNamedField(object, expr, map, &lookup, false); |
} else { |
HValue* context = environment()->LookupContext(); |
instr = new(zone()) HLoadNamedFieldPolymorphic(context, |
object, |
types, |
- name); |
+ name, |
+ zone()); |
} |
instr->set_position(expr->position()); |
@@ -4922,7 +4930,7 @@ void HGraphBuilder::HandlePolymorphicStoreNamedField(Assignment* expr, |
void HGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |
Property* prop = expr->target()->AsProperty(); |
ASSERT(prop != NULL); |
- expr->RecordTypeFeedback(oracle()); |
+ expr->RecordTypeFeedback(oracle(), zone()); |
CHECK_ALIVE(VisitForValue(prop->obj())); |
HValue* value = NULL; |
@@ -5093,7 +5101,7 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
return ast_context()->ReturnValue(Pop()); |
} else if (prop != NULL) { |
- prop->RecordTypeFeedback(oracle()); |
+ prop->RecordTypeFeedback(oracle(), zone()); |
if (prop->key()->IsPropertyName()) { |
// Named property. |
@@ -5152,7 +5160,7 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
PushAndAdd(instr); |
if (instr->HasObservableSideEffects()) AddSimulate(operation->id()); |
- expr->RecordTypeFeedback(oracle()); |
+ expr->RecordTypeFeedback(oracle(), zone()); |
HandleKeyedElementAccess(obj, key, instr, expr, expr->AssignmentId(), |
RelocInfo::kNoPosition, |
true, // is_store |
@@ -5200,7 +5208,7 @@ void HGraphBuilder::VisitAssignment(Assignment* expr) { |
// We insert a use of the old value to detect unsupported uses of const |
// variables (e.g. initialization inside a loop). |
HValue* old_value = environment()->Lookup(var); |
- AddInstruction(new HUseConst(old_value)); |
+ AddInstruction(new(zone()) HUseConst(old_value)); |
} |
} else if (var->mode() == CONST_HARMONY) { |
if (expr->op() != Token::INIT_CONST_HARMONY) { |
@@ -5327,7 +5335,7 @@ HLoadNamedField* HGraphBuilder::BuildLoadNamedField(HValue* object, |
bool smi_and_map_check) { |
if (smi_and_map_check) { |
AddInstruction(new(zone()) HCheckNonSmi(object)); |
- AddInstruction(HCheckMaps::NewWithTransitions(object, type)); |
+ AddInstruction(HCheckMaps::NewWithTransitions(object, type, zone())); |
} |
int index = lookup->GetLocalFieldIndexFromMap(*type); |
@@ -5371,7 +5379,7 @@ HInstruction* HGraphBuilder::BuildLoadNamed(HValue* obj, |
true); |
} else if (lookup.IsFound() && lookup.type() == CONSTANT_FUNCTION) { |
AddInstruction(new(zone()) HCheckNonSmi(obj)); |
- AddInstruction(HCheckMaps::NewWithTransitions(obj, map)); |
+ AddInstruction(HCheckMaps::NewWithTransitions(obj, map, zone())); |
Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map)); |
return new(zone()) HConstant(function, Representation::Tagged()); |
} else { |
@@ -5484,7 +5492,7 @@ HInstruction* HGraphBuilder::BuildMonomorphicElementAccess(HValue* object, |
Handle<Map> map, |
bool is_store) { |
HInstruction* mapcheck = |
- AddInstruction(new(zone()) HCheckMaps(object, map, dependency)); |
+ AddInstruction(new(zone()) HCheckMaps(object, map, zone(), dependency)); |
// No GVNFlag is necessary for ElementsKind if there is an explicit dependency |
// on a HElementsTransition instruction. The flag can also be removed if the |
// map to check has FAST_HOLEY_ELEMENTS, since there can be no further |
@@ -5501,7 +5509,7 @@ HInstruction* HGraphBuilder::BuildMonomorphicElementAccess(HValue* object, |
HInstruction* elements = AddInstruction(new(zone()) HLoadElements(object)); |
if (is_store && (fast_elements || fast_smi_only_elements)) { |
HCheckMaps* check_cow_map = new(zone()) HCheckMaps( |
- elements, isolate()->factory()->fixed_array_map()); |
+ elements, isolate()->factory()->fixed_array_map(), zone()); |
check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
AddInstruction(check_cow_map); |
} |
@@ -5608,7 +5616,7 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
return is_store ? NULL : instr; |
} |
- AddInstruction(HCheckInstanceType::NewIsSpecObject(object)); |
+ AddInstruction(HCheckInstanceType::NewIsSpecObject(object, zone())); |
HBasicBlock* join = graph()->CreateBasicBlock(); |
HInstruction* elements_kind_instr = |
@@ -5655,7 +5663,7 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
if (is_store && !IsFastDoubleElementsKind(elements_kind)) { |
AddInstruction(new(zone()) HCheckMaps( |
elements, isolate()->factory()->fixed_array_map(), |
- elements_kind_branch)); |
+ zone(), elements_kind_branch)); |
} |
// TODO(jkummerow): The need for these two blocks could be avoided |
// in one of two ways: |
@@ -5862,7 +5870,7 @@ void HGraphBuilder::VisitProperty(Property* expr) { |
ASSERT(!HasStackOverflow()); |
ASSERT(current_block() != NULL); |
ASSERT(current_block()->HasPredecessor()); |
- expr->RecordTypeFeedback(oracle()); |
+ expr->RecordTypeFeedback(oracle(), zone()); |
if (TryArgumentsAccess(expr)) return; |
@@ -5873,13 +5881,13 @@ void HGraphBuilder::VisitProperty(Property* expr) { |
HValue* array = Pop(); |
AddInstruction(new(zone()) HCheckNonSmi(array)); |
HInstruction* mapcheck = |
- AddInstruction(HCheckInstanceType::NewIsJSArray(array)); |
+ AddInstruction(HCheckInstanceType::NewIsJSArray(array, zone())); |
instr = new(zone()) HJSArrayLength(array, mapcheck); |
} else if (expr->IsStringLength()) { |
HValue* string = Pop(); |
AddInstruction(new(zone()) HCheckNonSmi(string)); |
- AddInstruction(HCheckInstanceType::NewIsString(string)); |
+ AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
instr = new(zone()) HStringLength(string); |
} else if (expr->IsStringAccess()) { |
CHECK_ALIVE(VisitForValue(expr->key())); |
@@ -5947,7 +5955,8 @@ void HGraphBuilder::AddCheckConstantFunction(Call* expr, |
// its prototypes. |
if (smi_and_map_check) { |
AddInstruction(new(zone()) HCheckNonSmi(receiver)); |
- AddInstruction(HCheckMaps::NewWithTransitions(receiver, receiver_map)); |
+ AddInstruction(HCheckMaps::NewWithTransitions(receiver, receiver_map, |
+ zone())); |
} |
if (!expr->holder().is_null()) { |
AddInstruction(new(zone()) HCheckPrototypeMaps( |
@@ -6282,7 +6291,7 @@ bool HGraphBuilder::TryInline(CallKind call_kind, |
// The scope info might not have been set if a lazily compiled |
// function is inlined before being called for the first time. |
Handle<ScopeInfo> target_scope_info = |
- ScopeInfo::Create(target_info.scope()); |
+ ScopeInfo::Create(target_info.scope(), zone()); |
target_shared->set_scope_info(*target_scope_info); |
} |
target_shared->EnableDeoptimizationSupport(*target_info.code()); |
@@ -6301,7 +6310,8 @@ bool HGraphBuilder::TryInline(CallKind call_kind, |
TypeFeedbackOracle target_oracle( |
Handle<Code>(target_shared->code()), |
Handle<Context>(target->context()->global_context()), |
- isolate()); |
+ isolate(), |
+ zone()); |
// The function state is new-allocated because we need to delete it |
// in two different places. |
FunctionState* target_state = new FunctionState( |
@@ -6321,8 +6331,9 @@ bool HGraphBuilder::TryInline(CallKind call_kind, |
// |
// TODO(kmillikin): implement the same inlining on other platforms so we |
// can remove the unsightly ifdefs in this function. |
- HConstant* context = new HConstant(Handle<Context>(target->context()), |
- Representation::Tagged()); |
+ HConstant* context = |
+ new(zone()) HConstant(Handle<Context>(target->context()), |
+ Representation::Tagged()); |
AddInstruction(context); |
inner_env->BindContext(context); |
#endif |
@@ -6337,9 +6348,9 @@ bool HGraphBuilder::TryInline(CallKind call_kind, |
if (function->scope()->arguments() != NULL) { |
HEnvironment* arguments_env = inner_env->arguments_environment(); |
int arguments_count = arguments_env->parameter_count(); |
- arguments_values = new(zone()) ZoneList<HValue*>(arguments_count); |
+ arguments_values = new(zone()) ZoneList<HValue*>(arguments_count, zone()); |
for (int i = 0; i < arguments_count; i++) { |
- arguments_values->Add(arguments_env->Lookup(i)); |
+ arguments_values->Add(arguments_env->Lookup(i), zone()); |
} |
} |
@@ -6934,8 +6945,8 @@ void HGraphBuilder::VisitCall(Call* expr) { |
HValue* function = Top(); |
HValue* context = environment()->LookupContext(); |
HGlobalObject* global = new(zone()) HGlobalObject(context); |
- HGlobalReceiver* receiver = new(zone()) HGlobalReceiver(global); |
AddInstruction(global); |
+ HGlobalReceiver* receiver = new(zone()) HGlobalReceiver(global); |
PushAndAdd(receiver); |
CHECK_ALIVE(VisitExpressions(expr->arguments())); |
AddInstruction(new(zone()) HCheckFunction(function, expr->target())); |
@@ -6965,8 +6976,8 @@ void HGraphBuilder::VisitCall(Call* expr) { |
HValue* function = Top(); |
HValue* context = environment()->LookupContext(); |
HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
- HGlobalReceiver* receiver = new(zone()) HGlobalReceiver(global_object); |
AddInstruction(global_object); |
+ HGlobalReceiver* receiver = new(zone()) HGlobalReceiver(global_object); |
AddInstruction(receiver); |
PushAndAdd(new(zone()) HPushArgument(receiver)); |
CHECK_ALIVE(VisitArgumentList(expr->arguments())); |
@@ -7372,7 +7383,7 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
} else { |
// Argument of the count operation is a property. |
ASSERT(prop != NULL); |
- prop->RecordTypeFeedback(oracle()); |
+ prop->RecordTypeFeedback(oracle(), zone()); |
if (prop->key()->IsPropertyName()) { |
// Named property. |
@@ -7426,7 +7437,7 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
after = BuildIncrement(returns_original_input, expr); |
input = Pop(); |
- expr->RecordTypeFeedback(oracle()); |
+ expr->RecordTypeFeedback(oracle(), zone()); |
HandleKeyedElementAccess(obj, key, after, expr, expr->AssignmentId(), |
RelocInfo::kNoPosition, |
true, // is_store |
@@ -7452,7 +7463,7 @@ HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* context, |
HValue* string, |
HValue* index) { |
AddInstruction(new(zone()) HCheckNonSmi(string)); |
- AddInstruction(HCheckInstanceType::NewIsString(string)); |
+ AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
HStringLength* length = new(zone()) HStringLength(string); |
AddInstruction(length); |
HInstruction* checked_index = |
@@ -7476,9 +7487,9 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, |
case Token::ADD: |
if (info.IsString()) { |
AddInstruction(new(zone()) HCheckNonSmi(left)); |
- AddInstruction(HCheckInstanceType::NewIsString(left)); |
+ AddInstruction(HCheckInstanceType::NewIsString(left, zone())); |
AddInstruction(new(zone()) HCheckNonSmi(right)); |
- AddInstruction(HCheckInstanceType::NewIsString(right)); |
+ AddInstruction(HCheckInstanceType::NewIsString(right, zone())); |
instr = new(zone()) HStringAdd(context, left, right); |
} else { |
instr = HAdd::NewHAdd(zone(), context, left, right); |
@@ -7880,18 +7891,18 @@ void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
Handle<Map> map = oracle()->GetCompareMap(expr); |
if (!map.is_null()) { |
AddInstruction(new(zone()) HCheckNonSmi(left)); |
- AddInstruction(HCheckMaps::NewWithTransitions(left, map)); |
+ AddInstruction(HCheckMaps::NewWithTransitions(left, map, zone())); |
AddInstruction(new(zone()) HCheckNonSmi(right)); |
- AddInstruction(HCheckMaps::NewWithTransitions(right, map)); |
+ AddInstruction(HCheckMaps::NewWithTransitions(right, map, zone())); |
HCompareObjectEqAndBranch* result = |
new(zone()) HCompareObjectEqAndBranch(left, right); |
result->set_position(expr->position()); |
return ast_context()->ReturnControl(result, expr->id()); |
} else { |
AddInstruction(new(zone()) HCheckNonSmi(left)); |
- AddInstruction(HCheckInstanceType::NewIsSpecObject(left)); |
+ AddInstruction(HCheckInstanceType::NewIsSpecObject(left, zone())); |
AddInstruction(new(zone()) HCheckNonSmi(right)); |
- AddInstruction(HCheckInstanceType::NewIsSpecObject(right)); |
+ AddInstruction(HCheckInstanceType::NewIsSpecObject(right, zone())); |
HCompareObjectEqAndBranch* result = |
new(zone()) HCompareObjectEqAndBranch(left, right); |
result->set_position(expr->position()); |
@@ -7904,9 +7915,9 @@ void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
} else if (type_info.IsString() && oracle()->IsSymbolCompare(expr) && |
(op == Token::EQ || op == Token::EQ_STRICT)) { |
AddInstruction(new(zone()) HCheckNonSmi(left)); |
- AddInstruction(HCheckInstanceType::NewIsSymbol(left)); |
+ AddInstruction(HCheckInstanceType::NewIsSymbol(left, zone())); |
AddInstruction(new(zone()) HCheckNonSmi(right)); |
- AddInstruction(HCheckInstanceType::NewIsSymbol(right)); |
+ AddInstruction(HCheckInstanceType::NewIsSymbol(right, zone())); |
HCompareObjectEqAndBranch* result = |
new(zone()) HCompareObjectEqAndBranch(left, right); |
result->set_position(expr->position()); |
@@ -7978,10 +7989,10 @@ void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* declaration) { |
bool hole_init = mode == CONST || mode == CONST_HARMONY || mode == LET; |
switch (variable->location()) { |
case Variable::UNALLOCATED: |
- globals_.Add(variable->name()); |
+ globals_.Add(variable->name(), zone()); |
globals_.Add(variable->binding_needs_init() |
? isolate()->factory()->the_hole_value() |
- : isolate()->factory()->undefined_value()); |
+ : isolate()->factory()->undefined_value(), zone()); |
return; |
case Variable::PARAMETER: |
case Variable::LOCAL: |
@@ -7994,7 +8005,7 @@ void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* declaration) { |
if (hole_init) { |
HValue* value = graph()->GetConstantHole(); |
HValue* context = environment()->LookupContext(); |
- HStoreContextSlot* store = new HStoreContextSlot( |
+ HStoreContextSlot* store = new(zone()) HStoreContextSlot( |
context, variable->index(), HStoreContextSlot::kNoCheck, value); |
AddInstruction(store); |
if (store->HasObservableSideEffects()) AddSimulate(proxy->id()); |
@@ -8011,12 +8022,12 @@ void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* declaration) { |
Variable* variable = proxy->var(); |
switch (variable->location()) { |
case Variable::UNALLOCATED: { |
- globals_.Add(variable->name()); |
+ globals_.Add(variable->name(), zone()); |
Handle<SharedFunctionInfo> function = |
Compiler::BuildFunctionInfo(declaration->fun(), info()->script()); |
// Check for stack-overflow exception. |
if (function.is_null()) return SetStackOverflow(); |
- globals_.Add(function); |
+ globals_.Add(function, zone()); |
return; |
} |
case Variable::PARAMETER: |
@@ -8030,7 +8041,7 @@ void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* declaration) { |
CHECK_ALIVE(VisitForValue(declaration->fun())); |
HValue* value = Pop(); |
HValue* context = environment()->LookupContext(); |
- HStoreContextSlot* store = new HStoreContextSlot( |
+ HStoreContextSlot* store = new(zone()) HStoreContextSlot( |
context, variable->index(), HStoreContextSlot::kNoCheck, value); |
AddInstruction(store); |
if (store->HasObservableSideEffects()) AddSimulate(proxy->id()); |
@@ -8276,11 +8287,11 @@ void HGraphBuilder::GenerateSetValueOf(CallRuntime* call) { |
// Create in-object property store to kValueOffset. |
set_current_block(if_js_value); |
Handle<String> name = isolate()->factory()->undefined_symbol(); |
- AddInstruction(new HStoreNamedField(object, |
- name, |
- value, |
- true, // in-object store. |
- JSValue::kValueOffset)); |
+ AddInstruction(new(zone()) HStoreNamedField(object, |
+ name, |
+ value, |
+ true, // in-object store. |
+ JSValue::kValueOffset)); |
if_js_value->Goto(join); |
join->SetJoinId(call->id()); |
set_current_block(join); |
@@ -8568,10 +8579,11 @@ void HGraphBuilder::GenerateFastAsciiArrayJoin(CallRuntime* call) { |
HEnvironment::HEnvironment(HEnvironment* outer, |
Scope* scope, |
- Handle<JSFunction> closure) |
+ Handle<JSFunction> closure, |
+ Zone* zone) |
: closure_(closure), |
- values_(0), |
- assigned_variables_(4), |
+ values_(0, zone), |
+ assigned_variables_(4, zone), |
frame_type_(JS_FUNCTION), |
parameter_count_(0), |
specials_count_(1), |
@@ -8579,14 +8591,15 @@ HEnvironment::HEnvironment(HEnvironment* outer, |
outer_(outer), |
pop_count_(0), |
push_count_(0), |
- ast_id_(AstNode::kNoNumber) { |
+ ast_id_(AstNode::kNoNumber), |
+ zone_(zone) { |
Initialize(scope->num_parameters() + 1, scope->num_stack_slots(), 0); |
} |
-HEnvironment::HEnvironment(const HEnvironment* other) |
- : values_(0), |
- assigned_variables_(0), |
+HEnvironment::HEnvironment(const HEnvironment* other, Zone* zone) |
+ : values_(0, zone), |
+ assigned_variables_(0, zone), |
frame_type_(JS_FUNCTION), |
parameter_count_(0), |
specials_count_(1), |
@@ -8594,7 +8607,8 @@ HEnvironment::HEnvironment(const HEnvironment* other) |
outer_(NULL), |
pop_count_(0), |
push_count_(0), |
- ast_id_(other->ast_id()) { |
+ ast_id_(other->ast_id()), |
+ zone_(zone) { |
Initialize(other); |
} |
@@ -8602,17 +8616,19 @@ HEnvironment::HEnvironment(const HEnvironment* other) |
HEnvironment::HEnvironment(HEnvironment* outer, |
Handle<JSFunction> closure, |
FrameType frame_type, |
- int arguments) |
+ int arguments, |
+ Zone* zone) |
: closure_(closure), |
- values_(arguments), |
- assigned_variables_(0), |
+ values_(arguments, zone), |
+ assigned_variables_(0, zone), |
frame_type_(frame_type), |
parameter_count_(arguments), |
local_count_(0), |
outer_(outer), |
pop_count_(0), |
push_count_(0), |
- ast_id_(AstNode::kNoNumber) { |
+ ast_id_(AstNode::kNoNumber), |
+ zone_(zone) { |
} |
@@ -8624,15 +8640,15 @@ void HEnvironment::Initialize(int parameter_count, |
// Avoid reallocating the temporaries' backing store on the first Push. |
int total = parameter_count + specials_count_ + local_count + stack_height; |
- values_.Initialize(total + 4); |
- for (int i = 0; i < total; ++i) values_.Add(NULL); |
+ values_.Initialize(total + 4, zone()); |
+ for (int i = 0; i < total; ++i) values_.Add(NULL, zone()); |
} |
void HEnvironment::Initialize(const HEnvironment* other) { |
closure_ = other->closure(); |
- values_.AddAll(other->values_); |
- assigned_variables_.AddAll(other->assigned_variables_); |
+ values_.AddAll(other->values_, zone()); |
+ assigned_variables_.AddAll(other->assigned_variables_, zone()); |
frame_type_ = other->frame_type_; |
parameter_count_ = other->parameter_count_; |
local_count_ = other->local_count_; |
@@ -8660,7 +8676,7 @@ void HEnvironment::AddIncomingEdge(HBasicBlock* block, HEnvironment* other) { |
} else if (values_[i] != other->values_[i]) { |
// There is a fresh value on the incoming edge, a phi is needed. |
ASSERT(values_[i] != NULL && other->values_[i] != NULL); |
- HPhi* phi = new(block->zone()) HPhi(i); |
+ HPhi* phi = new(zone()) HPhi(i, zone()); |
HValue* old_value = values_[i]; |
for (int j = 0; j < block->predecessors()->length(); j++) { |
phi->AddInput(old_value); |
@@ -8676,7 +8692,7 @@ void HEnvironment::AddIncomingEdge(HBasicBlock* block, HEnvironment* other) { |
void HEnvironment::Bind(int index, HValue* value) { |
ASSERT(value != NULL); |
if (!assigned_variables_.Contains(index)) { |
- assigned_variables_.Add(index); |
+ assigned_variables_.Add(index, zone()); |
} |
values_[index] = value; |
} |
@@ -8716,7 +8732,7 @@ void HEnvironment::Drop(int count) { |
HEnvironment* HEnvironment::Copy() const { |
- return new(closure()->GetIsolate()->zone()) HEnvironment(this); |
+ return new(zone()) HEnvironment(this, zone()); |
} |
@@ -8730,7 +8746,7 @@ HEnvironment* HEnvironment::CopyWithoutHistory() const { |
HEnvironment* HEnvironment::CopyAsLoopHeader(HBasicBlock* loop_header) const { |
HEnvironment* new_env = Copy(); |
for (int i = 0; i < values_.length(); ++i) { |
- HPhi* phi = new(loop_header->zone()) HPhi(i); |
+ HPhi* phi = new(zone()) HPhi(i, zone()); |
phi->AddInput(values_[i]); |
new_env->values_[i] = phi; |
loop_header->AddPhi(phi); |
@@ -8744,8 +8760,9 @@ HEnvironment* HEnvironment::CreateStubEnvironment(HEnvironment* outer, |
Handle<JSFunction> target, |
FrameType frame_type, |
int arguments) const { |
- HEnvironment* new_env = new(closure()->GetIsolate()->zone()) |
- HEnvironment(outer, target, frame_type, arguments + 1); |
+ HEnvironment* new_env = |
+ new(zone()) HEnvironment(outer, target, frame_type, |
+ arguments + 1, zone()); |
for (int i = 0; i <= arguments; ++i) { // Include receiver. |
new_env->Push(ExpressionStackAt(arguments - i)); |
} |
@@ -8785,7 +8802,7 @@ HEnvironment* HEnvironment::CopyForInlining( |
} |
HEnvironment* inner = |
- new(zone) HEnvironment(outer, function->scope(), target); |
+ new(zone) HEnvironment(outer, function->scope(), target, zone); |
// Get the argument values from the original environment. |
for (int i = 0; i <= arity; ++i) { // Include receiver. |
HValue* push = (i <= arguments) ? |
@@ -8975,27 +8992,28 @@ void HTracer::TraceLiveRanges(const char* name, LAllocator* allocator) { |
const Vector<LiveRange*>* fixed_d = allocator->fixed_double_live_ranges(); |
for (int i = 0; i < fixed_d->length(); ++i) { |
- TraceLiveRange(fixed_d->at(i), "fixed"); |
+ TraceLiveRange(fixed_d->at(i), "fixed", allocator->zone()); |
} |
const Vector<LiveRange*>* fixed = allocator->fixed_live_ranges(); |
for (int i = 0; i < fixed->length(); ++i) { |
- TraceLiveRange(fixed->at(i), "fixed"); |
+ TraceLiveRange(fixed->at(i), "fixed", allocator->zone()); |
} |
const ZoneList<LiveRange*>* live_ranges = allocator->live_ranges(); |
for (int i = 0; i < live_ranges->length(); ++i) { |
- TraceLiveRange(live_ranges->at(i), "object"); |
+ TraceLiveRange(live_ranges->at(i), "object", allocator->zone()); |
} |
} |
-void HTracer::TraceLiveRange(LiveRange* range, const char* type) { |
+void HTracer::TraceLiveRange(LiveRange* range, const char* type, |
+ Zone* zone) { |
if (range != NULL && !range->IsEmpty()) { |
PrintIndent(); |
trace_.Add("%d %s", range->id(), type); |
if (range->HasRegisterAssigned()) { |
- LOperand* op = range->CreateAssignedOperand(ZONE); |
+ LOperand* op = range->CreateAssignedOperand(zone); |
int assigned_reg = op->index(); |
if (op->IsDoubleRegister()) { |
trace_.Add(" \"%s\"", |