Index: src/hydrogen.h |
diff --git a/src/hydrogen.h b/src/hydrogen.h |
index bd28ba1b74d55da9df2dd5c11cc615a6c4ba4f0b..febe9ddbba6f7011adb6132da4f1a42146619ccd 100644 |
--- a/src/hydrogen.h |
+++ b/src/hydrogen.h |
@@ -110,7 +110,7 @@ class HBasicBlock V8_FINAL : public ZoneObject { |
bool IsFinished() const { return end_ != NULL; } |
void AddPhi(HPhi* phi); |
void RemovePhi(HPhi* phi); |
- void AddInstruction(HInstruction* instr); |
+ void AddInstruction(HInstruction* instr, int position); |
bool Dominates(HBasicBlock* other) const; |
int LoopNestingDepth() const; |
@@ -133,30 +133,18 @@ class HBasicBlock V8_FINAL : public ZoneObject { |
void SetJoinId(BailoutId ast_id); |
- void Finish(HControlInstruction* last); |
- void FinishExit(HControlInstruction* instruction); |
- void Goto(HBasicBlock* block, |
- FunctionState* state = NULL, |
- bool add_simulate = true); |
- void GotoNoSimulate(HBasicBlock* block) { |
- Goto(block, NULL, false); |
- } |
- |
int PredecessorIndexOf(HBasicBlock* predecessor) const; |
HPhi* AddNewPhi(int merged_index); |
HSimulate* AddNewSimulate(BailoutId ast_id, |
+ int position, |
RemovableSimulate removable = FIXED_SIMULATE) { |
HSimulate* instr = CreateSimulate(ast_id, removable); |
- AddInstruction(instr); |
+ AddInstruction(instr, position); |
return instr; |
} |
void AssignCommonDominator(HBasicBlock* other); |
void AssignLoopSuccessorDominators(); |
- // Add the inlined function exit sequence, adding an HLeaveInlined |
- // instruction and updating the bailout environment. |
- void AddLeaveInlined(HValue* return_value, FunctionState* state); |
- |
// If a target block is tagged as an inline function return, all |
// predecessors should contain the inlined exit sequence: |
// |
@@ -191,14 +179,30 @@ class HBasicBlock V8_FINAL : public ZoneObject { |
void Verify(); |
#endif |
- private: |
+ protected: |
friend class HGraphBuilder; |
+ HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable); |
+ void Finish(HControlInstruction* last, int position); |
+ void FinishExit(HControlInstruction* instruction, int position); |
+ void Goto(HBasicBlock* block, |
+ int position, |
+ FunctionState* state = NULL, |
+ bool add_simulate = true); |
+ void GotoNoSimulate(HBasicBlock* block, int position) { |
+ Goto(block, position, NULL, false); |
+ } |
+ |
+ // Add the inlined function exit sequence, adding an HLeaveInlined |
+ // instruction and updating the bailout environment. |
+ void AddLeaveInlined(HValue* return_value, |
+ FunctionState* state, |
+ int position); |
+ |
+ private: |
void RegisterPredecessor(HBasicBlock* pred); |
void AddDominatedBlock(HBasicBlock* block); |
- HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable); |
- |
int block_id_; |
HGraph* graph_; |
ZoneList<HPhi*> phis_; |
@@ -940,29 +944,24 @@ class HIfContinuation V8_FINAL { |
public: |
HIfContinuation() : continuation_captured_(false) {} |
HIfContinuation(HBasicBlock* true_branch, |
- HBasicBlock* false_branch, |
- int position = RelocInfo::kNoPosition) |
+ HBasicBlock* false_branch) |
: continuation_captured_(true), true_branch_(true_branch), |
- false_branch_(false_branch), position_(position) {} |
+ false_branch_(false_branch) {} |
~HIfContinuation() { ASSERT(!continuation_captured_); } |
void Capture(HBasicBlock* true_branch, |
- HBasicBlock* false_branch, |
- int position) { |
+ HBasicBlock* false_branch) { |
ASSERT(!continuation_captured_); |
true_branch_ = true_branch; |
false_branch_ = false_branch; |
- position_ = position; |
continuation_captured_ = true; |
} |
void Continue(HBasicBlock** true_branch, |
- HBasicBlock** false_branch, |
- int* position) { |
+ HBasicBlock** false_branch) { |
ASSERT(continuation_captured_); |
*true_branch = true_branch_; |
*false_branch = false_branch_; |
- if (position != NULL) *position = position_; |
continuation_captured_ = false; |
} |
@@ -979,7 +978,6 @@ class HIfContinuation V8_FINAL { |
bool continuation_captured_; |
HBasicBlock* true_branch_; |
HBasicBlock* false_branch_; |
- int position_; |
}; |
@@ -988,7 +986,8 @@ class HGraphBuilder { |
explicit HGraphBuilder(CompilationInfo* info) |
: info_(info), |
graph_(NULL), |
- current_block_(NULL) {} |
+ current_block_(NULL), |
+ position_(RelocInfo::kNoPosition) {} |
virtual ~HGraphBuilder() {} |
HBasicBlock* current_block() const { return current_block_; } |
@@ -1011,6 +1010,34 @@ class HGraphBuilder { |
// Adding instructions. |
HInstruction* AddInstruction(HInstruction* instr); |
+ void FinishCurrentBlock(HControlInstruction* last); |
+ void FinishExitCurrentBlock(HControlInstruction* instruction); |
+ |
+ void Goto(HBasicBlock* from, |
+ HBasicBlock* target, |
+ FunctionState* state = NULL, |
+ bool add_simulate = true) { |
+ from->Goto(target, position_, state, add_simulate); |
+ } |
+ void Goto(HBasicBlock* target, |
+ FunctionState* state = NULL, |
+ bool add_simulate = true) { |
+ Goto(current_block(), target, state, add_simulate); |
+ } |
+ void GotoNoSimulate(HBasicBlock* from, HBasicBlock* target) { |
+ Goto(from, target, NULL, false); |
+ } |
+ void GotoNoSimulate(HBasicBlock* target) { |
+ Goto(target, NULL, false); |
+ } |
+ void AddLeaveInlined(HBasicBlock* block, |
+ HValue* return_value, |
+ FunctionState* state) { |
+ block->AddLeaveInlined(return_value, state, position_); |
+ } |
+ void AddLeaveInlined(HValue* return_value, FunctionState* state) { |
+ return AddLeaveInlined(current_block(), return_value, state); |
+ } |
template<class I> |
HInstruction* NewUncasted() { return I::New(zone(), context()); } |
@@ -1205,6 +1232,8 @@ class HGraphBuilder { |
void AddSimulate(BailoutId id, RemovableSimulate removable = FIXED_SIMULATE); |
+ int position() const { return position_; } |
+ |
protected: |
virtual bool BuildGraph() = 0; |
@@ -1297,8 +1326,7 @@ class HGraphBuilder { |
class IfBuilder V8_FINAL { |
public: |
- explicit IfBuilder(HGraphBuilder* builder, |
- int position = RelocInfo::kNoPosition); |
+ explicit IfBuilder(HGraphBuilder* builder); |
IfBuilder(HGraphBuilder* builder, |
HIfContinuation* continuation); |
@@ -1449,7 +1477,6 @@ class HGraphBuilder { |
HGraphBuilder* builder() const { return builder_; } |
HGraphBuilder* builder_; |
- int position_; |
bool finished_ : 1; |
bool deopt_then_ : 1; |
bool deopt_else_ : 1; |
@@ -1610,7 +1637,6 @@ class HGraphBuilder { |
void BuildCompareNil( |
HValue* value, |
Handle<Type> type, |
- int position, |
HIfContinuation* continuation); |
HValue* BuildCreateAllocationMemento(HValue* previous_object, |
@@ -1625,6 +1651,12 @@ class HGraphBuilder { |
HInstruction* BuildGetNativeContext(); |
HInstruction* BuildGetArrayFunction(); |
+ protected: |
+ void SetSourcePosition(int position) { |
+ ASSERT(position != RelocInfo::kNoPosition); |
+ position_ = position; |
+ } |
+ |
private: |
HGraphBuilder(); |
@@ -1634,6 +1666,7 @@ class HGraphBuilder { |
CompilationInfo* info_; |
HGraph* graph_; |
HBasicBlock* current_block_; |
+ int position_; |
}; |
@@ -1651,7 +1684,7 @@ inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>( |
if (type == Deoptimizer::SOFT) { |
isolate()->counters()->soft_deopts_inserted()->Increment(); |
} |
- current_block()->Finish(instr); |
+ FinishCurrentBlock(instr); |
set_current_block(after_deopt_block); |
return instr; |
} |
@@ -1685,7 +1718,7 @@ inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) { |
int num_parameters = graph()->info()->num_parameters(); |
HValue* params = AddUncasted<HConstant>(num_parameters); |
HReturn* return_instruction = New<HReturn>(value, params); |
- current_block()->FinishExit(return_instruction); |
+ FinishExitCurrentBlock(return_instruction); |
return return_instruction; |
} |
@@ -1719,8 +1752,7 @@ inline HInstruction* HGraphBuilder::NewUncasted<HContext>() { |
} |
-class HOptimizedGraphBuilder V8_FINAL |
- : public HGraphBuilder, public AstVisitor { |
+class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { |
public: |
// A class encapsulating (lazily-allocated) break and continue blocks for |
// a breakable statement. Separated from BreakAndContinueScope so that it |
@@ -1807,7 +1839,7 @@ class HOptimizedGraphBuilder V8_FINAL |
DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |
- private: |
+ protected: |
// Type of a member function that generates inline code for a native function. |
typedef void (HOptimizedGraphBuilder::*InlineFunctionGenerator) |
(CallRuntime* call); |
@@ -1977,6 +2009,7 @@ class HOptimizedGraphBuilder V8_FINAL |
AST_NODE_LIST(DECLARE_VISIT) |
#undef DECLARE_VISIT |
+ private: |
// Helpers for flow graph construction. |
enum GlobalPropertyAccess { |
kUseCell, |
@@ -2028,13 +2061,11 @@ class HOptimizedGraphBuilder V8_FINAL |
void HandleGlobalVariableAssignment(Variable* var, |
HValue* value, |
- int position, |
BailoutId ast_id); |
void HandlePropertyAssignment(Assignment* expr); |
void HandleCompoundAssignment(Assignment* expr); |
- void HandlePolymorphicLoadNamedField(int position, |
- BailoutId ast_id, |
+ void HandlePolymorphicLoadNamedField(BailoutId ast_id, |
BailoutId return_id, |
HValue* object, |
SmallMapList* types, |
@@ -2131,14 +2162,12 @@ class HOptimizedGraphBuilder V8_FINAL |
BailoutId return_id, |
bool can_inline_accessor = true); |
- void HandlePolymorphicStoreNamedField(int position, |
- BailoutId assignment_id, |
+ void HandlePolymorphicStoreNamedField(BailoutId assignment_id, |
HValue* object, |
HValue* value, |
SmallMapList* types, |
Handle<String> name); |
- bool TryStorePolymorphicAsMonomorphic(int position, |
- BailoutId assignment_id, |
+ bool TryStorePolymorphicAsMonomorphic(BailoutId assignment_id, |
HValue* object, |
HValue* value, |
SmallMapList* types, |
@@ -2187,7 +2216,6 @@ class HOptimizedGraphBuilder V8_FINAL |
HValue* key, |
HValue* val, |
SmallMapList* maps, |
- int position, |
bool is_store, |
KeyedAccessStoreMode store_mode, |
bool* has_side_effects); |
@@ -2196,7 +2224,6 @@ class HOptimizedGraphBuilder V8_FINAL |
HValue* key, |
HValue* val, |
Expression* expr, |
- int position, |
bool is_store, |
bool* has_side_effects); |
@@ -2207,12 +2234,10 @@ class HOptimizedGraphBuilder V8_FINAL |
HCheckMaps* AddCheckMap(HValue* object, Handle<Map> map); |
void BuildLoad(Property* property, |
- int position, |
BailoutId ast_id); |
void PushLoad(Property* property, |
HValue* object, |
- HValue* key, |
- int position); |
+ HValue* key); |
void BuildStoreForEffect(Expression* expression, |
Property* prop, |