| 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 Type::MinusZeroOrNaN(), zone); | 50 Type::MinusZeroOrNaN(), zone); |
| 51 DCHECK(!truncating_to_zero->Maybe(Type::Integral32())); | 51 DCHECK(!truncating_to_zero->Maybe(Type::Integral32())); |
| 52 | 52 |
| 53 singleton_false_ = Type::Constant(factory->false_value(), zone); | 53 singleton_false_ = Type::Constant(factory->false_value(), zone); |
| 54 singleton_true_ = Type::Constant(factory->true_value(), zone); | 54 singleton_true_ = Type::Constant(factory->true_value(), zone); |
| 55 singleton_the_hole_ = Type::Constant(factory->the_hole_value(), zone); | 55 singleton_the_hole_ = Type::Constant(factory->the_hole_value(), zone); |
| 56 signed32ish_ = Type::Union(Type::Signed32(), truncating_to_zero, zone); | 56 signed32ish_ = Type::Union(Type::Signed32(), truncating_to_zero, zone); |
| 57 unsigned32ish_ = Type::Union(Type::Unsigned32(), truncating_to_zero, zone); | 57 unsigned32ish_ = Type::Union(Type::Unsigned32(), truncating_to_zero, zone); |
| 58 falsish_ = Type::Union( | 58 falsish_ = Type::Union( |
| 59 Type::Undetectable(), | 59 Type::Undetectable(), |
| 60 Type::Union(Type::Union(singleton_false_, cache_.kZeroish, zone), | 60 Type::Union( |
| 61 singleton_the_hole_, zone), | 61 Type::Union(Type::Union(singleton_false_, cache_.kZeroish, zone), |
| 62 Type::NullOrUndefined(), zone), |
| 63 singleton_the_hole_, zone), |
| 62 zone); | 64 zone); |
| 63 truish_ = Type::Union( | 65 truish_ = Type::Union( |
| 64 singleton_true_, | 66 singleton_true_, |
| 65 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone), zone); | 67 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone), zone); |
| 66 | 68 |
| 67 decorator_ = new (zone) Decorator(this); | 69 decorator_ = new (zone) Decorator(this); |
| 68 graph_->AddDecorator(decorator_); | 70 graph_->AddDecorator(decorator_); |
| 69 } | 71 } |
| 70 | 72 |
| 71 | 73 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 static Type* ToName(Type*, Typer*); | 237 static Type* ToName(Type*, Typer*); |
| 236 static Type* ToNumber(Type*, Typer*); | 238 static Type* ToNumber(Type*, Typer*); |
| 237 static Type* ToObject(Type*, Typer*); | 239 static Type* ToObject(Type*, Typer*); |
| 238 static Type* ToString(Type*, Typer*); | 240 static Type* ToString(Type*, Typer*); |
| 239 static Type* NumberToInt32(Type*, Typer*); | 241 static Type* NumberToInt32(Type*, Typer*); |
| 240 static Type* NumberToUint32(Type*, Typer*); | 242 static Type* NumberToUint32(Type*, Typer*); |
| 241 | 243 |
| 242 static Type* ObjectIsNumber(Type*, Typer*); | 244 static Type* ObjectIsNumber(Type*, Typer*); |
| 243 static Type* ObjectIsReceiver(Type*, Typer*); | 245 static Type* ObjectIsReceiver(Type*, Typer*); |
| 244 static Type* ObjectIsSmi(Type*, Typer*); | 246 static Type* ObjectIsSmi(Type*, Typer*); |
| 245 static Type* ObjectIsUndetectable(Type*, Typer*); | |
| 246 | 247 |
| 247 static Type* JSAddRanger(RangeType*, RangeType*, Typer*); | 248 static Type* JSAddRanger(RangeType*, RangeType*, Typer*); |
| 248 static Type* JSSubtractRanger(RangeType*, RangeType*, Typer*); | 249 static Type* JSSubtractRanger(RangeType*, RangeType*, Typer*); |
| 249 static Type* JSDivideRanger(RangeType*, RangeType*, Typer*); | 250 static Type* JSDivideRanger(RangeType*, RangeType*, Typer*); |
| 250 static Type* JSModulusRanger(RangeType*, RangeType*, Typer*); | 251 static Type* JSModulusRanger(RangeType*, RangeType*, Typer*); |
| 251 | 252 |
| 252 static ComparisonOutcome JSCompareTyper(Type*, Type*, Typer*); | 253 static ComparisonOutcome JSCompareTyper(Type*, Type*, Typer*); |
| 253 | 254 |
| 254 #define DECLARE_METHOD(x) static Type* x##Typer(Type*, Type*, Typer*); | 255 #define DECLARE_METHOD(x) static Type* x##Typer(Type*, Type*, Typer*); |
| 255 JS_SIMPLE_BINOP_LIST(DECLARE_METHOD) | 256 JS_SIMPLE_BINOP_LIST(DECLARE_METHOD) |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 } | 462 } |
| 462 return Type::Number(); | 463 return Type::Number(); |
| 463 } | 464 } |
| 464 | 465 |
| 465 | 466 |
| 466 // static | 467 // static |
| 467 Type* Typer::Visitor::ToObject(Type* type, Typer* t) { | 468 Type* Typer::Visitor::ToObject(Type* type, Typer* t) { |
| 468 // ES6 section 7.1.13 ToObject ( argument ) | 469 // ES6 section 7.1.13 ToObject ( argument ) |
| 469 if (type->Is(Type::Receiver())) return type; | 470 if (type->Is(Type::Receiver())) return type; |
| 470 if (type->Is(Type::Primitive())) return Type::OtherObject(); | 471 if (type->Is(Type::Primitive())) return Type::OtherObject(); |
| 471 if (!type->Maybe(Type::OtherUndetectable())) { | 472 if (!type->Maybe(Type::Undetectable())) return Type::DetectableReceiver(); |
| 472 return Type::DetectableReceiver(); | |
| 473 } | |
| 474 return Type::Receiver(); | 473 return Type::Receiver(); |
| 475 } | 474 } |
| 476 | 475 |
| 477 | 476 |
| 478 // static | 477 // static |
| 479 Type* Typer::Visitor::ToString(Type* type, Typer* t) { | 478 Type* Typer::Visitor::ToString(Type* type, Typer* t) { |
| 480 // ES6 section 7.1.12 ToString ( argument ) | 479 // ES6 section 7.1.12 ToString ( argument ) |
| 481 type = ToPrimitive(type, t); | 480 type = ToPrimitive(type, t); |
| 482 if (type->Is(Type::String())) return type; | 481 if (type->Is(Type::String())) return type; |
| 483 return Type::String(); | 482 return Type::String(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 return Type::Boolean(); | 525 return Type::Boolean(); |
| 527 } | 526 } |
| 528 | 527 |
| 529 | 528 |
| 530 Type* Typer::Visitor::ObjectIsSmi(Type* type, Typer* t) { | 529 Type* Typer::Visitor::ObjectIsSmi(Type* type, Typer* t) { |
| 531 if (type->Is(Type::TaggedSigned())) return t->singleton_true_; | 530 if (type->Is(Type::TaggedSigned())) return t->singleton_true_; |
| 532 if (type->Is(Type::TaggedPointer())) return t->singleton_false_; | 531 if (type->Is(Type::TaggedPointer())) return t->singleton_false_; |
| 533 return Type::Boolean(); | 532 return Type::Boolean(); |
| 534 } | 533 } |
| 535 | 534 |
| 536 | |
| 537 Type* Typer::Visitor::ObjectIsUndetectable(Type* type, Typer* t) { | |
| 538 if (type->Is(Type::Undetectable())) return t->singleton_true_; | |
| 539 if (!type->Maybe(Type::Undetectable())) return t->singleton_false_; | |
| 540 return Type::Boolean(); | |
| 541 } | |
| 542 | |
| 543 | 535 |
| 544 // ----------------------------------------------------------------------------- | 536 // ----------------------------------------------------------------------------- |
| 545 | 537 |
| 546 | 538 |
| 547 // Control operators. | 539 // Control operators. |
| 548 | 540 |
| 549 Type* Typer::Visitor::TypeStart(Node* node) { return Type::Internal(); } | 541 Type* Typer::Visitor::TypeStart(Node* node) { return Type::Internal(); } |
| 550 | 542 |
| 551 Type* Typer::Visitor::TypeIfException(Node* node) { return Type::Any(); } | 543 Type* Typer::Visitor::TypeIfException(Node* node) { return Type::Any(); } |
| 552 | 544 |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1172 Type* Typer::Visitor::JSTypeOfTyper(Type* type, Typer* t) { | 1164 Type* Typer::Visitor::JSTypeOfTyper(Type* type, Typer* t) { |
| 1173 Factory* const f = t->isolate()->factory(); | 1165 Factory* const f = t->isolate()->factory(); |
| 1174 if (type->Is(Type::Boolean())) { | 1166 if (type->Is(Type::Boolean())) { |
| 1175 return Type::Constant(f->boolean_string(), t->zone()); | 1167 return Type::Constant(f->boolean_string(), t->zone()); |
| 1176 } else if (type->Is(Type::Number())) { | 1168 } else if (type->Is(Type::Number())) { |
| 1177 return Type::Constant(f->number_string(), t->zone()); | 1169 return Type::Constant(f->number_string(), t->zone()); |
| 1178 } else if (type->Is(Type::String())) { | 1170 } else if (type->Is(Type::String())) { |
| 1179 return Type::Constant(f->string_string(), t->zone()); | 1171 return Type::Constant(f->string_string(), t->zone()); |
| 1180 } else if (type->Is(Type::Symbol())) { | 1172 } else if (type->Is(Type::Symbol())) { |
| 1181 return Type::Constant(f->symbol_string(), t->zone()); | 1173 return Type::Constant(f->symbol_string(), t->zone()); |
| 1182 } else if (type->Is(Type::Union(Type::Undefined(), Type::OtherUndetectable(), | 1174 } else if (type->Is(Type::Union(Type::Undefined(), Type::Undetectable(), |
| 1183 t->zone()))) { | 1175 t->zone()))) { |
| 1184 return Type::Constant(f->undefined_string(), t->zone()); | 1176 return Type::Constant(f->undefined_string(), t->zone()); |
| 1185 } else if (type->Is(Type::Null())) { | 1177 } else if (type->Is(Type::Null())) { |
| 1186 return Type::Constant(f->object_string(), t->zone()); | 1178 return Type::Constant(f->object_string(), t->zone()); |
| 1187 } else if (type->Is(Type::Function())) { | 1179 } else if (type->Is(Type::Function())) { |
| 1188 return Type::Constant(f->function_string(), t->zone()); | 1180 return Type::Constant(f->function_string(), t->zone()); |
| 1189 } else if (type->IsConstant()) { | 1181 } else if (type->IsConstant()) { |
| 1190 return Type::Constant( | 1182 return Type::Constant( |
| 1191 Object::TypeOf(t->isolate(), type->AsConstant()->Value()), t->zone()); | 1183 Object::TypeOf(t->isolate(), type->AsConstant()->Value()), t->zone()); |
| 1192 } | 1184 } |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1926 Type* Typer::Visitor::TypeObjectIsReceiver(Node* node) { | 1918 Type* Typer::Visitor::TypeObjectIsReceiver(Node* node) { |
| 1927 return TypeUnaryOp(node, ObjectIsReceiver); | 1919 return TypeUnaryOp(node, ObjectIsReceiver); |
| 1928 } | 1920 } |
| 1929 | 1921 |
| 1930 | 1922 |
| 1931 Type* Typer::Visitor::TypeObjectIsSmi(Node* node) { | 1923 Type* Typer::Visitor::TypeObjectIsSmi(Node* node) { |
| 1932 return TypeUnaryOp(node, ObjectIsSmi); | 1924 return TypeUnaryOp(node, ObjectIsSmi); |
| 1933 } | 1925 } |
| 1934 | 1926 |
| 1935 | 1927 |
| 1936 Type* Typer::Visitor::TypeObjectIsUndetectable(Node* node) { | |
| 1937 return TypeUnaryOp(node, ObjectIsUndetectable); | |
| 1938 } | |
| 1939 | |
| 1940 | |
| 1941 // Machine operators. | 1928 // Machine operators. |
| 1942 | 1929 |
| 1943 Type* Typer::Visitor::TypeLoad(Node* node) { return Type::Any(); } | 1930 Type* Typer::Visitor::TypeLoad(Node* node) { return Type::Any(); } |
| 1944 | 1931 |
| 1945 Type* Typer::Visitor::TypeStackSlot(Node* node) { return Type::Any(); } | 1932 Type* Typer::Visitor::TypeStackSlot(Node* node) { return Type::Any(); } |
| 1946 | 1933 |
| 1947 Type* Typer::Visitor::TypeStore(Node* node) { | 1934 Type* Typer::Visitor::TypeStore(Node* node) { |
| 1948 UNREACHABLE(); | 1935 UNREACHABLE(); |
| 1949 return nullptr; | 1936 return nullptr; |
| 1950 } | 1937 } |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2456 } | 2443 } |
| 2457 if (Type::IsInteger(*value)) { | 2444 if (Type::IsInteger(*value)) { |
| 2458 return Type::Range(value->Number(), value->Number(), zone()); | 2445 return Type::Range(value->Number(), value->Number(), zone()); |
| 2459 } | 2446 } |
| 2460 return Type::Constant(value, zone()); | 2447 return Type::Constant(value, zone()); |
| 2461 } | 2448 } |
| 2462 | 2449 |
| 2463 } // namespace compiler | 2450 } // namespace compiler |
| 2464 } // namespace internal | 2451 } // namespace internal |
| 2465 } // namespace v8 | 2452 } // namespace v8 |
| OLD | NEW |