| 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 |