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 |