OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/compiler/typer.h" | 5 #include "src/compiler/typer.h" |
6 | 6 |
7 #include <iomanip> | 7 #include <iomanip> |
8 | 8 |
9 #include "src/base/flags.h" | 9 #include "src/base/flags.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
11 #include "src/compiler/common-operator.h" | 11 #include "src/compiler/common-operator.h" |
12 #include "src/compiler/graph-reducer.h" | 12 #include "src/compiler/graph-reducer.h" |
13 #include "src/compiler/js-operator.h" | 13 #include "src/compiler/js-operator.h" |
| 14 #include "src/compiler/linkage.h" |
14 #include "src/compiler/loop-variable-optimizer.h" | 15 #include "src/compiler/loop-variable-optimizer.h" |
15 #include "src/compiler/node-properties.h" | 16 #include "src/compiler/node-properties.h" |
16 #include "src/compiler/node.h" | 17 #include "src/compiler/node.h" |
17 #include "src/compiler/operation-typer.h" | 18 #include "src/compiler/operation-typer.h" |
18 #include "src/compiler/simplified-operator.h" | 19 #include "src/compiler/simplified-operator.h" |
19 #include "src/compiler/type-cache.h" | 20 #include "src/compiler/type-cache.h" |
20 #include "src/objects-inl.h" | 21 #include "src/objects-inl.h" |
21 | 22 |
22 namespace v8 { | 23 namespace v8 { |
23 namespace internal { | 24 namespace internal { |
24 namespace compiler { | 25 namespace compiler { |
25 | 26 |
26 class Typer::Decorator final : public GraphDecorator { | 27 class Typer::Decorator final : public GraphDecorator { |
27 public: | 28 public: |
28 explicit Decorator(Typer* typer) : typer_(typer) {} | 29 explicit Decorator(Typer* typer) : typer_(typer) {} |
29 void Decorate(Node* node) final; | 30 void Decorate(Node* node) final; |
30 | 31 |
31 private: | 32 private: |
32 Typer* const typer_; | 33 Typer* const typer_; |
33 }; | 34 }; |
34 | 35 |
35 Typer::Typer(Isolate* isolate, Graph* graph) | 36 Typer::Typer(Isolate* isolate, Flags flags, Graph* graph) |
36 : isolate_(isolate), | 37 : isolate_(isolate), |
| 38 flags_(flags), |
37 graph_(graph), | 39 graph_(graph), |
38 decorator_(nullptr), | 40 decorator_(nullptr), |
39 cache_(TypeCache::Get()), | 41 cache_(TypeCache::Get()), |
40 operation_typer_(isolate, zone()) { | 42 operation_typer_(isolate, zone()) { |
41 Zone* zone = this->zone(); | 43 Zone* zone = this->zone(); |
42 Factory* const factory = isolate->factory(); | 44 Factory* const factory = isolate->factory(); |
43 | 45 |
44 singleton_false_ = Type::HeapConstant(factory->false_value(), zone); | 46 singleton_false_ = Type::HeapConstant(factory->false_value(), zone); |
45 singleton_true_ = Type::HeapConstant(factory->true_value(), zone); | 47 singleton_true_ = Type::HeapConstant(factory->true_value(), zone); |
46 singleton_the_hole_ = Type::HeapConstant(factory->the_hole_value(), zone); | 48 singleton_the_hole_ = Type::HeapConstant(factory->the_hole_value(), zone); |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 // Control operators. | 541 // Control operators. |
540 | 542 |
541 Type* Typer::Visitor::TypeStart(Node* node) { return Type::Internal(); } | 543 Type* Typer::Visitor::TypeStart(Node* node) { return Type::Internal(); } |
542 | 544 |
543 Type* Typer::Visitor::TypeIfException(Node* node) { | 545 Type* Typer::Visitor::TypeIfException(Node* node) { |
544 return Type::NonInternal(); | 546 return Type::NonInternal(); |
545 } | 547 } |
546 | 548 |
547 // Common operators. | 549 // Common operators. |
548 | 550 |
549 Type* Typer::Visitor::TypeParameter(Node* node) { return Type::Any(); } | 551 Type* Typer::Visitor::TypeParameter(Node* node) { |
| 552 Node* const start = node->InputAt(0); |
| 553 DCHECK_EQ(IrOpcode::kStart, start->opcode()); |
| 554 int const parameter_count = start->op()->ValueOutputCount() - 4; |
| 555 DCHECK_LE(1, parameter_count); |
| 556 int const index = ParameterIndexOf(node->op()); |
| 557 if (index == Linkage::kJSCallClosureParamIndex) { |
| 558 return Type::Function(); |
| 559 } else if (index == 0) { |
| 560 if (typer_->flags() & Typer::kThisIsReceiver) { |
| 561 return Type::Receiver(); |
| 562 } else { |
| 563 // Parameter[this] can be the_hole for derived class constructors. |
| 564 return Type::Union(Type::Hole(), Type::NonInternal(), typer_->zone()); |
| 565 } |
| 566 } else if (index == Linkage::GetJSCallNewTargetParamIndex(parameter_count)) { |
| 567 if (typer_->flags() & Typer::kNewTargetIsReceiver) { |
| 568 return Type::Receiver(); |
| 569 } else { |
| 570 return Type::Union(Type::Receiver(), Type::Undefined(), typer_->zone()); |
| 571 } |
| 572 } else if (index == Linkage::GetJSCallArgCountParamIndex(parameter_count)) { |
| 573 return Type::Range(0.0, Code::kMaxArguments, typer_->zone()); |
| 574 } else if (index == Linkage::GetJSCallContextParamIndex(parameter_count)) { |
| 575 return Type::OtherInternal(); |
| 576 } |
| 577 return Type::NonInternal(); |
| 578 } |
550 | 579 |
551 Type* Typer::Visitor::TypeOsrValue(Node* node) { return Type::Any(); } | 580 Type* Typer::Visitor::TypeOsrValue(Node* node) { return Type::Any(); } |
552 | 581 |
553 Type* Typer::Visitor::TypeOsrGuard(Node* node) { | 582 Type* Typer::Visitor::TypeOsrGuard(Node* node) { |
554 switch (OsrGuardTypeOf(node->op())) { | 583 switch (OsrGuardTypeOf(node->op())) { |
555 case OsrGuardType::kUninitialized: | 584 case OsrGuardType::kUninitialized: |
556 return Type::None(); | 585 return Type::None(); |
557 case OsrGuardType::kSignedSmall: | 586 case OsrGuardType::kSignedSmall: |
558 return Type::SignedSmall(); | 587 return Type::SignedSmall(); |
559 case OsrGuardType::kAny: | 588 case OsrGuardType::kAny: |
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1705 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { | 1734 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { |
1706 if (Type::IsInteger(*value)) { | 1735 if (Type::IsInteger(*value)) { |
1707 return Type::Range(value->Number(), value->Number(), zone()); | 1736 return Type::Range(value->Number(), value->Number(), zone()); |
1708 } | 1737 } |
1709 return Type::NewConstant(value, zone()); | 1738 return Type::NewConstant(value, zone()); |
1710 } | 1739 } |
1711 | 1740 |
1712 } // namespace compiler | 1741 } // namespace compiler |
1713 } // namespace internal | 1742 } // namespace internal |
1714 } // namespace v8 | 1743 } // namespace v8 |
OLD | NEW |