Index: src/hydrogen.h |
diff --git a/src/hydrogen.h b/src/hydrogen.h |
index 99428c14c5ad0e58aa2ee2158858f80fc4525049..daca61d12d183ce81cda8ab222b02d40857b6688 100644 |
--- a/src/hydrogen.h |
+++ b/src/hydrogen.h |
@@ -583,7 +583,7 @@ class HEnvironment: public ZoneObject { |
return result; |
} |
- HValue* LookupContext() const { |
+ HValue* context() const { |
// Return first special. |
return Lookup(parameter_count()); |
} |
@@ -990,57 +990,205 @@ class HGraphBuilder { |
void Push(HValue* value) { environment()->Push(value); } |
HValue* Pop() { return environment()->Pop(); } |
+ virtual HValue* context() = 0; |
+ |
// Adding instructions. |
HInstruction* AddInstruction(HInstruction* instr); |
template<class I> |
- I* Add() { return static_cast<I*>(AddInstruction(new(zone()) I())); } |
+ HInstruction* NewUncasted() { return I::New(zone(), context()); } |
+ |
+ template<class I> |
+ I* New() { return I::cast(NewUncasted<I>()); } |
+ |
+ template<class I> |
+ HInstruction* AddUncasted() { return AddInstruction(NewUncasted<I>());} |
+ |
+ template<class I> |
+ I* Add() { return I::cast(AddUncasted<I>());} |
+ |
+ template<class I, class P1> |
+ HInstruction* NewUncasted(P1 p1) { |
+ return I::New(zone(), context(), p1); |
+ } |
+ |
+ template<class I, class P1> |
+ I* New(P1 p1) { return I::cast(NewUncasted<I>(p1)); } |
+ |
+ template<class I, class P1> |
+ HInstruction* AddUncasted(P1 p1) { |
+ HInstruction* result = AddInstruction(NewUncasted<I>(p1)); |
+ // Specializations must have their parameters properly casted |
+ // to avoid landing here. |
+ ASSERT(!result->IsReturn() && !result->IsSimulate() && |
+ !result->IsDeoptimize()); |
+ return result; |
+ } |
template<class I, class P1> |
I* Add(P1 p1) { |
- return static_cast<I*>(AddInstruction(new(zone()) I(p1))); |
+ return I::cast(AddUncasted<I>(p1)); |
+ } |
+ |
+ template<class I, class P1, class P2> |
+ HInstruction* NewUncasted(P1 p1, P2 p2) { |
+ return I::New(zone(), context(), p1, p2); |
+ } |
+ |
+ template<class I, class P1, class P2> |
+ I* New(P1 p1, P2 p2) { |
+ return I::cast(NewUncasted<I>(p1, p2)); |
+ } |
+ |
+ template<class I, class P1, class P2> |
+ HInstruction* AddUncasted(P1 p1, P2 p2) { |
+ HInstruction* result = AddInstruction(NewUncasted<I>(p1, p2)); |
+ // Specializations must have their parameters properly casted |
+ // to avoid landing here. |
+ ASSERT(!result->IsSimulate()); |
+ return result; |
} |
template<class I, class P1, class P2> |
I* Add(P1 p1, P2 p2) { |
- return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2))); |
+ return static_cast<I*>(AddUncasted<I>(p1, p2)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3> |
+ HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3) { |
+ return I::New(zone(), context(), p1, p2, p3); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3> |
+ I* New(P1 p1, P2 p2, P3 p3) { |
+ return I::cast(NewUncasted<I>(p1, p2, p3)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3> |
+ HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3) { |
+ return AddInstruction(NewUncasted<I>(p1, p2, p3)); |
} |
template<class I, class P1, class P2, class P3> |
I* Add(P1 p1, P2 p2, P3 p3) { |
- return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3))); |
+ return I::cast(AddUncasted<I>(p1, p2, p3)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4> |
+ HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4) { |
+ return I::New(zone(), context(), p1, p2, p3, p4); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4> |
+ I* New(P1 p1, P2 p2, P3 p3, P4 p4) { |
+ return I::cast(NewUncasted<I>(p1, p2, p3, p4)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4> |
+ HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4) { |
+ return AddInstruction(NewUncasted<I>(p1, p2, p3, p4)); |
} |
template<class I, class P1, class P2, class P3, class P4> |
I* Add(P1 p1, P2 p2, P3 p3, P4 p4) { |
- return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3, p4))); |
+ return I::cast(AddUncasted<I>(p1, p2, p3, p4)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, class P5> |
+ HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { |
+ return I::New(zone(), context(), p1, p2, p3, p4, p5); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, class P5> |
+ I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { |
+ return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, class P5> |
+ HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { |
+ return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5)); |
} |
template<class I, class P1, class P2, class P3, class P4, class P5> |
I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { |
- return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3, p4, p5))); |
+ return I::cast(AddUncasted<I>(p1, p2, p3, p4, p5)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, class P5, class P6> |
+ HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { |
+ return I::New(zone(), context(), p1, p2, p3, p4, p5, p6); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, class P5, class P6> |
+ I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { |
+ return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, class P5, class P6> |
+ HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { |
+ return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6)); |
} |
template<class I, class P1, class P2, class P3, class P4, class P5, class P6> |
I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { |
- return static_cast<I*>(AddInstruction( |
- new(zone()) I(p1, p2, p3, p4, p5, p6))); |
+ return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6))); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, |
+ class P5, class P6, class P7> |
+ HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { |
+ return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, |
+ class P5, class P6, class P7> |
+ I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { |
+ return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, |
+ class P4, class P5, class P6, class P7> |
+ HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { |
+ return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7)); |
} |
template<class I, class P1, class P2, class P3, |
class P4, class P5, class P6, class P7> |
I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { |
- return static_cast<I*>(AddInstruction( |
- new(zone()) I(p1, p2, p3, p4, p5, p6, p7))); |
+ return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4, |
+ p5, p6, p7))); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, |
+ class P5, class P6, class P7, class P8> |
+ HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, |
+ P5 p5, P6 p6, P7 p7, P8 p8) { |
+ return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, |
+ class P5, class P6, class P7, class P8> |
+ I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) { |
+ return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)); |
+ } |
+ |
+ template<class I, class P1, class P2, class P3, class P4, |
+ class P5, class P6, class P7, class P8> |
+ HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, |
+ P5 p5, P6 p6, P7 p7, P8 p8) { |
+ return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)); |
} |
template<class I, class P1, class P2, class P3, class P4, |
class P5, class P6, class P7, class P8> |
I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) { |
- return static_cast<I*>(AddInstruction( |
- new(zone()) I(p1, p2, p3, p4, p5, p6, p7, p8))); |
+ return I::cast( |
+ AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8))); |
} |
+ void AddSimulate(BailoutId id, |
+ RemovableSimulate removable = FIXED_SIMULATE); |
+ |
void IncrementInNoSideEffectsScope() { |
no_side_effects_scope_count_++; |
} |
@@ -1089,15 +1237,9 @@ class HGraphBuilder { |
LoadKeyedHoleMode load_mode, |
KeyedAccessStoreMode store_mode); |
- HLoadNamedField* AddLoad( |
- HValue *object, |
- HObjectAccess access, |
- HValue *typecheck = NULL); |
- |
HLoadNamedField* BuildLoadNamedField( |
HValue* object, |
- HObjectAccess access, |
- Representation representation); |
+ HObjectAccess access); |
HInstruction* AddExternalArrayElementAccess( |
HValue* external_elements, |
@@ -1117,13 +1259,11 @@ class HGraphBuilder { |
LoadKeyedHoleMode load_mode, |
KeyedAccessStoreMode store_mode); |
- HLoadNamedField* BuildLoadNamedField(HValue* object, HObjectAccess access); |
- HStoreNamedField* AddStore(HValue *object, HObjectAccess access, HValue *val); |
HStoreNamedField* AddStoreMapConstant(HValue *object, Handle<Map>); |
HLoadNamedField* AddLoadElements(HValue *object, HValue *typecheck = NULL); |
HLoadNamedField* AddLoadFixedArrayLength(HValue *object); |
- HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin, HValue* context); |
+ HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin); |
HValue* TruncateToNumber(HValue* value, Handle<Type>* expected); |
@@ -1314,8 +1454,7 @@ class HGraphBuilder { |
HGraphBuilder* builder_; |
}; |
- HValue* BuildNewElementsCapacity(HValue* context, |
- HValue* old_capacity); |
+ HValue* BuildNewElementsCapacity(HValue* old_capacity); |
void BuildNewSpaceArrayCheck(HValue* length, |
ElementsKind kind); |
@@ -1349,7 +1488,7 @@ class HGraphBuilder { |
return JSArray::kPreallocatedArrayElements; |
} |
- HValue* EmitMapCode(HValue* context); |
+ HValue* EmitMapCode(); |
HValue* EmitInternalMapCode(); |
HValue* EstablishEmptyArrayAllocationSize(); |
HValue* EstablishAllocationSize(HValue* length_node); |
@@ -1364,16 +1503,14 @@ class HGraphBuilder { |
HInnerAllocatedObject* elements_location_; |
}; |
- HValue* BuildAllocateElements(HValue* context, |
- ElementsKind kind, |
+ HValue* BuildAllocateElements(ElementsKind kind, |
HValue* capacity); |
void BuildInitializeElementsHeader(HValue* elements, |
ElementsKind kind, |
HValue* capacity); |
- HValue* BuildAllocateElementsAndInitializeElementsHeader(HValue* context, |
- ElementsKind kind, |
+ HValue* BuildAllocateElementsAndInitializeElementsHeader(ElementsKind kind, |
HValue* capacity); |
// array must have been allocated with enough room for |
@@ -1394,22 +1531,19 @@ class HGraphBuilder { |
HValue* length, |
HValue* new_capacity); |
- void BuildFillElementsWithHole(HValue* context, |
- HValue* elements, |
+ void BuildFillElementsWithHole(HValue* elements, |
ElementsKind elements_kind, |
HValue* from, |
HValue* to); |
- void BuildCopyElements(HValue* context, |
- HValue* from_elements, |
+ void BuildCopyElements(HValue* from_elements, |
ElementsKind from_elements_kind, |
HValue* to_elements, |
ElementsKind to_elements_kind, |
HValue* length, |
HValue* capacity); |
- HValue* BuildCloneShallowArray(HContext* context, |
- HValue* boilerplate, |
+ HValue* BuildCloneShallowArray(HValue* boilerplate, |
HValue* allocation_site, |
AllocationSiteMode mode, |
ElementsKind kind, |
@@ -1428,8 +1562,8 @@ class HGraphBuilder { |
int previous_object_size, |
HValue* payload); |
- HInstruction* BuildGetNativeContext(HValue* context); |
- HInstruction* BuildGetArrayFunction(HValue* context); |
+ HInstruction* BuildGetNativeContext(); |
+ HInstruction* BuildGetArrayFunction(); |
private: |
HGraphBuilder(); |
@@ -1445,13 +1579,14 @@ class HGraphBuilder { |
template<> |
-inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) { |
+inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>( |
+ Deoptimizer::BailoutType type) { |
if (type == Deoptimizer::SOFT) { |
isolate()->counters()->soft_deopts_requested()->Increment(); |
if (FLAG_always_opt) return NULL; |
} |
if (current_block()->IsDeoptimizing()) return NULL; |
- HDeoptimize* instr = new(zone()) HDeoptimize(type); |
+ HDeoptimize* instr = New<HDeoptimize>(type); |
AddInstruction(instr); |
if (type == Deoptimizer::SOFT) { |
isolate()->counters()->soft_deopts_inserted()->Increment(); |
@@ -1463,8 +1598,16 @@ inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) { |
template<> |
-inline HSimulate* HGraphBuilder::Add(BailoutId id, |
- RemovableSimulate removable) { |
+inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>( |
+ Deoptimizer::BailoutType type) { |
+ return static_cast<HDeoptimize*>(AddUncasted<HDeoptimize>(type)); |
+} |
+ |
+ |
+template<> |
+inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>( |
+ BailoutId id, |
+ RemovableSimulate removable) { |
HSimulate* instr = current_block()->CreateSimulate(id, removable); |
AddInstruction(instr); |
return instr; |
@@ -1472,26 +1615,46 @@ inline HSimulate* HGraphBuilder::Add(BailoutId id, |
template<> |
-inline HSimulate* HGraphBuilder::Add(BailoutId id) { |
- return Add<HSimulate>(id, FIXED_SIMULATE); |
+inline HInstruction* HGraphBuilder::NewUncasted<HLoadNamedField>( |
+ HValue* object, HObjectAccess access) { |
+ return NewUncasted<HLoadNamedField>(object, access, |
+ static_cast<HValue*>(NULL)); |
} |
template<> |
-inline HReturn* HGraphBuilder::Add(HValue* value) { |
- HValue* context = environment()->LookupContext(); |
+inline HInstruction* HGraphBuilder::AddUncasted<HLoadNamedField>( |
+ HValue* object, HObjectAccess access) { |
+ return AddUncasted<HLoadNamedField>(object, access, |
+ static_cast<HValue*>(NULL)); |
+} |
+ |
+ |
+template<> |
+inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(BailoutId id) { |
+ return AddUncasted<HSimulate>(id, FIXED_SIMULATE); |
+} |
+ |
+ |
+template<> |
+inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) { |
int num_parameters = graph()->info()->num_parameters(); |
- HValue* params = Add<HConstant>(num_parameters); |
- HReturn* return_instruction = new(graph()->zone()) |
- HReturn(value, context, params); |
+ HValue* params = AddUncasted<HConstant>(num_parameters); |
+ HReturn* return_instruction = New<HReturn>(value, params); |
current_block()->FinishExit(return_instruction); |
return return_instruction; |
} |
template<> |
-inline HReturn* HGraphBuilder::Add(HConstant* p1) { |
- return Add<HReturn>(static_cast<HValue*>(p1)); |
+inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HConstant* value) { |
+ return AddUncasted<HReturn>(static_cast<HValue*>(value)); |
+} |
+ |
+ |
+template<> |
+inline HInstruction* HGraphBuilder::NewUncasted<HContext>() { |
+ return HContext::New(zone()); |
} |
@@ -1560,6 +1723,8 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor { |
bool inline_bailout() { return inline_bailout_; } |
+ HValue* context() { return environment()->context(); } |
+ |
void Bailout(const char* reason); |
HBasicBlock* CreateJoin(HBasicBlock* first, |
@@ -1835,8 +2000,7 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor { |
Expression* sub_expr, |
NilValue nil); |
- HInstruction* BuildStringCharCodeAt(HValue* context, |
- HValue* string, |
+ HInstruction* BuildStringCharCodeAt(HValue* string, |
HValue* index); |
HInstruction* BuildBinaryOperation(BinaryOperation* expr, |
HValue* left, |