Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_CRANKSHAFT_HYDROGEN_H_ | 5 #ifndef V8_CRANKSHAFT_HYDROGEN_H_ |
| 6 #define V8_CRANKSHAFT_HYDROGEN_H_ | 6 #define V8_CRANKSHAFT_HYDROGEN_H_ |
| 7 | 7 |
| 8 #include "src/accessors.h" | 8 #include "src/accessors.h" |
| 9 #include "src/allocation.h" | 9 #include "src/allocation.h" |
| 10 #include "src/ast/ast.h" | 10 #include "src/ast/ast.h" |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 494 Zone* HBasicBlock::zone() const { return graph_->zone(); } | 494 Zone* HBasicBlock::zone() const { return graph_->zone(); } |
| 495 | 495 |
| 496 | 496 |
| 497 // Type of stack frame an environment might refer to. | 497 // Type of stack frame an environment might refer to. |
| 498 enum FrameType { | 498 enum FrameType { |
| 499 JS_FUNCTION, | 499 JS_FUNCTION, |
| 500 JS_CONSTRUCT, | 500 JS_CONSTRUCT, |
| 501 JS_GETTER, | 501 JS_GETTER, |
| 502 JS_SETTER, | 502 JS_SETTER, |
| 503 ARGUMENTS_ADAPTOR, | 503 ARGUMENTS_ADAPTOR, |
| 504 TAIL_CALLER_FUNCTION, | |
| 504 STUB | 505 STUB |
| 505 }; | 506 }; |
| 506 | 507 |
| 507 | |
| 508 class HEnvironment final : public ZoneObject { | 508 class HEnvironment final : public ZoneObject { |
| 509 public: | 509 public: |
| 510 HEnvironment(HEnvironment* outer, | 510 HEnvironment(HEnvironment* outer, |
| 511 Scope* scope, | 511 Scope* scope, |
| 512 Handle<JSFunction> closure, | 512 Handle<JSFunction> closure, |
| 513 Zone* zone); | 513 Zone* zone); |
| 514 | 514 |
| 515 HEnvironment(Zone* zone, int parameter_count); | 515 HEnvironment(Zone* zone, int parameter_count); |
| 516 | 516 |
| 517 HEnvironment* arguments_environment() { | 517 HEnvironment* arguments_environment() { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 606 | 606 |
| 607 void Print() const; | 607 void Print() const; |
| 608 | 608 |
| 609 HEnvironment* Copy() const; | 609 HEnvironment* Copy() const; |
| 610 HEnvironment* CopyWithoutHistory() const; | 610 HEnvironment* CopyWithoutHistory() const; |
| 611 HEnvironment* CopyAsLoopHeader(HBasicBlock* block) const; | 611 HEnvironment* CopyAsLoopHeader(HBasicBlock* block) const; |
| 612 | 612 |
| 613 // Create an "inlined version" of this environment, where the original | 613 // Create an "inlined version" of this environment, where the original |
| 614 // environment is the outer environment but the top expression stack | 614 // environment is the outer environment but the top expression stack |
| 615 // elements are moved to an inner environment as parameters. | 615 // elements are moved to an inner environment as parameters. |
| 616 HEnvironment* CopyForInlining(Handle<JSFunction> target, | 616 HEnvironment* CopyForInlining(Handle<JSFunction> target, int arguments, |
| 617 int arguments, | 617 FunctionLiteral* function, HConstant* undefined, |
| 618 FunctionLiteral* function, | 618 InliningKind inlining_kind, |
| 619 HConstant* undefined, | 619 TailCallMode syntactic_tail_call_mode) const; |
| 620 InliningKind inlining_kind) const; | |
| 621 | 620 |
| 622 HEnvironment* DiscardInlined(bool drop_extra) { | 621 HEnvironment* DiscardInlined(bool drop_extra) { |
| 623 HEnvironment* outer = outer_; | 622 HEnvironment* outer = outer_; |
| 624 while (outer->frame_type() != JS_FUNCTION) outer = outer->outer_; | 623 while (outer->frame_type() != JS_FUNCTION && |
| 624 outer->frame_type() != TAIL_CALLER_FUNCTION) { | |
| 625 outer = outer->outer_; | |
| 626 } | |
| 625 if (drop_extra) outer->Drop(1); | 627 if (drop_extra) outer->Drop(1); |
| 626 return outer; | 628 return outer; |
| 627 } | 629 } |
| 628 | 630 |
| 629 void AddIncomingEdge(HBasicBlock* block, HEnvironment* other); | 631 void AddIncomingEdge(HBasicBlock* block, HEnvironment* other); |
| 630 | 632 |
| 631 void ClearHistory() { | 633 void ClearHistory() { |
| 632 pop_count_ = 0; | 634 pop_count_ = 0; |
| 633 push_count_ = 0; | 635 push_count_ = 0; |
| 634 assigned_variables_.Clear(); | 636 assigned_variables_.Clear(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 673 int arguments, | 675 int arguments, |
| 674 Zone* zone); | 676 Zone* zone); |
| 675 | 677 |
| 676 // Create an artificial stub environment (e.g. for argument adaptor or | 678 // Create an artificial stub environment (e.g. for argument adaptor or |
| 677 // constructor stub). | 679 // constructor stub). |
| 678 HEnvironment* CreateStubEnvironment(HEnvironment* outer, | 680 HEnvironment* CreateStubEnvironment(HEnvironment* outer, |
| 679 Handle<JSFunction> target, | 681 Handle<JSFunction> target, |
| 680 FrameType frame_type, | 682 FrameType frame_type, |
| 681 int arguments) const; | 683 int arguments) const; |
| 682 | 684 |
| 685 void MarkAsTailCaller(); | |
|
Michael Starzinger
2016/03/21 14:06:50
nit: Let's add a short comment explaining the sema
Igor Sheludko
2016/03/22 14:08:37
Done. It looks like we can't drop outer environmen
| |
| 686 | |
| 683 // True if index is included in the expression stack part of the environment. | 687 // True if index is included in the expression stack part of the environment. |
| 684 bool HasExpressionAt(int index) const; | 688 bool HasExpressionAt(int index) const; |
| 685 | 689 |
| 686 void Initialize(int parameter_count, int local_count, int stack_height); | 690 void Initialize(int parameter_count, int local_count, int stack_height); |
| 687 void Initialize(const HEnvironment* other); | 691 void Initialize(const HEnvironment* other); |
| 688 | 692 |
| 689 Handle<JSFunction> closure_; | 693 Handle<JSFunction> closure_; |
| 690 // Value array [parameters] [specials] [locals] [temporaries]. | 694 // Value array [parameters] [specials] [locals] [temporaries]. |
| 691 ZoneList<HValue*> values_; | 695 ZoneList<HValue*> values_; |
| 692 GrowableBitVector assigned_variables_; | 696 GrowableBitVector assigned_variables_; |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1271 P5 p5, P6 p6, P7 p7, P8 p8) { | 1275 P5 p5, P6 p6, P7 p7, P8 p8) { |
| 1272 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)); | 1276 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)); |
| 1273 } | 1277 } |
| 1274 | 1278 |
| 1275 template<class I, class P1, class P2, class P3, class P4, | 1279 template<class I, class P1, class P2, class P3, class P4, |
| 1276 class P5, class P6, class P7, class P8> | 1280 class P5, class P6, class P7, class P8> |
| 1277 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) { | 1281 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) { |
| 1278 return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6, p7, p8)); | 1282 return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6, p7, p8)); |
| 1279 } | 1283 } |
| 1280 | 1284 |
| 1285 template <class I, class P1, class P2, class P3, class P4, class P5, class P6, | |
| 1286 class P7, class P8, class P9> | |
| 1287 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9) { | |
| 1288 return I::New(isolate(), zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8, | |
| 1289 p9); | |
| 1290 } | |
| 1291 | |
| 1292 template <class I, class P1, class P2, class P3, class P4, class P5, class P6, | |
| 1293 class P7, class P8, class P9> | |
| 1294 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, | |
| 1295 P8 p8, P9 p9) { | |
| 1296 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8, p8)); | |
| 1297 } | |
| 1298 | |
| 1299 template <class I, class P1, class P2, class P3, class P4, class P5, class P6, | |
| 1300 class P7, class P8, class P9> | |
| 1301 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9) { | |
| 1302 return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6, p7, p8, p9)); | |
| 1303 } | |
| 1304 | |
| 1281 void AddSimulate(BailoutId id, RemovableSimulate removable = FIXED_SIMULATE); | 1305 void AddSimulate(BailoutId id, RemovableSimulate removable = FIXED_SIMULATE); |
| 1282 | 1306 |
| 1283 // When initializing arrays, we'll unfold the loop if the number of elements | 1307 // When initializing arrays, we'll unfold the loop if the number of elements |
| 1284 // is known at compile time and is <= kElementLoopUnrollThreshold. | 1308 // is known at compile time and is <= kElementLoopUnrollThreshold. |
| 1285 static const int kElementLoopUnrollThreshold = 8; | 1309 static const int kElementLoopUnrollThreshold = 8; |
| 1286 | 1310 |
| 1287 protected: | 1311 protected: |
| 1288 virtual bool BuildGraph() = 0; | 1312 virtual bool BuildGraph() = 0; |
| 1289 | 1313 |
| 1290 HBasicBlock* CreateBasicBlock(HEnvironment* env); | 1314 HBasicBlock* CreateBasicBlock(HEnvironment* env); |
| (...skipping 1767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3058 } | 3082 } |
| 3059 | 3083 |
| 3060 private: | 3084 private: |
| 3061 HOptimizedGraphBuilder* builder_; | 3085 HOptimizedGraphBuilder* builder_; |
| 3062 }; | 3086 }; |
| 3063 | 3087 |
| 3064 } // namespace internal | 3088 } // namespace internal |
| 3065 } // namespace v8 | 3089 } // namespace v8 |
| 3066 | 3090 |
| 3067 #endif // V8_CRANKSHAFT_HYDROGEN_H_ | 3091 #endif // V8_CRANKSHAFT_HYDROGEN_H_ |
| OLD | NEW |