Index: src/hydrogen.h |
diff --git a/src/hydrogen.h b/src/hydrogen.h |
index 98b05d147a290d67e10cbe57daae8bc2f73b02ea..0837bf9634e33cc088a7a8dea90e479161c65902 100644 |
--- a/src/hydrogen.h |
+++ b/src/hydrogen.h |
@@ -429,7 +429,8 @@ enum FrameType { |
JS_CONSTRUCT, |
JS_GETTER, |
JS_SETTER, |
- ARGUMENTS_ADAPTOR |
+ ARGUMENTS_ADAPTOR, |
+ STUB |
}; |
@@ -440,6 +441,8 @@ class HEnvironment: public ZoneObject { |
Handle<JSFunction> closure, |
Zone* zone); |
+ explicit HEnvironment(Zone* zone); |
+ |
HEnvironment* arguments_environment() { |
return outer()->frame_type() == ARGUMENTS_ADAPTOR ? outer() : this; |
} |
@@ -636,7 +639,7 @@ class HInferRepresentation BASE_EMBEDDED { |
}; |
-class HGraphBuilder; |
+class HOptimizedGraphBuilder; |
enum ArgumentsAllowedFlag { |
ARGUMENTS_NOT_ALLOWED, |
@@ -672,10 +675,10 @@ class AstContext { |
bool is_for_typeof() { return for_typeof_; } |
protected: |
- AstContext(HGraphBuilder* owner, Expression::Context kind); |
+ AstContext(HOptimizedGraphBuilder* owner, Expression::Context kind); |
virtual ~AstContext(); |
- HGraphBuilder* owner() const { return owner_; } |
+ HOptimizedGraphBuilder* owner() const { return owner_; } |
inline Zone* zone() const; |
@@ -686,7 +689,7 @@ class AstContext { |
#endif |
private: |
- HGraphBuilder* owner_; |
+ HOptimizedGraphBuilder* owner_; |
Expression::Context kind_; |
AstContext* outer_; |
bool for_typeof_; |
@@ -695,7 +698,7 @@ class AstContext { |
class EffectContext: public AstContext { |
public: |
- explicit EffectContext(HGraphBuilder* owner) |
+ explicit EffectContext(HOptimizedGraphBuilder* owner) |
: AstContext(owner, Expression::kEffect) { |
} |
virtual ~EffectContext(); |
@@ -708,7 +711,7 @@ class EffectContext: public AstContext { |
class ValueContext: public AstContext { |
public: |
- explicit ValueContext(HGraphBuilder* owner, ArgumentsAllowedFlag flag) |
+ ValueContext(HOptimizedGraphBuilder* owner, ArgumentsAllowedFlag flag) |
: AstContext(owner, Expression::kValue), flag_(flag) { |
} |
virtual ~ValueContext(); |
@@ -726,7 +729,7 @@ class ValueContext: public AstContext { |
class TestContext: public AstContext { |
public: |
- TestContext(HGraphBuilder* owner, |
+ TestContext(HOptimizedGraphBuilder* owner, |
Expression* condition, |
TypeFeedbackOracle* oracle, |
HBasicBlock* if_true, |
@@ -766,7 +769,7 @@ class TestContext: public AstContext { |
class FunctionState { |
public: |
- FunctionState(HGraphBuilder* owner, |
+ FunctionState(HOptimizedGraphBuilder* owner, |
CompilationInfo* info, |
TypeFeedbackOracle* oracle, |
InliningKind inlining_kind); |
@@ -796,7 +799,7 @@ class FunctionState { |
bool arguments_pushed() { return arguments_elements() != NULL; } |
private: |
- HGraphBuilder* owner_; |
+ HOptimizedGraphBuilder* owner_; |
CompilationInfo* compilation_info_; |
TypeFeedbackOracle* oracle_; |
@@ -828,7 +831,65 @@ class FunctionState { |
}; |
-class HGraphBuilder: public AstVisitor { |
+class HGraphBuilder { |
+ public: |
+ explicit HGraphBuilder(CompilationInfo* info) |
+ : info_(info), graph_(NULL), current_block_(NULL) {} |
+ virtual ~HGraphBuilder() {} |
+ |
+ HBasicBlock* current_block() const { return current_block_; } |
+ void set_current_block(HBasicBlock* block) { current_block_ = block; } |
+ HEnvironment* environment() const { |
+ return current_block()->last_environment(); |
+ } |
+ Zone* zone() const { return info_->zone(); } |
+ HGraph* graph() { return graph_; } |
+ |
+ HGraph* CreateGraph(); |
+ |
+ // Adding instructions. |
+ HInstruction* AddInstruction(HInstruction* instr); |
+ void AddSimulate(BailoutId id, |
+ RemovableSimulate removable = FIXED_SIMULATE); |
+ |
+ protected: |
+ virtual bool BuildGraph() = 0; |
+ |
+ // Building common constructs |
+ HInstruction* BuildExternalArrayElementAccess( |
+ HValue* external_elements, |
+ HValue* checked_key, |
+ HValue* val, |
+ HValue* dependency, |
+ ElementsKind elements_kind, |
+ bool is_store); |
+ |
+ HInstruction* BuildFastElementAccess( |
+ HValue* elements, |
+ HValue* checked_key, |
+ HValue* val, |
+ HValue* dependency, |
+ ElementsKind elements_kind, |
+ bool is_store); |
+ |
+ HInstruction* BuildUncheckedMonomorphicElementAccess( |
+ HValue* object, |
+ HValue* key, |
+ HValue* val, |
+ HCheckMaps* mapcheck, |
+ bool is_js_array, |
+ ElementsKind elements_kind, |
+ bool is_store); |
+ |
+ private: |
+ HGraphBuilder(); |
+ CompilationInfo* info_; |
+ HGraph* graph_; |
+ HBasicBlock* current_block_; |
+}; |
+ |
+ |
+class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor { |
public: |
enum BreakType { BREAK, CONTINUE }; |
enum SwitchType { UNKNOWN_SWITCH, SMI_SWITCH, STRING_SWITCH }; |
@@ -864,7 +925,8 @@ class HGraphBuilder: public AstVisitor { |
// structures mirroring BreakableStatement nesting. |
class BreakAndContinueScope BASE_EMBEDDED { |
public: |
- BreakAndContinueScope(BreakAndContinueInfo* info, HGraphBuilder* owner) |
+ BreakAndContinueScope(BreakAndContinueInfo* info, |
+ HOptimizedGraphBuilder* owner) |
: info_(info), owner_(owner), next_(owner->break_scope()) { |
owner->set_break_scope(this); |
} |
@@ -872,7 +934,7 @@ class HGraphBuilder: public AstVisitor { |
~BreakAndContinueScope() { owner_->set_break_scope(next_); } |
BreakAndContinueInfo* info() { return info_; } |
- HGraphBuilder* owner() { return owner_; } |
+ HOptimizedGraphBuilder* owner() { return owner_; } |
BreakAndContinueScope* next() { return next_; } |
// Search the break stack for a break or continue target. |
@@ -880,32 +942,20 @@ class HGraphBuilder: public AstVisitor { |
private: |
BreakAndContinueInfo* info_; |
- HGraphBuilder* owner_; |
+ HOptimizedGraphBuilder* owner_; |
BreakAndContinueScope* next_; |
}; |
- HGraphBuilder(CompilationInfo* info, TypeFeedbackOracle* oracle); |
+ HOptimizedGraphBuilder(CompilationInfo* info, TypeFeedbackOracle* oracle); |
- HGraph* CreateGraph(); |
+ virtual bool BuildGraph(); |
// Simple accessors. |
- HGraph* graph() const { return graph_; } |
BreakAndContinueScope* break_scope() const { return break_scope_; } |
void set_break_scope(BreakAndContinueScope* head) { break_scope_ = head; } |
- HBasicBlock* current_block() const { return current_block_; } |
- void set_current_block(HBasicBlock* block) { current_block_ = block; } |
- HEnvironment* environment() const { |
- return current_block()->last_environment(); |
- } |
- |
bool inline_bailout() { return inline_bailout_; } |
- // Adding instructions. |
- HInstruction* AddInstruction(HInstruction* instr); |
- void AddSimulate(BailoutId ast_id, |
- RemovableSimulate removable = FIXED_SIMULATE); |
- |
// Bailout environment manipulation. |
void Push(HValue* value) { environment()->Push(value); } |
HValue* Pop() { return environment()->Pop(); } |
@@ -928,9 +978,12 @@ class HGraphBuilder: public AstVisitor { |
void operator delete(void* pointer, Zone* zone) { } |
void operator delete(void* pointer) { } |
+ DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |
+ |
private: |
// Type of a member function that generates inline code for a native function. |
- typedef void (HGraphBuilder::*InlineFunctionGenerator)(CallRuntime* call); |
+ typedef void (HOptimizedGraphBuilder::*InlineFunctionGenerator) |
+ (CallRuntime* call); |
// Forward declarations for inner scope classes. |
class SubgraphScope; |
@@ -1139,25 +1192,14 @@ class HGraphBuilder: public AstVisitor { |
HValue* right); |
HInstruction* BuildIncrement(bool returns_original_input, |
CountOperation* expr); |
- HInstruction* BuildFastElementAccess(HValue* elements, |
- HValue* checked_key, |
- HValue* val, |
- HValue* dependency, |
- ElementsKind elements_kind, |
- bool is_store); |
+ HInstruction* BuildLoadKeyedGeneric(HValue* object, |
+ HValue* key); |
HInstruction* TryBuildConsolidatedElementLoad(HValue* object, |
HValue* key, |
HValue* val, |
SmallMapList* maps); |
- HInstruction* BuildUncheckedMonomorphicElementAccess(HValue* object, |
- HValue* key, |
- HValue* val, |
- HCheckMaps* mapcheck, |
- Handle<Map> map, |
- bool is_store); |
- |
HInstruction* BuildMonomorphicElementAccess(HValue* object, |
HValue* key, |
HValue* val, |
@@ -1197,14 +1239,6 @@ class HGraphBuilder: public AstVisitor { |
Handle<String> name, |
Property* expr, |
Handle<Map> map); |
- HInstruction* BuildLoadKeyedGeneric(HValue* object, HValue* key); |
- HInstruction* BuildExternalArrayElementAccess( |
- HValue* external_elements, |
- HValue* checked_key, |
- HValue* val, |
- HValue* dependency, |
- ElementsKind elements_kind, |
- bool is_store); |
void AddCheckMapsWithTransitions(HValue* object, |
Handle<Map> map); |
@@ -1246,8 +1280,6 @@ class HGraphBuilder: public AstVisitor { |
HValue** operand, |
HValue** shift_amount); |
- Zone* zone() const { return zone_; } |
- |
// The translation state of the currently-being-translated function. |
FunctionState* function_state_; |
@@ -1261,20 +1293,16 @@ class HGraphBuilder: public AstVisitor { |
// A stack of breakable statements entered. |
BreakAndContinueScope* break_scope_; |
- HGraph* graph_; |
- HBasicBlock* current_block_; |
- |
int inlined_count_; |
ZoneList<Handle<Object> > globals_; |
- Zone* zone_; |
- |
bool inline_bailout_; |
friend class FunctionState; // Pushes and pops the state stack. |
friend class AstContext; // Pushes and pops the AST context stack. |
+ friend class KeyedLoadFastElementStub; |
- DISALLOW_COPY_AND_ASSIGN(HGraphBuilder); |
+ DISALLOW_COPY_AND_ASSIGN(HOptimizedGraphBuilder); |
}; |
@@ -1447,7 +1475,7 @@ class HPhase BASE_EMBEDDED { |
class HTracer: public Malloced { |
public: |
- void TraceCompilation(FunctionLiteral* function); |
+ void TraceCompilation(CompilationInfo* info); |
void TraceHydrogen(const char* name, HGraph* graph); |
void TraceLithium(const char* name, LChunk* chunk); |
void TraceLiveRanges(const char* name, LAllocator* allocator); |