| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 | 134 |
| 135 // If a target block is tagged as an inline function return, all | 135 // If a target block is tagged as an inline function return, all |
| 136 // predecessors should contain the inlined exit sequence: | 136 // predecessors should contain the inlined exit sequence: |
| 137 // | 137 // |
| 138 // LeaveInlined | 138 // LeaveInlined |
| 139 // Simulate (caller's environment) | 139 // Simulate (caller's environment) |
| 140 // Goto (target block) | 140 // Goto (target block) |
| 141 bool IsInlineReturnTarget() const { return is_inline_return_target_; } | 141 bool IsInlineReturnTarget() const { return is_inline_return_target_; } |
| 142 void MarkAsInlineReturnTarget() { is_inline_return_target_ = true; } | 142 void MarkAsInlineReturnTarget() { is_inline_return_target_ = true; } |
| 143 | 143 |
| 144 inline Zone* zone(); |
| 145 |
| 144 #ifdef DEBUG | 146 #ifdef DEBUG |
| 145 void Verify(); | 147 void Verify(); |
| 146 #endif | 148 #endif |
| 147 | 149 |
| 148 private: | 150 private: |
| 149 void RegisterPredecessor(HBasicBlock* pred); | 151 void RegisterPredecessor(HBasicBlock* pred); |
| 150 void AddDominatedBlock(HBasicBlock* block); | 152 void AddDominatedBlock(HBasicBlock* block); |
| 151 | 153 |
| 152 HSimulate* CreateSimulate(int id); | 154 HSimulate* CreateSimulate(int id); |
| 153 HDeoptimize* CreateDeoptimize(); | 155 HDeoptimize* CreateDeoptimize(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 ZoneList<HBasicBlock*> back_edges_; | 196 ZoneList<HBasicBlock*> back_edges_; |
| 195 HBasicBlock* loop_header_; | 197 HBasicBlock* loop_header_; |
| 196 ZoneList<HBasicBlock*> blocks_; | 198 ZoneList<HBasicBlock*> blocks_; |
| 197 }; | 199 }; |
| 198 | 200 |
| 199 | 201 |
| 200 class HGraph: public ZoneObject { | 202 class HGraph: public ZoneObject { |
| 201 public: | 203 public: |
| 202 explicit HGraph(CompilationInfo* info); | 204 explicit HGraph(CompilationInfo* info); |
| 203 | 205 |
| 206 Isolate* isolate() { return isolate_; } |
| 207 Zone* zone() { return isolate_->zone(); } |
| 208 |
| 204 const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; } | 209 const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; } |
| 205 const ZoneList<HPhi*>* phi_list() const { return phi_list_; } | 210 const ZoneList<HPhi*>* phi_list() const { return phi_list_; } |
| 206 HBasicBlock* entry_block() const { return entry_block_; } | 211 HBasicBlock* entry_block() const { return entry_block_; } |
| 207 HEnvironment* start_environment() const { return start_environment_; } | 212 HEnvironment* start_environment() const { return start_environment_; } |
| 208 | 213 |
| 209 void InitializeInferredTypes(); | 214 void InitializeInferredTypes(); |
| 210 void InsertTypeConversions(); | 215 void InsertTypeConversions(); |
| 211 void InsertRepresentationChanges(); | 216 void InsertRepresentationChanges(); |
| 212 void ComputeMinusZeroChecks(); | 217 void ComputeMinusZeroChecks(); |
| 213 bool ProcessArgumentsObject(); | 218 bool ProcessArgumentsObject(); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 void InsertRepresentationChangeForUse(HValue* value, | 279 void InsertRepresentationChangeForUse(HValue* value, |
| 275 HValue* use, | 280 HValue* use, |
| 276 Representation to); | 281 Representation to); |
| 277 void InsertRepresentationChangesForValue(HValue* current, | 282 void InsertRepresentationChangesForValue(HValue* current, |
| 278 ZoneList<HValue*>* value_list, | 283 ZoneList<HValue*>* value_list, |
| 279 ZoneList<Representation>* rep_list); | 284 ZoneList<Representation>* rep_list); |
| 280 void InferTypes(ZoneList<HValue*>* worklist); | 285 void InferTypes(ZoneList<HValue*>* worklist); |
| 281 void InitializeInferredTypes(int from_inclusive, int to_inclusive); | 286 void InitializeInferredTypes(int from_inclusive, int to_inclusive); |
| 282 void CheckForBackEdge(HBasicBlock* block, HBasicBlock* successor); | 287 void CheckForBackEdge(HBasicBlock* block, HBasicBlock* successor); |
| 283 | 288 |
| 284 Isolate* isolate() { return isolate_; } | |
| 285 | |
| 286 Isolate* isolate_; | 289 Isolate* isolate_; |
| 287 int next_block_id_; | 290 int next_block_id_; |
| 288 HBasicBlock* entry_block_; | 291 HBasicBlock* entry_block_; |
| 289 HEnvironment* start_environment_; | 292 HEnvironment* start_environment_; |
| 290 ZoneList<HBasicBlock*> blocks_; | 293 ZoneList<HBasicBlock*> blocks_; |
| 291 ZoneList<HValue*> values_; | 294 ZoneList<HValue*> values_; |
| 292 ZoneList<HPhi*>* phi_list_; | 295 ZoneList<HPhi*>* phi_list_; |
| 293 SetOncePointer<HConstant> undefined_constant_; | 296 SetOncePointer<HConstant> undefined_constant_; |
| 294 SetOncePointer<HConstant> constant_1_; | 297 SetOncePointer<HConstant> constant_1_; |
| 295 SetOncePointer<HConstant> constant_minus1_; | 298 SetOncePointer<HConstant> constant_minus1_; |
| 296 SetOncePointer<HConstant> constant_true_; | 299 SetOncePointer<HConstant> constant_true_; |
| 297 SetOncePointer<HConstant> constant_false_; | 300 SetOncePointer<HConstant> constant_false_; |
| 298 SetOncePointer<HArgumentsObject> arguments_object_; | 301 SetOncePointer<HArgumentsObject> arguments_object_; |
| 299 | 302 |
| 300 DISALLOW_COPY_AND_ASSIGN(HGraph); | 303 DISALLOW_COPY_AND_ASSIGN(HGraph); |
| 301 }; | 304 }; |
| 302 | 305 |
| 303 | 306 |
| 307 Zone* HBasicBlock::zone() { return graph_->zone(); } |
| 308 |
| 309 |
| 304 class HEnvironment: public ZoneObject { | 310 class HEnvironment: public ZoneObject { |
| 305 public: | 311 public: |
| 306 HEnvironment(HEnvironment* outer, | 312 HEnvironment(HEnvironment* outer, |
| 307 Scope* scope, | 313 Scope* scope, |
| 308 Handle<JSFunction> closure); | 314 Handle<JSFunction> closure); |
| 309 | 315 |
| 310 // Simple accessors. | 316 // Simple accessors. |
| 311 Handle<JSFunction> closure() const { return closure_; } | 317 Handle<JSFunction> closure() const { return closure_; } |
| 312 const ZoneList<HValue*>* values() const { return &values_; } | 318 const ZoneList<HValue*>* values() const { return &values_; } |
| 313 const ZoneList<int>* assigned_variables() const { | 319 const ZoneList<int>* assigned_variables() const { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 | 461 |
| 456 void set_for_typeof(bool for_typeof) { for_typeof_ = for_typeof; } | 462 void set_for_typeof(bool for_typeof) { for_typeof_ = for_typeof; } |
| 457 bool is_for_typeof() { return for_typeof_; } | 463 bool is_for_typeof() { return for_typeof_; } |
| 458 | 464 |
| 459 protected: | 465 protected: |
| 460 AstContext(HGraphBuilder* owner, Expression::Context kind); | 466 AstContext(HGraphBuilder* owner, Expression::Context kind); |
| 461 virtual ~AstContext(); | 467 virtual ~AstContext(); |
| 462 | 468 |
| 463 HGraphBuilder* owner() const { return owner_; } | 469 HGraphBuilder* owner() const { return owner_; } |
| 464 | 470 |
| 471 inline Zone* zone(); |
| 472 |
| 465 // We want to be able to assert, in a context-specific way, that the stack | 473 // We want to be able to assert, in a context-specific way, that the stack |
| 466 // height makes sense when the context is filled. | 474 // height makes sense when the context is filled. |
| 467 #ifdef DEBUG | 475 #ifdef DEBUG |
| 468 int original_length_; | 476 int original_length_; |
| 469 #endif | 477 #endif |
| 470 | 478 |
| 471 private: | 479 private: |
| 472 HGraphBuilder* owner_; | 480 HGraphBuilder* owner_; |
| 473 Expression::Context kind_; | 481 Expression::Context kind_; |
| 474 AstContext* outer_; | 482 AstContext* outer_; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 BreakAndContinueScope* next_; | 631 BreakAndContinueScope* next_; |
| 624 }; | 632 }; |
| 625 | 633 |
| 626 HGraphBuilder(CompilationInfo* info, TypeFeedbackOracle* oracle) | 634 HGraphBuilder(CompilationInfo* info, TypeFeedbackOracle* oracle) |
| 627 : function_state_(NULL), | 635 : function_state_(NULL), |
| 628 initial_function_state_(this, info, oracle), | 636 initial_function_state_(this, info, oracle), |
| 629 ast_context_(NULL), | 637 ast_context_(NULL), |
| 630 break_scope_(NULL), | 638 break_scope_(NULL), |
| 631 graph_(NULL), | 639 graph_(NULL), |
| 632 current_block_(NULL), | 640 current_block_(NULL), |
| 633 inlined_count_(0) { | 641 inlined_count_(0), |
| 642 zone_(info->isolate()->zone()) { |
| 634 // This is not initialized in the initializer list because the | 643 // This is not initialized in the initializer list because the |
| 635 // constructor for the initial state relies on function_state_ == NULL | 644 // constructor for the initial state relies on function_state_ == NULL |
| 636 // to know it's the initial state. | 645 // to know it's the initial state. |
| 637 function_state_= &initial_function_state_; | 646 function_state_= &initial_function_state_; |
| 638 } | 647 } |
| 639 | 648 |
| 640 HGraph* CreateGraph(); | 649 HGraph* CreateGraph(); |
| 641 | 650 |
| 642 // Simple accessors. | 651 // Simple accessors. |
| 643 HGraph* graph() const { return graph_; } | 652 HGraph* graph() const { return graph_; } |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 HValue* val, | 876 HValue* val, |
| 868 Assignment* expr); | 877 Assignment* expr); |
| 869 | 878 |
| 870 HValue* BuildContextChainWalk(Variable* var); | 879 HValue* BuildContextChainWalk(Variable* var); |
| 871 | 880 |
| 872 void AddCheckConstantFunction(Call* expr, | 881 void AddCheckConstantFunction(Call* expr, |
| 873 HValue* receiver, | 882 HValue* receiver, |
| 874 Handle<Map> receiver_map, | 883 Handle<Map> receiver_map, |
| 875 bool smi_and_map_check); | 884 bool smi_and_map_check); |
| 876 | 885 |
| 886 Zone* zone() { return zone_; } |
| 877 | 887 |
| 878 // The translation state of the currently-being-translated function. | 888 // The translation state of the currently-being-translated function. |
| 879 FunctionState* function_state_; | 889 FunctionState* function_state_; |
| 880 | 890 |
| 881 // The base of the function state stack. | 891 // The base of the function state stack. |
| 882 FunctionState initial_function_state_; | 892 FunctionState initial_function_state_; |
| 883 | 893 |
| 884 // Expression context of the currently visited subexpression. NULL when | 894 // Expression context of the currently visited subexpression. NULL when |
| 885 // visiting statements. | 895 // visiting statements. |
| 886 AstContext* ast_context_; | 896 AstContext* ast_context_; |
| 887 | 897 |
| 888 // A stack of breakable statements entered. | 898 // A stack of breakable statements entered. |
| 889 BreakAndContinueScope* break_scope_; | 899 BreakAndContinueScope* break_scope_; |
| 890 | 900 |
| 891 HGraph* graph_; | 901 HGraph* graph_; |
| 892 HBasicBlock* current_block_; | 902 HBasicBlock* current_block_; |
| 893 | 903 |
| 894 int inlined_count_; | 904 int inlined_count_; |
| 895 | 905 |
| 906 Zone* zone_; |
| 907 |
| 896 friend class FunctionState; // Pushes and pops the state stack. | 908 friend class FunctionState; // Pushes and pops the state stack. |
| 897 friend class AstContext; // Pushes and pops the AST context stack. | 909 friend class AstContext; // Pushes and pops the AST context stack. |
| 898 | 910 |
| 899 DISALLOW_COPY_AND_ASSIGN(HGraphBuilder); | 911 DISALLOW_COPY_AND_ASSIGN(HGraphBuilder); |
| 900 }; | 912 }; |
| 901 | 913 |
| 902 | 914 |
| 915 Zone* AstContext::zone() { return owner_->zone(); } |
| 916 |
| 917 |
| 903 class HValueMap: public ZoneObject { | 918 class HValueMap: public ZoneObject { |
| 904 public: | 919 public: |
| 905 HValueMap() | 920 HValueMap() |
| 906 : array_size_(0), | 921 : array_size_(0), |
| 907 lists_size_(0), | 922 lists_size_(0), |
| 908 count_(0), | 923 count_(0), |
| 909 present_flags_(0), | 924 present_flags_(0), |
| 910 array_(NULL), | 925 array_(NULL), |
| 911 lists_(NULL), | 926 lists_(NULL), |
| 912 free_list_head_(kNil) { | 927 free_list_head_(kNil) { |
| 913 ResizeLists(kInitialSize); | 928 ResizeLists(kInitialSize); |
| 914 Resize(kInitialSize); | 929 Resize(kInitialSize); |
| 915 } | 930 } |
| 916 | 931 |
| 917 void Kill(int flags); | 932 void Kill(int flags); |
| 918 | 933 |
| 919 void Add(HValue* value) { | 934 void Add(HValue* value) { |
| 920 present_flags_ |= value->flags(); | 935 present_flags_ |= value->flags(); |
| 921 Insert(value); | 936 Insert(value); |
| 922 } | 937 } |
| 923 | 938 |
| 924 HValue* Lookup(HValue* value) const; | 939 HValue* Lookup(HValue* value) const; |
| 925 HValueMap* Copy() const { return new HValueMap(this); } | 940 |
| 941 HValueMap* Copy(Zone* zone) const { |
| 942 return new(zone) HValueMap(this); |
| 943 } |
| 926 | 944 |
| 927 private: | 945 private: |
| 928 // A linked list of HValue* values. Stored in arrays. | 946 // A linked list of HValue* values. Stored in arrays. |
| 929 struct HValueMapListElement { | 947 struct HValueMapListElement { |
| 930 HValue* value; | 948 HValue* value; |
| 931 int next; // Index in the array of the next list element. | 949 int next; // Index in the array of the next list element. |
| 932 }; | 950 }; |
| 933 static const int kNil = -1; // The end of a linked list | 951 static const int kNil = -1; // The end of a linked list |
| 934 | 952 |
| 935 // Must be a power of 2. | 953 // Must be a power of 2. |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1110 const char* filename_; | 1128 const char* filename_; |
| 1111 HeapStringAllocator string_allocator_; | 1129 HeapStringAllocator string_allocator_; |
| 1112 StringStream trace_; | 1130 StringStream trace_; |
| 1113 int indent_; | 1131 int indent_; |
| 1114 }; | 1132 }; |
| 1115 | 1133 |
| 1116 | 1134 |
| 1117 } } // namespace v8::internal | 1135 } } // namespace v8::internal |
| 1118 | 1136 |
| 1119 #endif // V8_HYDROGEN_H_ | 1137 #endif // V8_HYDROGEN_H_ |
| OLD | NEW |