Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index a9d03a9c4f50778749c5e0fc523df7ddfe26e930..78b7a04d58ff1f21ce4f285264b836983599e70b 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -993,8 +993,7 @@ void HGraphBuilder::AddSimulate(BailoutId id, |
HReturn* HGraphBuilder::AddReturn(HValue* value) { |
HValue* context = environment()->LookupContext(); |
int num_parameters = graph()->info()->num_parameters(); |
- HValue* params = AddInstruction(new(graph()->zone()) |
- HConstant(num_parameters)); |
+ HValue* params = Add<HConstant>(num_parameters); |
HReturn* return_instruction = new(graph()->zone()) |
HReturn(value, context, params); |
current_block()->FinishExit(return_instruction); |
@@ -1020,9 +1019,7 @@ HBasicBlock* HGraphBuilder::CreateLoopHeaderBlock() { |
HValue* HGraphBuilder::BuildCheckHeapObject(HValue* obj) { |
if (obj->type().IsHeapObject()) return obj; |
- HCheckHeapObject* check = new(zone()) HCheckHeapObject(obj); |
- AddInstruction(check); |
- return check; |
+ return Add<HCheckHeapObject>(obj); |
} |
@@ -1046,7 +1043,7 @@ HInstruction* HGraphBuilder::BuildExternalArrayElementAccess( |
ASSERT(val != NULL); |
switch (elements_kind) { |
case EXTERNAL_PIXEL_ELEMENTS: { |
- val = AddInstruction(new(zone) HClampToUint8(val)); |
+ val = Add<HClampToUint8>(val); |
break; |
} |
case EXTERNAL_BYTE_ELEMENTS: |
@@ -1133,8 +1130,7 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
length_checker.IfCompare(length, key, Token::EQ); |
length_checker.Then(); |
- HValue* current_capacity = |
- AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
+ HValue* current_capacity = Add<HFixedArrayBaseLength>(elements); |
IfBuilder capacity_checker(this); |
@@ -1182,7 +1178,6 @@ HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object, |
HValue* elements, |
ElementsKind kind, |
HValue* length) { |
- Zone* zone = this->zone(); |
Heap* heap = isolate()->heap(); |
IfBuilder cow_checker(this); |
@@ -1191,8 +1186,7 @@ HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object, |
Handle<Map>(heap->fixed_cow_array_map())); |
cow_checker.Then(); |
- HValue* capacity = |
- AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
+ HValue* capacity = Add<HFixedArrayBaseLength>(elements); |
HValue* new_elements = BuildGrowElementsCapacity(object, elements, |
kind, length, capacity); |
@@ -1249,15 +1243,14 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
Representation::Smi()); |
length->set_type(HType::Smi()); |
} else { |
- length = AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
+ length = Add<HFixedArrayBaseLength>(elements); |
} |
HValue* checked_key = NULL; |
if (IsExternalArrayElementsKind(elements_kind)) { |
if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { |
NoObservableSideEffectsScope no_effects(this); |
HLoadExternalArrayPointer* external_elements = |
- new(zone) HLoadExternalArrayPointer(elements); |
- AddInstruction(external_elements); |
+ Add<HLoadExternalArrayPointer>(elements); |
IfBuilder length_checker(this); |
length_checker.IfCompare(key, length, Token::LT); |
length_checker.Then(); |
@@ -1276,8 +1269,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
ASSERT(store_mode == STANDARD_STORE); |
checked_key = Add<HBoundsCheck>(key, length); |
HLoadExternalArrayPointer* external_elements = |
- new(zone) HLoadExternalArrayPointer(elements); |
- AddInstruction(external_elements); |
+ Add<HLoadExternalArrayPointer>(elements); |
return AddInstruction(BuildExternalArrayElementAccess( |
external_elements, checked_key, val, mapcheck, |
elements_kind, is_store)); |
@@ -1292,8 +1284,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
// deopt, leaving the backing store in an invalid state. |
if (is_store && IsFastSmiElementsKind(elements_kind) && |
!val->type().IsSmi()) { |
- val = AddInstruction(new(zone) HForceRepresentation( |
- val, Representation::Smi())); |
+ val = Add<HForceRepresentation>(val, Representation::Smi()); |
} |
if (IsGrowStoreMode(store_mode)) { |
@@ -1331,14 +1322,12 @@ HValue* HGraphBuilder::BuildAllocateElements(HValue* context, |
int elements_size = IsFastDoubleElementsKind(kind) |
? kDoubleSize : kPointerSize; |
- HConstant* elements_size_value = new(zone) HConstant(elements_size); |
- AddInstruction(elements_size_value); |
+ HConstant* elements_size_value = Add<HConstant>(elements_size); |
HValue* mul = AddInstruction( |
HMul::New(zone, context, capacity, elements_size_value)); |
mul->ClearFlag(HValue::kCanOverflow); |
- HConstant* header_size = new(zone) HConstant(FixedArray::kHeaderSize); |
- AddInstruction(header_size); |
+ HConstant* header_size = Add<HConstant>(FixedArray::kHeaderSize); |
HValue* total_size = AddInstruction( |
HAdd::New(zone, context, mul, header_size)); |
total_size->ClearFlag(HValue::kCanOverflow); |
@@ -1356,10 +1345,7 @@ HValue* HGraphBuilder::BuildAllocateElements(HValue* context, |
} |
} |
- HValue* elements = |
- AddInstruction(new(zone) HAllocate(context, total_size, |
- HType::JSArray(), flags)); |
- return elements; |
+ return Add<HAllocate>(context, total_size, HType::JSArray(), flags); |
} |
@@ -1398,8 +1384,7 @@ HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, |
AddStore(array, HObjectAccess::ForMap(), array_map); |
HConstant* empty_fixed_array = |
- new(zone()) HConstant(isolate()->factory()->empty_fixed_array()); |
- AddInstruction(empty_fixed_array); |
+ Add<HConstant>(isolate()->factory()->empty_fixed_array()); |
HObjectAccess access = HObjectAccess::ForPropertiesPointer(); |
AddStore(array, access, empty_fixed_array); |
@@ -1416,10 +1401,8 @@ HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, |
elements_location += AllocationSiteInfo::kSize; |
} |
- HInnerAllocatedObject* elements = new(zone()) HInnerAllocatedObject( |
- array, elements_location); |
- AddInstruction(elements); |
- |
+ HInnerAllocatedObject* elements = |
+ Add<HInnerAllocatedObject>(array, elements_location); |
AddStore(array, HObjectAccess::ForElementsPointer(), elements); |
return elements; |
} |
@@ -1443,7 +1426,7 @@ HValue* HGraphBuilder::BuildNewElementsCapacity(HValue* context, |
HAdd::New(zone, context, half_old_capacity, old_capacity)); |
new_capacity->ClearFlag(HValue::kCanOverflow); |
- HValue* min_growth = AddInstruction(new(zone) HConstant(16)); |
+ HValue* min_growth = Add<HConstant>(16); |
new_capacity = AddInstruction( |
HAdd::New(zone, context, new_capacity, min_growth)); |
@@ -1454,17 +1437,15 @@ HValue* HGraphBuilder::BuildNewElementsCapacity(HValue* context, |
void HGraphBuilder::BuildNewSpaceArrayCheck(HValue* length, ElementsKind kind) { |
- Zone* zone = this->zone(); |
Heap* heap = isolate()->heap(); |
int element_size = IsFastDoubleElementsKind(kind) ? kDoubleSize |
: kPointerSize; |
int max_size = heap->MaxRegularSpaceAllocationSize() / element_size; |
max_size -= JSArray::kSize / element_size; |
- HConstant* max_size_constant = new(zone) HConstant(max_size); |
- AddInstruction(max_size_constant); |
+ HConstant* max_size_constant = Add<HConstant>(max_size); |
// Since we're forcing Integer32 representation for this HBoundsCheck, |
// there's no need to Smi-check the index. |
- AddInstruction(new(zone) HBoundsCheck(length, max_size_constant)); |
+ Add<HBoundsCheck>(length, max_size_constant); |
} |
@@ -1500,10 +1481,9 @@ void HGraphBuilder::BuildFillElementsWithHole(HValue* context, |
Factory* factory = isolate()->factory(); |
double nan_double = FixedDoubleArray::hole_nan_as_double(); |
- Zone* zone = this->zone(); |
HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) |
- ? AddInstruction(new(zone) HConstant(factory->the_hole_value())) |
- : AddInstruction(new(zone) HConstant(nan_double)); |
+ ? Add<HConstant>(factory->the_hole_value()) |
+ : Add<HConstant>(nan_double); |
// Special loop unfolding case |
static const int kLoopUnfoldLimit = 4; |
@@ -1530,15 +1510,15 @@ void HGraphBuilder::BuildFillElementsWithHole(HValue* context, |
if (unfold_loop) { |
for (int i = 0; i < initial_capacity; i++) { |
- HInstruction* key = AddInstruction(new(zone) HConstant(i)); |
- AddInstruction(new(zone) HStoreKeyed(elements, key, hole, elements_kind)); |
+ HInstruction* key = Add<HConstant>(i); |
+ Add<HStoreKeyed>(elements, key, hole, elements_kind); |
} |
} else { |
LoopBuilder builder(this, context, LoopBuilder::kPostIncrement); |
HValue* key = builder.BeginBody(from, to, Token::LT); |
- AddInstruction(new(zone) HStoreKeyed(elements, key, hole, elements_kind)); |
+ Add<HStoreKeyed>(elements, key, hole, elements_kind); |
builder.EndBody(); |
} |
@@ -1568,15 +1548,15 @@ void HGraphBuilder::BuildCopyElements(HValue* context, |
HValue* key = builder.BeginBody(graph()->GetConstant0(), length, Token::LT); |
- HValue* element = |
- AddInstruction(new(zone()) HLoadKeyed(from_elements, key, NULL, |
- from_elements_kind, |
- ALLOW_RETURN_HOLE)); |
+ HValue* element = Add<HLoadKeyed>(from_elements, key, |
+ static_cast<HValue*>(NULL), |
+ from_elements_kind, |
+ ALLOW_RETURN_HOLE); |
ElementsKind holey_kind = IsFastSmiElementsKind(to_elements_kind) |
? FAST_HOLEY_ELEMENTS : to_elements_kind; |
- HInstruction* holey_store = AddInstruction( |
- new(zone()) HStoreKeyed(to_elements, key, element, holey_kind)); |
+ HInstruction* holey_store = Add<HStoreKeyed>(to_elements, key, |
+ element, holey_kind); |
// Allow NaN hole values to converted to their tagged counterparts. |
if (IsFastHoleyElementsKind(to_elements_kind)) { |
holey_store->SetFlag(HValue::kAllowUndefinedAsNaN); |
@@ -1597,8 +1577,6 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
AllocationSiteMode mode, |
ElementsKind kind, |
int length) { |
- Zone* zone = this->zone(); |
- |
NoObservableSideEffectsScope no_effects(this); |
// All sizes here are multiples of kPointerSize. |
@@ -1616,12 +1594,11 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
HAllocate::Flags allocate_flags = HAllocate::DefaultFlags(kind); |
// Allocate both the JS array and the elements array in one big |
// allocation. This avoids multiple limit checks. |
- HValue* size_in_bytes = AddInstruction(new(zone) HConstant(size)); |
- HInstruction* object = |
- AddInstruction(new(zone) HAllocate(context, |
- size_in_bytes, |
- HType::JSObject(), |
- allocate_flags)); |
+ HValue* size_in_bytes = Add<HConstant>(size); |
+ HInstruction* object = Add<HAllocate>(context, |
+ size_in_bytes, |
+ HType::JSObject(), |
+ allocate_flags); |
// Copy the JS array part. |
for (int i = 0; i < JSArray::kSize; i += kPointerSize) { |
@@ -1640,8 +1617,7 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
// Get hold of the elements array of the boilerplate and setup the |
// elements pointer in the resulting object. |
HValue* boilerplate_elements = AddLoadElements(boilerplate); |
- HValue* object_elements = |
- AddInstruction(new(zone) HInnerAllocatedObject(object, elems_offset)); |
+ HValue* object_elements = Add<HInnerAllocatedObject>(object, elems_offset); |
AddStore(object, HObjectAccess::ForElementsPointer(), object_elements); |
// Copy the elements array header. |
@@ -1655,16 +1631,10 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
// copying loops with constant length up to a given boundary and use this |
// helper here instead. |
for (int i = 0; i < length; i++) { |
- HValue* key_constant = AddInstruction(new(zone) HConstant(i)); |
- HInstruction* value = |
- AddInstruction(new(zone) HLoadKeyed(boilerplate_elements, |
- key_constant, |
- NULL, |
- kind)); |
- AddInstruction(new(zone) HStoreKeyed(object_elements, |
- key_constant, |
- value, |
- kind)); |
+ HValue* key_constant = Add<HConstant>(i); |
+ HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant, |
+ static_cast<HValue*>(NULL), kind); |
+ Add<HStoreKeyed>(object_elements, key_constant, value, kind); |
} |
} |
@@ -1715,9 +1685,8 @@ void HGraphBuilder::BuildCompareNil( |
HValue* HGraphBuilder::BuildCreateAllocationSiteInfo(HValue* previous_object, |
int previous_object_size, |
HValue* payload) { |
- HInnerAllocatedObject* alloc_site = new(zone()) |
- HInnerAllocatedObject(previous_object, previous_object_size); |
- AddInstruction(alloc_site); |
+ HInnerAllocatedObject* alloc_site = Add<HInnerAllocatedObject>( |
+ previous_object, previous_object_size); |
Handle<Map> alloc_site_map(isolate()->heap()->allocation_site_info_map()); |
AddStoreMapConstant(alloc_site, alloc_site_map); |
HObjectAccess access = HObjectAccess::ForAllocationSitePayload(); |
@@ -1728,8 +1697,7 @@ HValue* HGraphBuilder::BuildCreateAllocationSiteInfo(HValue* previous_object, |
HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* context) { |
// Get the global context, then the native context |
- HInstruction* global_object = AddInstruction(new(zone()) |
- HGlobalObject(context)); |
+ HInstruction* global_object = Add<HGlobalObject>(context); |
HObjectAccess access = HObjectAccess::ForJSObjectOffset( |
GlobalObject::kNativeContextOffset); |
return AddLoad(global_object, access); |
@@ -1738,11 +1706,9 @@ HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* context) { |
HInstruction* HGraphBuilder::BuildGetArrayFunction(HValue* context) { |
HInstruction* native_context = BuildGetNativeContext(context); |
- HInstruction* index = AddInstruction(new(zone()) |
- HConstant(Context::ARRAY_FUNCTION_INDEX)); |
- |
- return AddInstruction(new (zone()) |
- HLoadKeyed(native_context, index, NULL, FAST_ELEMENTS)); |
+ HInstruction* index = Add<HConstant>(Context::ARRAY_FUNCTION_INDEX); |
+ return Add<HLoadKeyed>( |
+ native_context, index, static_cast<HValue*>(NULL), FAST_ELEMENTS); |
} |
@@ -1774,24 +1740,22 @@ HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder, |
HValue* HGraphBuilder::JSArrayBuilder::EmitMapCode(HValue* context) { |
HInstruction* native_context = builder()->BuildGetNativeContext(context); |
- HInstruction* index = builder()->AddInstruction(new(zone()) |
- HConstant(Context::JS_ARRAY_MAPS_INDEX)); |
+ HInstruction* index = builder()->Add<HConstant>(Context::JS_ARRAY_MAPS_INDEX); |
- HInstruction* map_array = builder()->AddInstruction(new(zone()) |
- HLoadKeyed(native_context, index, NULL, FAST_ELEMENTS)); |
+ HInstruction* map_array = builder()->Add<HLoadKeyed>( |
+ native_context, index, static_cast<HValue*>(NULL), FAST_ELEMENTS); |
- HInstruction* kind_index = builder()->AddInstruction(new(zone()) |
- HConstant(kind_)); |
+ HInstruction* kind_index = builder()->Add<HConstant>(kind_); |
- return builder()->AddInstruction(new(zone()) |
- HLoadKeyed(map_array, kind_index, NULL, FAST_ELEMENTS)); |
+ return builder()->Add<HLoadKeyed>( |
+ map_array, kind_index, static_cast<HValue*>(NULL), FAST_ELEMENTS); |
} |
HValue* HGraphBuilder::JSArrayBuilder::EmitInternalMapCode() { |
// Find the map near the constructor function |
HObjectAccess access = HObjectAccess::ForPrototypeOrInitialMap(); |
- return AddInstruction( |
+ return builder()->AddInstruction( |
builder()->BuildLoadNamedField(constructor_function_, |
access, |
Representation::Tagged())); |
@@ -1814,18 +1778,17 @@ HValue* HGraphBuilder::JSArrayBuilder::EstablishAllocationSize( |
base_size += FixedArray::kHeaderSize; |
} |
- HInstruction* elements_size_value = new(zone()) HConstant(elements_size()); |
- AddInstruction(elements_size_value); |
+ HInstruction* elements_size_value = |
+ builder()->Add<HConstant>(elements_size()); |
HInstruction* mul = HMul::New(zone(), context, length_node, |
elements_size_value); |
mul->ClearFlag(HValue::kCanOverflow); |
- AddInstruction(mul); |
+ builder()->AddInstruction(mul); |
- HInstruction* base = new(zone()) HConstant(base_size); |
- AddInstruction(base); |
+ HInstruction* base = builder()->Add<HConstant>(base_size); |
HInstruction* total_size = HAdd::New(zone(), context, base, mul); |
total_size->ClearFlag(HValue::kCanOverflow); |
- AddInstruction(total_size); |
+ builder()->AddInstruction(total_size); |
return total_size; |
} |
@@ -1840,16 +1803,13 @@ HValue* HGraphBuilder::JSArrayBuilder::EstablishEmptyArrayAllocationSize() { |
? FixedDoubleArray::SizeFor(initial_capacity()) |
: FixedArray::SizeFor(initial_capacity()); |
- HConstant* array_size = new(zone()) HConstant(base_size); |
- AddInstruction(array_size); |
- return array_size; |
+ return builder()->Add<HConstant>(base_size); |
} |
HValue* HGraphBuilder::JSArrayBuilder::AllocateEmptyArray() { |
HValue* size_in_bytes = EstablishEmptyArrayAllocationSize(); |
- HConstant* capacity = new(zone()) HConstant(initial_capacity()); |
- AddInstruction(capacity); |
+ HConstant* capacity = builder()->Add<HConstant>(initial_capacity()); |
return AllocateArray(size_in_bytes, |
capacity, |
builder()->graph()->GetConstant0(), |
@@ -1873,9 +1833,8 @@ HValue* HGraphBuilder::JSArrayBuilder::AllocateArray(HValue* size_in_bytes, |
// Allocate (dealing with failure appropriately) |
HAllocate::Flags flags = HAllocate::DefaultFlags(kind_); |
- HAllocate* new_object = new(zone()) HAllocate(context, size_in_bytes, |
- HType::JSArray(), flags); |
- AddInstruction(new_object); |
+ HAllocate* new_object = builder()->Add<HAllocate>(context, size_in_bytes, |
+ HType::JSArray(), flags); |
// Fill in the fields: map, properties, length |
HValue* map; |
@@ -1906,10 +1865,7 @@ HStoreNamedField* HGraphBuilder::AddStore(HValue *object, |
HObjectAccess access, |
HValue *val, |
Representation representation) { |
- HStoreNamedField *instr = new(zone()) |
- HStoreNamedField(object, access, val, representation); |
- AddInstruction(instr); |
- return instr; |
+ return Add<HStoreNamedField>(object, access, val, representation); |
} |
@@ -1917,20 +1873,14 @@ HLoadNamedField* HGraphBuilder::AddLoad(HValue *object, |
HObjectAccess access, |
HValue *typecheck, |
Representation representation) { |
- HLoadNamedField *instr = |
- new(zone()) HLoadNamedField(object, access, typecheck, representation); |
- AddInstruction(instr); |
- return instr; |
+ return Add<HLoadNamedField>(object, access, typecheck, representation); |
} |
HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object, |
Handle<Map> map) { |
- HValue* constant = AddInstruction(new(zone()) HConstant(map)); |
- HStoreNamedField *instr = |
- new(zone()) HStoreNamedField(object, HObjectAccess::ForMap(), constant); |
- AddInstruction(instr); |
- return instr; |
+ return Add<HStoreNamedField>(object, HObjectAccess::ForMap(), |
+ Add<HConstant>(map)); |
} |
@@ -3702,7 +3652,7 @@ void HOptimizedGraphBuilder::VisitForControl(Expression* expr, |
void HOptimizedGraphBuilder::VisitArgument(Expression* expr) { |
CHECK_ALIVE(VisitForValue(expr)); |
- Push(AddInstruction(new(zone()) HPushArgument(Pop()))); |
+ Push(Add<HPushArgument>(Pop())); |
} |
@@ -3768,8 +3718,7 @@ bool HOptimizedGraphBuilder::BuildGraph() { |
AddSimulate(BailoutId::Declarations()); |
HValue* context = environment()->LookupContext(); |
- AddInstruction( |
- new(zone()) HStackCheck(context, HStackCheck::kFunctionEntry)); |
+ Add<HStackCheck>(context, HStackCheck::kFunctionEntry); |
VisitStatements(current_info()->function()->body()); |
if (HasStackOverflow()) return false; |
@@ -4495,7 +4444,7 @@ void HOptimizedGraphBuilder::AddSoftDeoptimize() { |
isolate()->counters()->soft_deopts_requested()->Increment(); |
if (FLAG_always_opt) return; |
if (current_block()->IsDeoptimizing()) return; |
- AddInstruction(new(zone()) HSoftDeoptimize()); |
+ Add<HSoftDeoptimize>(); |
isolate()->counters()->soft_deopts_inserted()->Increment(); |
current_block()->MarkAsDeoptimizing(); |
graph()->set_has_soft_deoptimize(true); |
@@ -4511,16 +4460,15 @@ HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) { |
} |
while (!arguments.is_empty()) { |
- AddInstruction(new(zone()) HPushArgument(arguments.RemoveLast())); |
+ Add<HPushArgument>(arguments.RemoveLast()); |
} |
return call; |
} |
void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { |
- HConstant* undefined_constant = new(zone()) HConstant( |
+ HConstant* undefined_constant = Add<HConstant>( |
isolate()->factory()->undefined_value()); |
- AddInstruction(undefined_constant); |
graph()->set_undefined_constant(undefined_constant); |
// Create an arguments object containing the initial parameters. Set the |
@@ -4529,7 +4477,7 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { |
HArgumentsObject* arguments_object = |
new(zone()) HArgumentsObject(environment()->parameter_count(), zone()); |
for (int i = 0; i < environment()->parameter_count(); ++i) { |
- HInstruction* parameter = AddInstruction(new(zone()) HParameter(i)); |
+ HInstruction* parameter = Add<HParameter>(i); |
arguments_object->AddArgument(parameter, zone()); |
environment()->Bind(i, parameter); |
} |
@@ -4537,7 +4485,7 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { |
graph()->SetArgumentsObject(arguments_object); |
// First special is HContext. |
- HInstruction* context = AddInstruction(new(zone()) HContext); |
+ HInstruction* context = Add<HContext>(); |
environment()->BindContext(context); |
// Initialize specials and locals to undefined. |
@@ -4976,8 +4924,7 @@ bool HOptimizedGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
new(zone()) ZoneList<HUnknownOSRValue*>(length, zone()); |
for (int i = 0; i < first_expression_index; ++i) { |
- HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; |
- AddInstruction(osr_value); |
+ HUnknownOSRValue* osr_value = Add<HUnknownOSRValue>(); |
environment()->Bind(i, osr_value); |
osr_values->Add(osr_value, zone()); |
} |
@@ -4985,8 +4932,7 @@ bool HOptimizedGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
if (first_expression_index != length) { |
environment()->Drop(length - first_expression_index); |
for (int i = first_expression_index; i < length; ++i) { |
- HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; |
- AddInstruction(osr_value); |
+ HUnknownOSRValue* osr_value = Add<HUnknownOSRValue>(); |
environment()->Push(osr_value); |
osr_values->Add(osr_value, zone()); |
} |
@@ -4995,9 +4941,8 @@ bool HOptimizedGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
graph()->set_osr_values(osr_values); |
AddSimulate(osr_entry_id); |
- AddInstruction(new(zone()) HOsrEntry(osr_entry_id)); |
- HContext* context = new(zone()) HContext; |
- AddInstruction(context); |
+ Add<HOsrEntry>(osr_entry_id); |
+ HContext* context = Add<HContext>(); |
environment()->BindContext(context); |
current_block()->Goto(loop_predecessor); |
loop_predecessor->SetJoinId(statement->EntryId()); |
@@ -5012,9 +4957,8 @@ void HOptimizedGraphBuilder::VisitLoopBody(IterationStatement* stmt, |
BreakAndContinueScope push(break_info, this); |
AddSimulate(stmt->StackCheckId()); |
HValue* context = environment()->LookupContext(); |
- HStackCheck* stack_check = |
- new(zone()) HStackCheck(context, HStackCheck::kBackwardsBranch); |
- AddInstruction(stack_check); |
+ HStackCheck* stack_check = Add<HStackCheck>( |
+ context, HStackCheck::kBackwardsBranch); |
ASSERT(loop_entry->IsLoopHeader()); |
loop_entry->loop_information()->set_stack_check(stack_check); |
CHECK_BAILOUT(Visit(stmt->body())); |
@@ -5183,30 +5127,24 @@ void HOptimizedGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
CHECK_ALIVE(VisitForValue(stmt->enumerable())); |
HValue* enumerable = Top(); // Leave enumerable at the top. |
- HInstruction* map = AddInstruction(new(zone()) HForInPrepareMap( |
- environment()->LookupContext(), enumerable)); |
+ HInstruction* map = Add<HForInPrepareMap>( |
+ environment()->LookupContext(), enumerable); |
AddSimulate(stmt->PrepareId()); |
- HInstruction* array = AddInstruction( |
- new(zone()) HForInCacheArray( |
- enumerable, |
- map, |
- DescriptorArray::kEnumCacheBridgeCacheIndex)); |
+ HInstruction* array = Add<HForInCacheArray>( |
+ enumerable, map, DescriptorArray::kEnumCacheBridgeCacheIndex); |
- HInstruction* enum_length = AddInstruction(new(zone()) HMapEnumLength(map)); |
+ HInstruction* enum_length = Add<HMapEnumLength>(map); |
- HInstruction* start_index = AddInstruction(new(zone()) HConstant(0)); |
+ HInstruction* start_index = Add<HConstant>(0); |
Push(map); |
Push(array); |
Push(enum_length); |
Push(start_index); |
- HInstruction* index_cache = AddInstruction( |
- new(zone()) HForInCacheArray( |
- enumerable, |
- map, |
- DescriptorArray::kEnumCacheBridgeIndicesCacheIndex)); |
+ HInstruction* index_cache = Add<HForInCacheArray>( |
+ enumerable, map, DescriptorArray::kEnumCacheBridgeIndicesCacheIndex); |
HForInCacheArray::cast(array)->set_index_cache( |
HForInCacheArray::cast(index_cache)); |
@@ -5237,18 +5175,16 @@ void HOptimizedGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
set_current_block(loop_body); |
- HValue* key = AddInstruction( |
- new(zone()) HLoadKeyed( |
- environment()->ExpressionStackAt(2), // Enum cache. |
- environment()->ExpressionStackAt(0), // Iteration index. |
- environment()->ExpressionStackAt(0), |
- FAST_ELEMENTS)); |
+ HValue* key = Add<HLoadKeyed>( |
+ environment()->ExpressionStackAt(2), // Enum cache. |
+ environment()->ExpressionStackAt(0), // Iteration index. |
+ environment()->ExpressionStackAt(0), |
+ FAST_ELEMENTS); |
// Check if the expected map still matches that of the enumerable. |
// If not just deoptimize. |
- AddInstruction(new(zone()) HCheckMapValue( |
- environment()->ExpressionStackAt(4), |
- environment()->ExpressionStackAt(3))); |
+ Add<HCheckMapValue>(environment()->ExpressionStackAt(4), |
+ environment()->ExpressionStackAt(3)); |
Bind(each_var, key); |
@@ -5421,9 +5357,7 @@ HValue* HOptimizedGraphBuilder::BuildContextChainWalk(Variable* var) { |
HValue* context = environment()->LookupContext(); |
int length = current_info()->scope()->ContextChainLength(var->scope()); |
while (length-- > 0) { |
- HInstruction* context_instruction = new(zone()) HOuterContext(context); |
- AddInstruction(context_instruction); |
- context = context_instruction; |
+ context = Add<HOuterContext>(context); |
} |
return context; |
} |
@@ -5729,23 +5663,18 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
flags |= expr->has_function() |
? ObjectLiteral::kHasFunction : ObjectLiteral::kNoFlags; |
- AddInstruction(new(zone()) HPushArgument(AddInstruction( |
- new(zone()) HConstant(closure_literals)))); |
- AddInstruction(new(zone()) HPushArgument(AddInstruction( |
- new(zone()) HConstant(literal_index)))); |
- AddInstruction(new(zone()) HPushArgument(AddInstruction( |
- new(zone()) HConstant(constant_properties)))); |
- AddInstruction(new(zone()) HPushArgument(AddInstruction( |
- new(zone()) HConstant(flags)))); |
+ Add<HPushArgument>(Add<HConstant>(closure_literals)); |
+ Add<HPushArgument>(Add<HConstant>(literal_index)); |
+ Add<HPushArgument>(Add<HConstant>(constant_properties)); |
+ Add<HPushArgument>(Add<HConstant>(flags)); |
Runtime::FunctionId function_id = |
(expr->depth() > 1 || expr->may_store_doubles()) |
? Runtime::kCreateObjectLiteral : Runtime::kCreateObjectLiteralShallow; |
- literal = AddInstruction( |
- new(zone()) HCallRuntime(context, |
- isolate()->factory()->empty_string(), |
- Runtime::FunctionForId(function_id), |
- 4)); |
+ literal = Add<HCallRuntime>(context, |
+ isolate()->factory()->empty_string(), |
+ Runtime::FunctionForId(function_id), |
+ 4); |
} |
// The object is expected in the bailout environment during computation |
@@ -5811,8 +5740,7 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
// of the object. This makes sure that the original object won't |
// be used by other optimized code before it is transformed |
// (e.g. because of code motion). |
- HToFastProperties* result = new(zone()) HToFastProperties(Pop()); |
- AddInstruction(result); |
+ HToFastProperties* result = Add<HToFastProperties>(Pop()); |
return ast_context()->ReturnValue(result); |
} else { |
return ast_context()->ReturnValue(Pop()); |
@@ -5884,20 +5812,16 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array(); |
int literal_index = expr->literal_index(); |
- AddInstruction(new(zone()) HPushArgument(AddInstruction( |
- new(zone()) HConstant(literals)))); |
- AddInstruction(new(zone()) HPushArgument(AddInstruction( |
- new(zone()) HConstant(literal_index)))); |
- AddInstruction(new(zone()) HPushArgument(AddInstruction( |
- new(zone()) HConstant(constants)))); |
+ Add<HPushArgument>(Add<HConstant>(literals)); |
+ Add<HPushArgument>(Add<HConstant>(literal_index)); |
+ Add<HPushArgument>(Add<HConstant>(constants)); |
Runtime::FunctionId function_id = (expr->depth() > 1) |
? Runtime::kCreateArrayLiteral : Runtime::kCreateArrayLiteralShallow; |
- literal = AddInstruction( |
- new(zone()) HCallRuntime(context, |
- isolate()->factory()->empty_string(), |
- Runtime::FunctionForId(function_id), |
- 3)); |
+ literal = Add<HCallRuntime>(context, |
+ isolate()->factory()->empty_string(), |
+ Runtime::FunctionForId(function_id), |
+ 3); |
// De-opt if elements kind changed from boilerplate_elements_kind. |
Handle<Map> map = Handle<Map>(original_boilerplate_object->map(), |
@@ -5909,7 +5833,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
// of the property values and is the value of the entire expression. |
Push(literal); |
// The literal index is on the stack, too. |
- Push(AddInstruction(new(zone()) HConstant(expr->literal_index()))); |
+ Push(Add<HConstant>(expr->literal_index())); |
HInstruction* elements = NULL; |
@@ -5925,7 +5849,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
elements = AddLoadElements(literal); |
- HValue* key = AddInstruction(new(zone()) HConstant(i)); |
+ HValue* key = Add<HConstant>(i); |
switch (boilerplate_elements_kind) { |
case FAST_SMI_ELEMENTS: |
@@ -5934,11 +5858,8 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
case FAST_HOLEY_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
case FAST_HOLEY_DOUBLE_ELEMENTS: |
- AddInstruction(new(zone()) HStoreKeyed( |
- elements, |
- key, |
- value, |
- boilerplate_elements_kind)); |
+ Add<HStoreKeyed>(elements, key, value, |
+ boilerplate_elements_kind); |
break; |
default: |
UNREACHABLE(); |
@@ -6035,11 +5956,9 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
ASSERT(proto->GetPrototype(isolate())->IsNull()); |
} |
ASSERT(proto->IsJSObject()); |
- AddInstruction(new(zone()) HCheckPrototypeMaps( |
- Handle<JSObject>(JSObject::cast(map->prototype())), |
- Handle<JSObject>(JSObject::cast(proto)), |
- zone(), |
- top_info())); |
+ Add<HCheckPrototypeMaps>(Handle<JSObject>(JSObject::cast(map->prototype())), |
+ Handle<JSObject>(JSObject::cast(proto)), |
+ zone(), top_info()); |
} |
HObjectAccess field_access = HObjectAccess::ForField(map, lookup, name); |
@@ -6051,11 +5970,10 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
if (transition_to_field) { |
// The store requires a mutable HeapNumber to be allocated. |
NoObservableSideEffectsScope no_side_effects(this); |
- HInstruction* heap_number_size = AddInstruction(new(zone()) HConstant( |
- HeapNumber::kSize)); |
- HInstruction* double_box = AddInstruction(new(zone()) HAllocate( |
+ HInstruction* heap_number_size = Add<HConstant>(HeapNumber::kSize); |
+ HInstruction* double_box = Add<HAllocate>( |
environment()->LookupContext(), heap_number_size, |
- HType::HeapNumber(), HAllocate::CAN_ALLOCATE_IN_NEW_SPACE)); |
+ HType::HeapNumber(), HAllocate::CAN_ALLOCATE_IN_NEW_SPACE); |
AddStoreMapConstant(double_box, isolate()->factory()->heap_number_map()); |
AddStore(double_box, HObjectAccess::ForHeapNumberValue(), |
value, Representation::Double()); |
@@ -6105,8 +6023,8 @@ HInstruction* HOptimizedGraphBuilder::BuildCallSetter( |
Handle<JSFunction> setter, |
Handle<JSObject> holder) { |
AddCheckConstantFunction(holder, object, map); |
- AddInstruction(new(zone()) HPushArgument(object)); |
- AddInstruction(new(zone()) HPushArgument(value)); |
+ Add<HPushArgument>(object); |
+ Add<HPushArgument>(value); |
return new(zone()) HCallConstantFunction(setter, 2); |
} |
@@ -6386,25 +6304,19 @@ void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
if (type == kUseCell) { |
Handle<GlobalObject> global(current_info()->global_object()); |
Handle<PropertyCell> cell(global->GetPropertyCell(&lookup)); |
- HInstruction* instr = |
- new(zone()) HStoreGlobalCell(value, cell, lookup.GetPropertyDetails()); |
+ HInstruction* instr = Add<HStoreGlobalCell>(value, cell, |
+ lookup.GetPropertyDetails()); |
instr->set_position(position); |
- AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(ast_id, REMOVABLE_SIMULATE); |
} |
} else { |
HValue* context = environment()->LookupContext(); |
- HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
- AddInstruction(global_object); |
+ HGlobalObject* global_object = Add<HGlobalObject>(context); |
HStoreGlobalGeneric* instr = |
- new(zone()) HStoreGlobalGeneric(context, |
- global_object, |
- var->name(), |
- value, |
- function_strict_mode_flag()); |
+ Add<HStoreGlobalGeneric>(context, global_object, var->name(), |
+ value, function_strict_mode_flag()); |
instr->set_position(position); |
- AddInstruction(instr); |
ASSERT(instr->HasObservableSideEffects()); |
AddSimulate(ast_id, REMOVABLE_SIMULATE); |
} |
@@ -6440,8 +6352,8 @@ void HOptimizedGraphBuilder::BuildStoreNamed(Expression* expr, |
return; |
} |
Drop(2); |
- AddInstruction(new(zone()) HPushArgument(object)); |
- AddInstruction(new(zone()) HPushArgument(value)); |
+ Add<HPushArgument>(object); |
+ Add<HPushArgument>(value); |
instr = new(zone()) HCallConstantFunction(setter, 2); |
} else { |
Drop(2); |
@@ -6538,9 +6450,8 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
} |
HValue* context = BuildContextChainWalk(var); |
- HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), mode, Top()); |
- AddInstruction(instr); |
+ HStoreContextSlot* instr = Add<HStoreContextSlot>(context, var->index(), |
+ mode, Top()); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
} |
@@ -6670,7 +6581,7 @@ void HOptimizedGraphBuilder::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(zone()) HUseConst(old_value)); |
+ Add<HUseConst>(old_value); |
} |
} else if (var->mode() == CONST_HARMONY) { |
if (expr->op() != Token::INIT_CONST_HARMONY) { |
@@ -6751,9 +6662,8 @@ void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) { |
} |
HValue* context = BuildContextChainWalk(var); |
- HStoreContextSlot* instr = new(zone()) HStoreContextSlot( |
- context, var->index(), mode, Top()); |
- AddInstruction(instr); |
+ HStoreContextSlot* instr = Add<HStoreContextSlot>(context, var->index(), |
+ mode, Top()); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
} |
@@ -6787,9 +6697,8 @@ void HOptimizedGraphBuilder::VisitThrow(Throw* expr) { |
HValue* context = environment()->LookupContext(); |
HValue* value = environment()->Pop(); |
- HThrow* instr = new(zone()) HThrow(context, value); |
+ HThrow* instr = Add<HThrow>(context, value); |
instr->set_position(expr->position()); |
- AddInstruction(instr); |
AddSimulate(expr->id()); |
current_block()->FinishExit(new(zone()) HAbnormalExit); |
set_current_block(NULL); |
@@ -6835,7 +6744,7 @@ HInstruction* HOptimizedGraphBuilder::BuildCallGetter( |
Handle<JSFunction> getter, |
Handle<JSObject> holder) { |
AddCheckConstantFunction(holder, object, map); |
- AddInstruction(new(zone()) HPushArgument(object)); |
+ Add<HPushArgument>(object); |
return new(zone()) HCallConstantFunction(getter, 1); |
} |
@@ -6880,9 +6789,8 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic( |
Handle<JSObject> holder(lookup.holder()); |
Handle<Map> holder_map(holder->map()); |
AddCheckMap(object, map); |
- AddInstruction(new(zone()) HCheckPrototypeMaps( |
- prototype, holder, zone(), top_info())); |
- HValue* holder_value = AddInstruction(new(zone()) HConstant(holder)); |
+ Add<HCheckPrototypeMaps>(prototype, holder, zone(), top_info()); |
+ HValue* holder_value = Add<HConstant>(holder); |
return BuildLoadNamedField(holder_value, |
HObjectAccess::ForField(holder_map, &lookup, name), |
ComputeLoadStoreRepresentation(map, &lookup)); |
@@ -6894,8 +6802,7 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic( |
Handle<JSObject> holder(lookup.holder()); |
Handle<Map> holder_map(holder->map()); |
AddCheckMap(object, map); |
- AddInstruction(new(zone()) HCheckPrototypeMaps( |
- prototype, holder, zone(), top_info())); |
+ Add<HCheckPrototypeMaps>(prototype, holder, zone(), top_info()); |
Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*holder_map)); |
return new(zone()) HConstant(function); |
} |
@@ -6932,8 +6839,7 @@ HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess( |
isolate()->IsFastArrayConstructorPrototypeChainIntact()) { |
Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate()); |
Handle<JSObject> object_prototype = isolate()->initial_object_prototype(); |
- AddInstruction(new(zone()) HCheckPrototypeMaps( |
- prototype, object_prototype, zone(), top_info())); |
+ Add<HCheckPrototypeMaps>(prototype, object_prototype, zone(), top_info()); |
load_mode = ALLOW_RETURN_HOLE; |
graph()->MarkDependsOnEmptyArrayProtoElements(); |
} |
@@ -7065,9 +6971,8 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
map->elements_kind(), |
transition_target.at(i)->elements_kind())); |
HValue* context = environment()->LookupContext(); |
- transition = new(zone()) HTransitionElementsKind( |
- context, object, map, transition_target.at(i)); |
- AddInstruction(transition); |
+ transition = Add<HTransitionElementsKind>(context, object, map, |
+ transition_target.at(i)); |
} else { |
type_todo[map->elements_kind()] = true; |
if (IsExternalArrayElementsKind(map->elements_kind())) { |
@@ -7100,8 +7005,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
AddInstruction(HCheckInstanceType::NewIsSpecObject(object, zone())); |
HBasicBlock* join = graph()->CreateBasicBlock(); |
- HInstruction* elements_kind_instr = |
- AddInstruction(new(zone()) HElementsKind(object)); |
+ HInstruction* elements_kind_instr = Add<HElementsKind>(object); |
HInstruction* elements = AddLoadElements(object, checkspec); |
HLoadExternalArrayPointer* external_elements = NULL; |
HInstruction* checked_key = NULL; |
@@ -7122,11 +7026,9 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
LAST_ELEMENTS_KIND); |
if (elements_kind == FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND |
&& todo_external_array) { |
- HInstruction* length = |
- AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
+ HInstruction* length = Add<HFixedArrayBaseLength>(elements); |
checked_key = Add<HBoundsCheck>(key, length); |
- external_elements = new(zone()) HLoadExternalArrayPointer(elements); |
- AddInstruction(external_elements); |
+ external_elements = Add<HLoadExternalArrayPointer>(elements); |
} |
if (type_todo[elements_kind]) { |
HBasicBlock* if_true = graph()->CreateBasicBlock(); |
@@ -7317,8 +7219,7 @@ bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
if (!name->IsOneByteEqualTo(STATIC_ASCII_VECTOR("length"))) return false; |
if (function_state()->outer() == NULL) { |
- HInstruction* elements = AddInstruction( |
- new(zone()) HArgumentsElements(false)); |
+ HInstruction* elements = Add<HArgumentsElements>(false); |
result = new(zone()) HArgumentsLength(elements); |
} else { |
// Number of arguments without receiver. |
@@ -7333,10 +7234,8 @@ bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
HValue* key = Pop(); |
Drop(1); // Arguments object. |
if (function_state()->outer() == NULL) { |
- HInstruction* elements = AddInstruction( |
- new(zone()) HArgumentsElements(false)); |
- HInstruction* length = AddInstruction( |
- new(zone()) HArgumentsLength(elements)); |
+ HInstruction* elements = Add<HArgumentsElements>(false); |
+ HInstruction* length = Add<HArgumentsLength>(elements); |
HInstruction* checked_key = Add<HBoundsCheck>(key, length); |
result = new(zone()) HAccessArgumentsAt(elements, length, checked_key); |
} else { |
@@ -7346,8 +7245,7 @@ bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
HInstruction* elements = function_state()->arguments_elements(); |
int argument_count = environment()-> |
arguments_environment()->parameter_count() - 1; |
- HInstruction* length = AddInstruction(new(zone()) HConstant( |
- argument_count)); |
+ HInstruction* length = Add<HConstant>(argument_count); |
HInstruction* checked_key = Add<HBoundsCheck>(key, length); |
result = new(zone()) HAccessArgumentsAt(elements, length, checked_key); |
} |
@@ -7407,7 +7305,7 @@ void HOptimizedGraphBuilder::VisitProperty(Property* expr) { |
if (LookupGetter(map, name, &getter, &holder)) { |
AddCheckConstantFunction(holder, Top(), map); |
if (FLAG_inline_accessors && TryInlineGetter(getter, expr)) return; |
- AddInstruction(new(zone()) HPushArgument(Pop())); |
+ Add<HPushArgument>(Pop()); |
instr = new(zone()) HCallConstantFunction(getter, 1); |
} else { |
instr = BuildLoadNamedMonomorphic(Pop(), name, expr, map); |
@@ -7449,8 +7347,7 @@ void HOptimizedGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, |
Handle<Map> receiver_map) { |
if (!holder.is_null()) { |
Handle<JSObject> prototype(JSObject::cast(receiver_map->prototype())); |
- AddInstruction(new(zone()) HCheckPrototypeMaps( |
- prototype, holder, zone(), top_info())); |
+ Add<HCheckPrototypeMaps>(prototype, holder, zone(), top_info()); |
} |
} |
@@ -7877,9 +7774,7 @@ bool HOptimizedGraphBuilder::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(zone()) HConstant(Handle<Context>(target->context())); |
- AddInstruction(context); |
+ HConstant* context = Add<HConstant>(Handle<Context>(target->context())); |
inner_env->BindContext(context); |
#endif |
@@ -7893,25 +7788,19 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind, |
ASSERT(function->scope()->arguments()->IsStackAllocated()); |
HEnvironment* arguments_env = inner_env->arguments_environment(); |
int arguments_count = arguments_env->parameter_count(); |
- arguments_object = new(zone()) HArgumentsObject(arguments_count, zone()); |
+ arguments_object = Add<HArgumentsObject>(arguments_count, zone()); |
inner_env->Bind(function->scope()->arguments(), arguments_object); |
for (int i = 0; i < arguments_count; i++) { |
arguments_object->AddArgument(arguments_env->Lookup(i), zone()); |
} |
- AddInstruction(arguments_object); |
} |
HEnterInlined* enter_inlined = |
- new(zone()) HEnterInlined(target, |
- arguments_count, |
- function, |
- function_state()->inlining_kind(), |
- function->scope()->arguments(), |
- arguments_object, |
- undefined_receiver, |
- zone()); |
+ Add<HEnterInlined>(target, arguments_count, function, |
+ function_state()->inlining_kind(), |
+ function->scope()->arguments(), |
+ arguments_object, undefined_receiver, zone()); |
function_state()->set_entry(enter_inlined); |
- AddInstruction(enter_inlined); |
VisitDeclarations(target_info.scope()->declarations()); |
VisitStatements(function->body()); |
@@ -8149,12 +8038,9 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
HValue* string = Pop(); |
HValue* context = environment()->LookupContext(); |
ASSERT(!expr->holder().is_null()); |
- AddInstruction(new(zone()) HCheckPrototypeMaps( |
- Call::GetPrototypeForPrimitiveCheck(STRING_CHECK, |
- expr->holder()->GetIsolate()), |
- expr->holder(), |
- zone(), |
- top_info())); |
+ Add<HCheckPrototypeMaps>(Call::GetPrototypeForPrimitiveCheck( |
+ STRING_CHECK, expr->holder()->GetIsolate()), |
+ expr->holder(), zone(), top_info()); |
HInstruction* char_code = |
BuildStringCharCodeAt(context, string, index); |
if (id == kStringCharCodeAt) { |
@@ -8245,8 +8131,7 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
Drop(1); // Receiver. |
HValue* context = environment()->LookupContext(); |
- HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
- AddInstruction(global_object); |
+ HGlobalObject* global_object = Add<HGlobalObject>(context); |
HRandom* result = new(zone()) HRandom(global_object); |
ast_context()->ReturnInstruction(result, expr->id()); |
return true; |
@@ -8325,12 +8210,9 @@ bool HOptimizedGraphBuilder::TryCallApply(Call* expr) { |
HValue* receiver = Pop(); |
if (function_state()->outer() == NULL) { |
- HInstruction* elements = AddInstruction( |
- new(zone()) HArgumentsElements(false)); |
- HInstruction* length = |
- AddInstruction(new(zone()) HArgumentsLength(elements)); |
- HValue* wrapped_receiver = |
- AddInstruction(new(zone()) HWrapReceiver(receiver, function)); |
+ HInstruction* elements = Add<HArgumentsElements>(false); |
+ HInstruction* length = Add<HArgumentsLength>(elements); |
+ HValue* wrapped_receiver = Add<HWrapReceiver>(receiver, function); |
HInstruction* result = |
new(zone()) HApplyArguments(function, |
wrapped_receiver, |
@@ -8555,14 +8437,12 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* function = Pop(); |
- AddInstruction(new(zone()) HCheckFunction(function, expr->target())); |
+ Add<HCheckFunction>(function, expr->target()); |
// Replace the global object with the global receiver. |
- HGlobalReceiver* global_receiver = |
- new(zone()) HGlobalReceiver(global_object); |
+ HGlobalReceiver* global_receiver = Add<HGlobalReceiver>(global_object); |
// Index of the receiver from the top of the expression stack. |
const int receiver_index = argument_count - 1; |
- AddInstruction(global_receiver); |
ASSERT(environment()->ExpressionStackAt(receiver_index)-> |
IsGlobalObject()); |
environment()->SetExpressionStackAt(receiver_index, global_receiver); |
@@ -8593,8 +8473,7 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
} |
} else { |
HValue* context = environment()->LookupContext(); |
- HGlobalObject* receiver = new(zone()) HGlobalObject(context); |
- AddInstruction(receiver); |
+ HGlobalObject* receiver = Add<HGlobalObject>(context); |
PushAndAdd(new(zone()) HPushArgument(receiver)); |
CHECK_ALIVE(VisitArgumentList(expr->arguments())); |
@@ -8608,12 +8487,11 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* function = Top(); |
HValue* context = environment()->LookupContext(); |
- HGlobalObject* global = new(zone()) HGlobalObject(context); |
- AddInstruction(global); |
+ HGlobalObject* global = Add<HGlobalObject>(context); |
HGlobalReceiver* receiver = new(zone()) HGlobalReceiver(global); |
PushAndAdd(receiver); |
CHECK_ALIVE(VisitExpressions(expr->arguments())); |
- AddInstruction(new(zone()) HCheckFunction(function, expr->target())); |
+ Add<HCheckFunction>(function, expr->target()); |
if (TryInlineBuiltinFunctionCall(expr, true)) { // Drop the function. |
if (FLAG_trace_inlining) { |
@@ -8639,10 +8517,8 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* function = Top(); |
HValue* context = environment()->LookupContext(); |
- HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
- AddInstruction(global_object); |
- HGlobalReceiver* receiver = new(zone()) HGlobalReceiver(global_object); |
- AddInstruction(receiver); |
+ HGlobalObject* global_object = Add<HGlobalObject>(context); |
+ HGlobalReceiver* receiver = Add<HGlobalReceiver>(global_object); |
PushAndAdd(new(zone()) HPushArgument(receiver)); |
CHECK_ALIVE(VisitArgumentList(expr->arguments())); |
@@ -8680,8 +8556,7 @@ void HOptimizedGraphBuilder::VisitCallNew(CallNew* expr) { |
HValue* function = Top(); |
CHECK_ALIVE(VisitExpressions(expr->arguments())); |
Handle<JSFunction> constructor = expr->target(); |
- HValue* check = AddInstruction( |
- new(zone()) HCheckFunction(function, constructor)); |
+ HValue* check = Add<HCheckFunction>(function, constructor); |
// Force completion of inobject slack tracking before generating |
// allocation code to finalize instance size. |
@@ -8690,10 +8565,9 @@ void HOptimizedGraphBuilder::VisitCallNew(CallNew* expr) { |
} |
// Replace the constructor function with a newly allocated receiver. |
- HInstruction* receiver = new(zone()) HAllocateObject(context, constructor); |
+ HInstruction* receiver = Add<HAllocateObject>(context, constructor); |
// Index of the receiver from the top of the expression stack. |
const int receiver_index = argument_count - 1; |
- AddInstruction(receiver); |
ASSERT(environment()->ExpressionStackAt(receiver_index) == function); |
environment()->SetExpressionStackAt(receiver_index, receiver); |
@@ -8721,7 +8595,7 @@ void HOptimizedGraphBuilder::VisitCallNew(CallNew* expr) { |
HCallNew* call; |
if (expr->target().is_identical_to(array_function)) { |
Handle<Cell> cell = expr->allocation_info_cell(); |
- AddInstruction(new(zone()) HCheckFunction(constructor, array_function)); |
+ Add<HCheckFunction>(constructor, array_function); |
call = new(zone()) HCallNewArray(context, constructor, argument_count, |
cell, expr->elements_kind()); |
} else { |
@@ -8944,12 +8818,11 @@ HInstruction* HOptimizedGraphBuilder::BuildIncrement( |
// actual HChange instruction we need is (sometimes) added in a later |
// phase, so it is not available now to be used as an input to HAdd and |
// as the return value. |
- HInstruction* number_input = new(zone()) HForceRepresentation(Pop(), rep); |
+ HInstruction* number_input = Add<HForceRepresentation>(Pop(), rep); |
if (!rep.IsDouble()) { |
number_input->SetFlag(HInstruction::kFlexibleRepresentation); |
number_input->SetFlag(HInstruction::kCannotBeTagged); |
} |
- AddInstruction(number_input); |
Push(number_input); |
} |
@@ -9032,9 +8905,8 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) { |
HValue* context = BuildContextChainWalk(var); |
HStoreContextSlot::Mode mode = IsLexicalVariableMode(var->mode()) |
? HStoreContextSlot::kCheckDeoptimize : HStoreContextSlot::kNoCheck; |
- HStoreContextSlot* instr = |
- new(zone()) HStoreContextSlot(context, var->index(), mode, after); |
- AddInstruction(instr); |
+ HStoreContextSlot* instr = Add<HStoreContextSlot>(context, var->index(), |
+ mode, after); |
if (instr->HasObservableSideEffects()) { |
AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
} |
@@ -9655,7 +9527,7 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
result->set_position(expr->position()); |
return ast_context()->ReturnInstruction(result, expr->id()); |
} else { |
- AddInstruction(new(zone()) HCheckFunction(right, target)); |
+ Add<HCheckFunction>(right, target); |
HInstanceOfKnownGlobal* result = |
new(zone()) HInstanceOfKnownGlobal(context, left, target); |
result->set_position(expr->position()); |
@@ -9769,7 +9641,6 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
int data_size, |
int pointer_size, |
AllocationSiteMode mode) { |
- Zone* zone = this->zone(); |
NoObservableSideEffectsScope no_effects(this); |
HInstruction* target = NULL; |
@@ -9782,9 +9653,9 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
HAllocate::Flags data_flags = |
static_cast<HAllocate::Flags>(HAllocate::DefaultFlags() | |
HAllocate::CAN_ALLOCATE_IN_OLD_DATA_SPACE); |
- HValue* size_in_bytes = AddInstruction(new(zone) HConstant(data_size)); |
- data_target = AddInstruction(new(zone) HAllocate( |
- context, size_in_bytes, HType::JSObject(), data_flags)); |
+ HValue* size_in_bytes = Add<HConstant>(data_size); |
+ data_target = Add<HAllocate>(context, size_in_bytes, |
+ HType::JSObject(), data_flags); |
Handle<Map> free_space_map = isolate()->factory()->free_space_map(); |
AddStoreMapConstant(data_target, free_space_map); |
HObjectAccess access = |
@@ -9794,15 +9665,12 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
if (pointer_size != 0) { |
flags = static_cast<HAllocate::Flags>( |
flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE); |
- HValue* size_in_bytes = AddInstruction(new(zone) HConstant(pointer_size)); |
- target = AddInstruction(new(zone) HAllocate(context, |
- size_in_bytes, HType::JSObject(), flags)); |
+ HValue* size_in_bytes = Add<HConstant>(pointer_size); |
+ target = Add<HAllocate>(context, size_in_bytes, HType::JSObject(), flags); |
} |
} else { |
- HValue* size_in_bytes = |
- AddInstruction(new(zone) HConstant(data_size + pointer_size)); |
- target = AddInstruction(new(zone) HAllocate(context, size_in_bytes, |
- HType::JSObject(), flags)); |
+ HValue* size_in_bytes = Add<HConstant>(data_size + pointer_size); |
+ target = Add<HAllocate>(context, size_in_bytes, HType::JSObject(), flags); |
} |
int offset = 0; |
@@ -9821,8 +9689,6 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
HInstruction* data_target, |
int* data_offset, |
AllocationSiteMode mode) { |
- Zone* zone = this->zone(); |
- |
Handle<FixedArrayBase> elements(boilerplate_object->elements()); |
Handle<FixedArrayBase> original_elements( |
original_boilerplate_object->elements()); |
@@ -9858,7 +9724,7 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
// Copy in-object properties. |
if (boilerplate_object->map()->NumberOfFields() != 0) { |
HValue* object_properties = |
- AddInstruction(new(zone) HInnerAllocatedObject(target, object_offset)); |
+ Add<HInnerAllocatedObject>(target, object_offset); |
BuildEmitInObjectProperties(boilerplate_object, original_boilerplate_object, |
object_properties, target, offset, data_target, data_offset); |
} |
@@ -9868,8 +9734,8 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
boilerplate_object->map()->CanTrackAllocationSite()) { |
elements_offset += AllocationSiteInfo::kSize; |
*offset += AllocationSiteInfo::kSize; |
- HInstruction* original_boilerplate = AddInstruction(new(zone) HConstant( |
- original_boilerplate_object)); |
+ HInstruction* original_boilerplate = |
+ Add<HConstant>(original_boilerplate_object); |
BuildCreateAllocationSiteInfo(target, JSArray::kSize, original_boilerplate); |
} |
} |
@@ -9883,11 +9749,9 @@ HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader( |
int elements_offset, |
int elements_size) { |
ASSERT(boilerplate_object->properties()->length() == 0); |
- Zone* zone = this->zone(); |
HValue* result = NULL; |
- HValue* object_header = |
- AddInstruction(new(zone) HInnerAllocatedObject(target, object_offset)); |
+ HValue* object_header = Add<HInnerAllocatedObject>(target, object_offset); |
Handle<Map> boilerplate_object_map(boilerplate_object->map()); |
AddStoreMapConstant(object_header, boilerplate_object_map); |
@@ -9895,14 +9759,12 @@ HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader( |
if (elements_size == 0) { |
Handle<Object> elements_field = |
Handle<Object>(boilerplate_object->elements(), isolate()); |
- elements = AddInstruction(new(zone) HConstant(elements_field)); |
+ elements = Add<HConstant>(elements_field); |
} else { |
if (data_target != NULL && boilerplate_object->HasFastDoubleElements()) { |
- elements = AddInstruction(new(zone) HInnerAllocatedObject( |
- data_target, elements_offset)); |
+ elements = Add<HInnerAllocatedObject>(data_target, elements_offset); |
} else { |
- elements = AddInstruction(new(zone) HInnerAllocatedObject( |
- target, elements_offset)); |
+ elements = Add<HInnerAllocatedObject>(target, elements_offset); |
} |
result = elements; |
} |
@@ -9911,8 +9773,7 @@ HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader( |
Handle<Object> properties_field = |
Handle<Object>(boilerplate_object->properties(), isolate()); |
ASSERT(*properties_field == isolate()->heap()->empty_fixed_array()); |
- HInstruction* properties = AddInstruction(new(zone) HConstant( |
- properties_field)); |
+ HInstruction* properties = Add<HConstant>(properties_field); |
HObjectAccess access = HObjectAccess::ForPropertiesPointer(); |
AddStore(object_header, access, properties); |
@@ -9921,7 +9782,7 @@ HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader( |
Handle<JSArray>::cast(boilerplate_object); |
Handle<Object> length_field = |
Handle<Object>(boilerplate_array->length(), isolate()); |
- HInstruction* length = AddInstruction(new(zone) HConstant(length_field)); |
+ HInstruction* length = Add<HConstant>(length_field); |
ASSERT(boilerplate_array->length()->IsSmi()); |
Representation representation = |
@@ -9943,7 +9804,6 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
int* offset, |
HInstruction* data_target, |
int* data_offset) { |
- Zone* zone = this->zone(); |
Handle<DescriptorArray> descriptors( |
boilerplate_object->map()->instance_descriptors()); |
int limit = boilerplate_object->map()->NumberOfOwnDescriptors(); |
@@ -9970,8 +9830,8 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
Handle<JSObject> original_value_object = Handle<JSObject>::cast( |
Handle<Object>(original_boilerplate_object->InObjectPropertyAt(index), |
isolate())); |
- HInstruction* value_instruction = |
- AddInstruction(new(zone) HInnerAllocatedObject(target, *offset)); |
+ HInstruction* value_instruction = Add<HInnerAllocatedObject>(target, |
+ *offset); |
AddStore(object_properties, access, value_instruction); |
@@ -9979,19 +9839,16 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
offset, data_target, data_offset, DONT_TRACK_ALLOCATION_SITE); |
} else { |
Representation representation = details.representation(); |
- HInstruction* value_instruction = |
- AddInstruction(new(zone) HConstant(value)); |
+ HInstruction* value_instruction = Add<HConstant>(value); |
if (representation.IsDouble()) { |
// Allocate a HeapNumber box and store the value into it. |
HInstruction* double_box; |
if (data_target != NULL) { |
- double_box = AddInstruction(new(zone) HInnerAllocatedObject( |
- data_target, *data_offset)); |
+ double_box = Add<HInnerAllocatedObject>(data_target, *data_offset); |
*data_offset += HeapNumber::kSize; |
} else { |
- double_box = AddInstruction(new(zone) HInnerAllocatedObject( |
- target, *offset)); |
+ double_box = Add<HInnerAllocatedObject>(target, *offset); |
*offset += HeapNumber::kSize; |
} |
AddStoreMapConstant(double_box, |
@@ -10006,8 +9863,8 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
} |
int inobject_properties = boilerplate_object->map()->inobject_properties(); |
- HInstruction* value_instruction = AddInstruction(new(zone) |
- HConstant(isolate()->factory()->one_pointer_filler_map())); |
+ HInstruction* value_instruction = |
+ Add<HConstant>(isolate()->factory()->one_pointer_filler_map()); |
for (int i = copied_fields; i < inobject_properties; i++) { |
ASSERT(boilerplate_object->IsJSObject()); |
int property_offset = boilerplate_object->GetInObjectPropertyOffset(i); |
@@ -10026,11 +9883,8 @@ void HOptimizedGraphBuilder::BuildEmitElements( |
int* offset, |
HInstruction* data_target, |
int* data_offset) { |
- Zone* zone = this->zone(); |
- |
int elements_length = elements->length(); |
- HValue* object_elements_length = |
- AddInstruction(new(zone) HConstant(elements_length)); |
+ HValue* object_elements_length = Add<HConstant>(elements_length); |
BuildInitializeElementsHeader(object_elements, kind, object_elements_length); |
@@ -10050,17 +9904,16 @@ void HOptimizedGraphBuilder::BuildEmitFixedDoubleArray( |
Handle<FixedArrayBase> elements, |
ElementsKind kind, |
HValue* object_elements) { |
- Zone* zone = this->zone(); |
- HInstruction* boilerplate_elements = |
- AddInstruction(new(zone) HConstant(elements)); |
+ HInstruction* boilerplate_elements = Add<HConstant>(elements); |
int elements_length = elements->length(); |
for (int i = 0; i < elements_length; i++) { |
- HValue* key_constant = AddInstruction(new(zone) HConstant(i)); |
+ HValue* key_constant = Add<HConstant>(i); |
HInstruction* value_instruction = |
- AddInstruction(new(zone) HLoadKeyed( |
- boilerplate_elements, key_constant, NULL, kind, ALLOW_RETURN_HOLE)); |
- HInstruction* store = AddInstruction(new(zone) HStoreKeyed( |
- object_elements, key_constant, value_instruction, kind)); |
+ Add<HLoadKeyed>(boilerplate_elements, key_constant, |
+ static_cast<HValue*>(NULL), kind, |
+ ALLOW_RETURN_HOLE); |
+ HInstruction* store = Add<HStoreKeyed>(object_elements, key_constant, |
+ value_instruction, kind); |
store->SetFlag(HValue::kAllowUndefinedAsNaN); |
} |
} |
@@ -10075,33 +9928,29 @@ void HOptimizedGraphBuilder::BuildEmitFixedArray( |
int* offset, |
HInstruction* data_target, |
int* data_offset) { |
- Zone* zone = this->zone(); |
- HInstruction* boilerplate_elements = |
- AddInstruction(new(zone) HConstant(elements)); |
+ HInstruction* boilerplate_elements = Add<HConstant>(elements); |
int elements_length = elements->length(); |
Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); |
Handle<FixedArray> original_fast_elements = |
Handle<FixedArray>::cast(original_elements); |
for (int i = 0; i < elements_length; i++) { |
Handle<Object> value(fast_elements->get(i), isolate()); |
- HValue* key_constant = AddInstruction(new(zone) HConstant(i)); |
+ HValue* key_constant = Add<HConstant>(i); |
if (value->IsJSObject()) { |
Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
Handle<JSObject> original_value_object = Handle<JSObject>::cast( |
Handle<Object>(original_fast_elements->get(i), isolate())); |
- HInstruction* value_instruction = |
- AddInstruction(new(zone) HInnerAllocatedObject(target, *offset)); |
- AddInstruction(new(zone) HStoreKeyed( |
- object_elements, key_constant, value_instruction, kind)); |
+ HInstruction* value_instruction = Add<HInnerAllocatedObject>(target, |
+ *offset); |
+ Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); |
BuildEmitDeepCopy(value_object, original_value_object, target, |
offset, data_target, data_offset, DONT_TRACK_ALLOCATION_SITE); |
} else { |
HInstruction* value_instruction = |
- AddInstruction(new(zone) HLoadKeyed( |
- boilerplate_elements, key_constant, NULL, kind, |
- ALLOW_RETURN_HOLE)); |
- AddInstruction(new(zone) HStoreKeyed( |
- object_elements, key_constant, value_instruction, kind)); |
+ Add<HLoadKeyed>(boilerplate_elements, key_constant, |
+ static_cast<HValue*>(NULL), kind, |
+ ALLOW_RETURN_HOLE); |
+ Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); |
} |
} |
} |
@@ -10126,9 +9975,7 @@ void HOptimizedGraphBuilder::VisitDeclarations( |
int flags = DeclareGlobalsEvalFlag::encode(current_info()->is_eval()) | |
DeclareGlobalsNativeFlag::encode(current_info()->is_native()) | |
DeclareGlobalsLanguageMode::encode(current_info()->language_mode()); |
- HInstruction* result = new(zone()) HDeclareGlobals( |
- environment()->LookupContext(), array, flags); |
- AddInstruction(result); |
+ Add<HDeclareGlobals>(environment()->LookupContext(), array, flags); |
globals_.Clear(); |
} |
} |
@@ -10158,9 +10005,8 @@ void HOptimizedGraphBuilder::VisitVariableDeclaration( |
if (hole_init) { |
HValue* value = graph()->GetConstantHole(); |
HValue* context = environment()->LookupContext(); |
- HStoreContextSlot* store = new(zone()) HStoreContextSlot( |
+ HStoreContextSlot* store = Add<HStoreContextSlot>( |
context, variable->index(), HStoreContextSlot::kNoCheck, value); |
- AddInstruction(store); |
if (store->HasObservableSideEffects()) { |
AddSimulate(proxy->id(), REMOVABLE_SIMULATE); |
} |
@@ -10197,9 +10043,8 @@ void HOptimizedGraphBuilder::VisitFunctionDeclaration( |
CHECK_ALIVE(VisitForValue(declaration->fun())); |
HValue* value = Pop(); |
HValue* context = environment()->LookupContext(); |
- HStoreContextSlot* store = new(zone()) HStoreContextSlot( |
+ HStoreContextSlot* store = Add<HStoreContextSlot>( |
context, variable->index(), HStoreContextSlot::kNoCheck, value); |
- AddInstruction(store); |
if (store->HasObservableSideEffects()) { |
AddSimulate(proxy->id(), REMOVABLE_SIMULATE); |
} |
@@ -10371,8 +10216,7 @@ void HOptimizedGraphBuilder::GenerateArgumentsLength(CallRuntime* call) { |
// function is blacklisted by AstNode::IsInlineable. |
ASSERT(function_state()->outer() == NULL); |
ASSERT(call->arguments()->length() == 0); |
- HInstruction* elements = AddInstruction( |
- new(zone()) HArgumentsElements(false)); |
+ HInstruction* elements = Add<HArgumentsElements>(false); |
HArgumentsLength* result = new(zone()) HArgumentsLength(elements); |
return ast_context()->ReturnInstruction(result, call->id()); |
} |
@@ -10386,9 +10230,8 @@ void HOptimizedGraphBuilder::GenerateArguments(CallRuntime* call) { |
ASSERT(call->arguments()->length() == 1); |
CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
HValue* index = Pop(); |
- HInstruction* elements = AddInstruction( |
- new(zone()) HArgumentsElements(false)); |
- HInstruction* length = AddInstruction(new(zone()) HArgumentsLength(elements)); |
+ HInstruction* elements = Add<HArgumentsElements>(false); |
+ HInstruction* length = Add<HArgumentsLength>(elements); |
HInstruction* checked_index = Add<HBoundsCheck>(index, length); |
HAccessArgumentsAt* result = |
new(zone()) HAccessArgumentsAt(elements, length, checked_index); |
@@ -10553,8 +10396,7 @@ void HOptimizedGraphBuilder::GenerateLog(CallRuntime* call) { |
// Fast support for Math.random(). |
void HOptimizedGraphBuilder::GenerateRandomHeapNumber(CallRuntime* call) { |
HValue* context = environment()->LookupContext(); |
- HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
- AddInstruction(global_object); |
+ HGlobalObject* global_object = Add<HGlobalObject>(context); |
HRandom* result = new(zone()) HRandom(global_object); |
return ast_context()->ReturnInstruction(result, call->id()); |
} |
@@ -10660,15 +10502,14 @@ void HOptimizedGraphBuilder::GenerateCallFunction(CallRuntime* call) { |
current_block()->Finish(typecheck); |
set_current_block(if_jsfunction); |
- HInstruction* invoke_result = AddInstruction( |
- new(zone()) HInvokeFunction(context, function, arg_count)); |
+ HInstruction* invoke_result = |
+ Add<HInvokeFunction>(context, function, arg_count); |
Drop(arg_count); |
Push(invoke_result); |
if_jsfunction->Goto(join); |
set_current_block(if_nonfunction); |
- HInstruction* call_result = AddInstruction( |
- new(zone()) HCallFunction(context, function, arg_count)); |
+ HInstruction* call_result = Add<HCallFunction>(context, function, arg_count); |
Drop(arg_count); |
Push(call_result); |
if_nonfunction->Goto(join); |