| 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 "src/base/flags.h" |     7 #include "src/base/flags.h" | 
|     8 #include "src/bootstrapper.h" |     8 #include "src/bootstrapper.h" | 
|     9 #include "src/compilation-dependencies.h" |     9 #include "src/compilation-dependencies.h" | 
|    10 #include "src/compiler/common-operator.h" |    10 #include "src/compiler/common-operator.h" | 
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   265  |   265  | 
|   266 #define DECLARE_METHOD(x) static Type* x##Typer(Type*, Type*, Typer*); |   266 #define DECLARE_METHOD(x) static Type* x##Typer(Type*, Type*, Typer*); | 
|   267   JS_SIMPLE_BINOP_LIST(DECLARE_METHOD) |   267   JS_SIMPLE_BINOP_LIST(DECLARE_METHOD) | 
|   268 #undef DECLARE_METHOD |   268 #undef DECLARE_METHOD | 
|   269  |   269  | 
|   270   static Type* JSTypeOfTyper(Type*, Typer*); |   270   static Type* JSTypeOfTyper(Type*, Typer*); | 
|   271   static Type* JSLoadPropertyTyper(Type*, Type*, Typer*); |   271   static Type* JSLoadPropertyTyper(Type*, Type*, Typer*); | 
|   272   static Type* JSCallFunctionTyper(Type*, Typer*); |   272   static Type* JSCallFunctionTyper(Type*, Typer*); | 
|   273  |   273  | 
|   274   static Type* ReferenceEqualTyper(Type*, Type*, Typer*); |   274   static Type* ReferenceEqualTyper(Type*, Type*, Typer*); | 
 |   275   static Type* StringFromCharCodeTyper(Type*, Typer*); | 
|   275  |   276  | 
|   276   Reduction UpdateType(Node* node, Type* current) { |   277   Reduction UpdateType(Node* node, Type* current) { | 
|   277     if (NodeProperties::IsTyped(node)) { |   278     if (NodeProperties::IsTyped(node)) { | 
|   278       // Widen the type of a previously typed node. |   279       // Widen the type of a previously typed node. | 
|   279       Type* previous = NodeProperties::GetType(node); |   280       Type* previous = NodeProperties::GetType(node); | 
|   280       if (node->opcode() == IrOpcode::kPhi) { |   281       if (node->opcode() == IrOpcode::kPhi) { | 
|   281         // Speed up termination in the presence of range types: |   282         // Speed up termination in the presence of range types: | 
|   282         current = Weaken(node, current, previous); |   283         current = Weaken(node, current, previous); | 
|   283       } |   284       } | 
|   284  |   285  | 
| (...skipping 1522 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1807 } |  1808 } | 
|  1808  |  1809  | 
|  1809 Type* Typer::Visitor::TypeStringEqual(Node* node) { return Type::Boolean(); } |  1810 Type* Typer::Visitor::TypeStringEqual(Node* node) { return Type::Boolean(); } | 
|  1810  |  1811  | 
|  1811 Type* Typer::Visitor::TypeStringLessThan(Node* node) { return Type::Boolean(); } |  1812 Type* Typer::Visitor::TypeStringLessThan(Node* node) { return Type::Boolean(); } | 
|  1812  |  1813  | 
|  1813 Type* Typer::Visitor::TypeStringLessThanOrEqual(Node* node) { |  1814 Type* Typer::Visitor::TypeStringLessThanOrEqual(Node* node) { | 
|  1814   return Type::Boolean(); |  1815   return Type::Boolean(); | 
|  1815 } |  1816 } | 
|  1816  |  1817  | 
 |  1818 Type* Typer::Visitor::StringFromCharCodeTyper(Type* type, Typer* t) { | 
 |  1819   type = NumberToUint32(ToNumber(type, t), t); | 
 |  1820   Factory* f = t->isolate()->factory(); | 
 |  1821   double min = type->Min(); | 
 |  1822   double max = type->Max(); | 
 |  1823   if (min == max) { | 
 |  1824     uint32_t code = static_cast<uint32_t>(min) & String::kMaxUtf16CodeUnitU; | 
 |  1825     Handle<String> string = f->LookupSingleCharacterStringFromCode(code); | 
 |  1826     return Type::Constant(string, t->zone()); | 
 |  1827   } | 
 |  1828   return Type::String(); | 
 |  1829 } | 
 |  1830  | 
 |  1831 Type* Typer::Visitor::TypeStringFromCharCode(Node* node) { | 
 |  1832   return TypeUnaryOp(node, StringFromCharCodeTyper); | 
 |  1833 } | 
 |  1834  | 
|  1817 Type* Typer::Visitor::TypeStringToNumber(Node* node) { |  1835 Type* Typer::Visitor::TypeStringToNumber(Node* node) { | 
|  1818   return TypeUnaryOp(node, ToNumber); |  1836   return TypeUnaryOp(node, ToNumber); | 
|  1819 } |  1837 } | 
|  1820  |  1838  | 
|  1821 namespace { |  1839 namespace { | 
|  1822  |  1840  | 
|  1823 Type* ChangeRepresentation(Type* type, Type* rep, Zone* zone) { |  1841 Type* ChangeRepresentation(Type* type, Type* rep, Zone* zone) { | 
|  1824   return Type::Union(Type::Semantic(type, zone), |  1842   return Type::Union(Type::Semantic(type, zone), | 
|  1825                      Type::Representation(rep, zone), zone); |  1843                      Type::Representation(rep, zone), zone); | 
|  1826 } |  1844 } | 
| (...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2598   } |  2616   } | 
|  2599   if (Type::IsInteger(*value)) { |  2617   if (Type::IsInteger(*value)) { | 
|  2600     return Type::Range(value->Number(), value->Number(), zone()); |  2618     return Type::Range(value->Number(), value->Number(), zone()); | 
|  2601   } |  2619   } | 
|  2602   return Type::Constant(value, zone()); |  2620   return Type::Constant(value, zone()); | 
|  2603 } |  2621 } | 
|  2604  |  2622  | 
|  2605 }  // namespace compiler |  2623 }  // namespace compiler | 
|  2606 }  // namespace internal |  2624 }  // namespace internal | 
|  2607 }  // namespace v8 |  2625 }  // namespace v8 | 
| OLD | NEW |