| 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" |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 | 509 |
| 510 | 510 |
| 511 Type* Typer::Visitor::ObjectIsReceiver(Type* type, Typer* t) { | 511 Type* Typer::Visitor::ObjectIsReceiver(Type* type, Typer* t) { |
| 512 if (type->Is(Type::Receiver())) return t->singleton_true_; | 512 if (type->Is(Type::Receiver())) return t->singleton_true_; |
| 513 if (!type->Maybe(Type::Receiver())) return t->singleton_false_; | 513 if (!type->Maybe(Type::Receiver())) return t->singleton_false_; |
| 514 return Type::Boolean(); | 514 return Type::Boolean(); |
| 515 } | 515 } |
| 516 | 516 |
| 517 | 517 |
| 518 Type* Typer::Visitor::ObjectIsSmi(Type* type, Typer* t) { | 518 Type* Typer::Visitor::ObjectIsSmi(Type* type, Typer* t) { |
| 519 if (type->Is(Type::TaggedSigned())) return t->singleton_true_; | 519 if (!type->Maybe(Type::SignedSmall())) return t->singleton_false_; |
| 520 if (type->Is(Type::TaggedPointer())) return t->singleton_false_; | |
| 521 return Type::Boolean(); | 520 return Type::Boolean(); |
| 522 } | 521 } |
| 523 | 522 |
| 524 Type* Typer::Visitor::ObjectIsString(Type* type, Typer* t) { | 523 Type* Typer::Visitor::ObjectIsString(Type* type, Typer* t) { |
| 525 if (type->Is(Type::String())) return t->singleton_true_; | 524 if (type->Is(Type::String())) return t->singleton_true_; |
| 526 if (!type->Maybe(Type::String())) return t->singleton_false_; | 525 if (!type->Maybe(Type::String())) return t->singleton_false_; |
| 527 return Type::Boolean(); | 526 return Type::Boolean(); |
| 528 } | 527 } |
| 529 | 528 |
| 530 Type* Typer::Visitor::ObjectIsUndetectable(Type* type, Typer* t) { | 529 Type* Typer::Visitor::ObjectIsUndetectable(Type* type, Typer* t) { |
| (...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1586 Type* arg = Operand(node, 0); | 1585 Type* arg = Operand(node, 0); |
| 1587 return Type::Intersect(arg, Type::String(), zone()); | 1586 return Type::Intersect(arg, Type::String(), zone()); |
| 1588 } | 1587 } |
| 1589 | 1588 |
| 1590 Type* Typer::Visitor::TypeCheckIf(Node* node) { | 1589 Type* Typer::Visitor::TypeCheckIf(Node* node) { |
| 1591 UNREACHABLE(); | 1590 UNREACHABLE(); |
| 1592 return nullptr; | 1591 return nullptr; |
| 1593 } | 1592 } |
| 1594 | 1593 |
| 1595 Type* Typer::Visitor::TypeCheckTaggedPointer(Node* node) { | 1594 Type* Typer::Visitor::TypeCheckTaggedPointer(Node* node) { |
| 1596 Type* arg = Operand(node, 0); | 1595 Type* type = Operand(node, 0); |
| 1597 return Type::Intersect(arg, Type::TaggedPointer(), zone()); | 1596 return type; |
| 1598 } | 1597 } |
| 1599 | 1598 |
| 1600 Type* Typer::Visitor::TypeCheckTaggedSigned(Node* node) { | 1599 Type* Typer::Visitor::TypeCheckTaggedSigned(Node* node) { |
| 1601 Type* arg = Operand(node, 0); | 1600 Type* arg = Operand(node, 0); |
| 1602 return Type::Intersect(arg, typer_->cache_.kSmi, zone()); | 1601 return Type::Intersect(arg, typer_->cache_.kSmi, zone()); |
| 1603 } | 1602 } |
| 1604 | 1603 |
| 1605 Type* Typer::Visitor::TypeCheckFloat64Hole(Node* node) { | 1604 Type* Typer::Visitor::TypeCheckFloat64Hole(Node* node) { |
| 1606 Type* type = Operand(node, 0); | 1605 Type* type = Operand(node, 0); |
| 1607 return type; | 1606 return type; |
| 1608 } | 1607 } |
| 1609 | 1608 |
| 1610 Type* Typer::Visitor::TypeCheckTaggedHole(Node* node) { | 1609 Type* Typer::Visitor::TypeCheckTaggedHole(Node* node) { |
| 1611 Type* type = Operand(node, 0); | 1610 Type* type = Operand(node, 0); |
| 1612 type = Type::Intersect(type, Type::NonInternal(), zone()); | 1611 type = Type::Intersect(type, Type::NonInternal(), zone()); |
| 1613 return type; | 1612 return type; |
| 1614 } | 1613 } |
| 1615 | 1614 |
| 1616 Type* Typer::Visitor::TypeConvertTaggedHoleToUndefined(Node* node) { | 1615 Type* Typer::Visitor::TypeConvertTaggedHoleToUndefined(Node* node) { |
| 1617 Type* type = Operand(node, 0); | 1616 Type* type = Operand(node, 0); |
| 1618 if (type->Maybe(Type::Hole())) { | 1617 if (type->Maybe(Type::Hole())) { |
| 1619 // Turn "the hole" into undefined. | 1618 // Turn "the hole" into undefined. |
| 1620 type = Type::Intersect(type, Type::NonInternal(), zone()); | 1619 type = Type::Intersect(type, Type::NonInternal(), zone()); |
| 1621 type = Type::Union(type, Type::Undefined(), zone()); | 1620 type = Type::Union(type, Type::Undefined(), zone()); |
| 1622 } | 1621 } |
| 1623 return type; | 1622 return type; |
| 1624 } | 1623 } |
| 1625 | 1624 |
| 1626 Type* Typer::Visitor::TypeAllocate(Node* node) { return Type::TaggedPointer(); } | 1625 Type* Typer::Visitor::TypeAllocate(Node* node) { return Type::Any(); } |
| 1627 | 1626 |
| 1628 Type* Typer::Visitor::TypeLoadField(Node* node) { | 1627 Type* Typer::Visitor::TypeLoadField(Node* node) { |
| 1629 return FieldAccessOf(node->op()).type; | 1628 return FieldAccessOf(node->op()).type; |
| 1630 } | 1629 } |
| 1631 | 1630 |
| 1632 Type* Typer::Visitor::TypeLoadBuffer(Node* node) { | 1631 Type* Typer::Visitor::TypeLoadBuffer(Node* node) { |
| 1633 // TODO(bmeurer): This typing is not yet correct. Since we can still access | 1632 // TODO(bmeurer): This typing is not yet correct. Since we can still access |
| 1634 // out of bounds, the type in the general case has to include Undefined. | 1633 // out of bounds, the type in the general case has to include Undefined. |
| 1635 switch (BufferAccessOf(node->op()).external_array_type()) { | 1634 switch (BufferAccessOf(node->op()).external_array_type()) { |
| 1636 #define TYPED_ARRAY_CASE(ElemType, type, TYPE, ctype, size) \ | 1635 #define TYPED_ARRAY_CASE(ElemType, type, TYPE, ctype, size) \ |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1717 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { | 1716 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { |
| 1718 if (Type::IsInteger(*value)) { | 1717 if (Type::IsInteger(*value)) { |
| 1719 return Type::Range(value->Number(), value->Number(), zone()); | 1718 return Type::Range(value->Number(), value->Number(), zone()); |
| 1720 } | 1719 } |
| 1721 return Type::Constant(value, zone()); | 1720 return Type::Constant(value, zone()); |
| 1722 } | 1721 } |
| 1723 | 1722 |
| 1724 } // namespace compiler | 1723 } // namespace compiler |
| 1725 } // namespace internal | 1724 } // namespace internal |
| 1726 } // namespace v8 | 1725 } // namespace v8 |
| OLD | NEW |