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/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 #include "src/compiler/graph-inl.h" | 6 #include "src/compiler/graph-inl.h" |
7 #include "src/compiler/graph-reducer.h" | 7 #include "src/compiler/graph-reducer.h" |
8 #include "src/compiler/js-operator.h" | 8 #include "src/compiler/js-operator.h" |
9 #include "src/compiler/node.h" | 9 #include "src/compiler/node.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 | 155 |
156 Type* number = Type::Number(); | 156 Type* number = Type::Number(); |
157 Type* signed32 = Type::Signed32(); | 157 Type* signed32 = Type::Signed32(); |
158 Type* unsigned32 = Type::Unsigned32(); | 158 Type* unsigned32 = Type::Unsigned32(); |
159 Type* nan_or_minuszero = Type::Union(Type::NaN(), Type::MinusZero(), zone); | 159 Type* nan_or_minuszero = Type::Union(Type::NaN(), Type::MinusZero(), zone); |
160 Type* truncating_to_zero = | 160 Type* truncating_to_zero = |
161 Type::Union(Type::Union(Type::Constant(infinity, zone), | 161 Type::Union(Type::Union(Type::Constant(infinity, zone), |
162 Type::Constant(minusinfinity, zone), zone), | 162 Type::Constant(minusinfinity, zone), zone), |
163 nan_or_minuszero, zone); | 163 nan_or_minuszero, zone); |
164 | 164 |
| 165 boolean_or_number = Type::Union(Type::Boolean(), Type::Number(), zone); |
| 166 undefined_or_null = Type::Union(Type::Undefined(), Type::Null(), zone); |
| 167 undefined_or_number = Type::Union(Type::Undefined(), Type::Number(), zone); |
165 negative_signed32 = Type::Union( | 168 negative_signed32 = Type::Union( |
166 Type::SignedSmall(), Type::OtherSigned32(), zone); | 169 Type::SignedSmall(), Type::OtherSigned32(), zone); |
167 non_negative_signed32 = Type::Union( | 170 non_negative_signed32 = Type::Union( |
168 Type::UnsignedSmall(), Type::OtherUnsigned31(), zone); | 171 Type::UnsignedSmall(), Type::OtherUnsigned31(), zone); |
169 undefined_or_null = Type::Union(Type::Undefined(), Type::Null(), zone); | |
170 singleton_false = Type::Constant(f->false_value(), zone); | 172 singleton_false = Type::Constant(f->false_value(), zone); |
171 singleton_true = Type::Constant(f->true_value(), zone); | 173 singleton_true = Type::Constant(f->true_value(), zone); |
172 singleton_zero = Type::Range(zero, zero, zone); | 174 singleton_zero = Type::Range(zero, zero, zone); |
173 singleton_one = Type::Range(one, one, zone); | 175 singleton_one = Type::Range(one, one, zone); |
174 zero_or_one = Type::Union(singleton_zero, singleton_one, zone); | 176 zero_or_one = Type::Union(singleton_zero, singleton_one, zone); |
175 zeroish = Type::Union(singleton_zero, nan_or_minuszero, zone); | 177 zeroish = Type::Union(singleton_zero, nan_or_minuszero, zone); |
176 signed32ish = Type::Union(signed32, truncating_to_zero, zone); | 178 signed32ish = Type::Union(signed32, truncating_to_zero, zone); |
177 unsigned32ish = Type::Union(unsigned32, truncating_to_zero, zone); | 179 unsigned32ish = Type::Union(unsigned32, truncating_to_zero, zone); |
178 falsish = Type::Union(Type::Undetectable(), | 180 falsish = Type::Union(Type::Undetectable(), |
179 Type::Union(zeroish, undefined_or_null, zone), zone); | 181 Type::Union(zeroish, undefined_or_null, zone), zone); |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 if (type->Is(Type::DetectableReceiver())) return t->singleton_true; | 515 if (type->Is(Type::DetectableReceiver())) return t->singleton_true; |
514 if (type->Is(Type::OrderedNumber()) && (type->Max() < 0 || 0 < type->Min())) { | 516 if (type->Is(Type::OrderedNumber()) && (type->Max() < 0 || 0 < type->Min())) { |
515 return t->singleton_true; // Ruled out nan, -0 and +0. | 517 return t->singleton_true; // Ruled out nan, -0 and +0. |
516 } | 518 } |
517 return Type::Boolean(); | 519 return Type::Boolean(); |
518 } | 520 } |
519 | 521 |
520 | 522 |
521 Type* Typer::Visitor::ToNumber(Type* type, Typer* t) { | 523 Type* Typer::Visitor::ToNumber(Type* type, Typer* t) { |
522 if (type->Is(Type::Number())) return type; | 524 if (type->Is(Type::Number())) return type; |
| 525 if (type->Is(Type::Null())) return t->singleton_zero; |
523 if (type->Is(Type::Undefined())) return Type::NaN(); | 526 if (type->Is(Type::Undefined())) return Type::NaN(); |
| 527 if (type->Is(t->undefined_or_null)) { |
| 528 return Type::Union(Type::NaN(), t->singleton_zero, t->zone()); |
| 529 } |
| 530 if (type->Is(t->undefined_or_number)) { |
| 531 return Type::Union(Type::Intersect(type, Type::Number(), t->zone()), |
| 532 Type::NaN(), t->zone()); |
| 533 } |
524 if (type->Is(t->singleton_false)) return t->singleton_zero; | 534 if (type->Is(t->singleton_false)) return t->singleton_zero; |
525 if (type->Is(t->singleton_true)) return t->singleton_one; | 535 if (type->Is(t->singleton_true)) return t->singleton_one; |
526 if (type->Is(Type::Boolean())) return t->zero_or_one; | 536 if (type->Is(Type::Boolean())) return t->zero_or_one; |
| 537 if (type->Is(t->boolean_or_number)) { |
| 538 return Type::Union(Type::Intersect(type, Type::Number(), t->zone()), |
| 539 t->zero_or_one, t->zone()); |
| 540 } |
527 return Type::Number(); | 541 return Type::Number(); |
528 } | 542 } |
529 | 543 |
530 | 544 |
531 Type* Typer::Visitor::ToString(Type* type, Typer* t) { | 545 Type* Typer::Visitor::ToString(Type* type, Typer* t) { |
532 if (type->Is(Type::String())) return type; | 546 if (type->Is(Type::String())) return type; |
533 return Type::String(); | 547 return Type::String(); |
534 } | 548 } |
535 | 549 |
536 | 550 |
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 | 1179 |
1166 // JS conversion operators. | 1180 // JS conversion operators. |
1167 | 1181 |
1168 | 1182 |
1169 Bounds Typer::Visitor::TypeJSToBoolean(Node* node) { | 1183 Bounds Typer::Visitor::TypeJSToBoolean(Node* node) { |
1170 return Bounds(Type::None(zone()), Type::Boolean(zone())); | 1184 return Bounds(Type::None(zone()), Type::Boolean(zone())); |
1171 } | 1185 } |
1172 | 1186 |
1173 | 1187 |
1174 Bounds Typer::Visitor::TypeJSToNumber(Node* node) { | 1188 Bounds Typer::Visitor::TypeJSToNumber(Node* node) { |
1175 return Bounds(Type::None(zone()), Type::Number(zone())); | 1189 return TypeUnaryOp(node, ToNumber); |
1176 } | 1190 } |
1177 | 1191 |
1178 | 1192 |
1179 Bounds Typer::Visitor::TypeJSToString(Node* node) { | 1193 Bounds Typer::Visitor::TypeJSToString(Node* node) { |
1180 return TypeUnaryOp(node, ToString); | 1194 return TypeUnaryOp(node, ToString); |
1181 } | 1195 } |
1182 | 1196 |
1183 | 1197 |
1184 Bounds Typer::Visitor::TypeJSToName(Node* node) { | 1198 Bounds Typer::Visitor::TypeJSToName(Node* node) { |
1185 return Bounds(Type::None(), Type::Name()); | 1199 return Bounds(Type::None(), Type::Name()); |
(...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2074 return typer_->cache_->Get(kFloat64ArrayFunc); | 2088 return typer_->cache_->Get(kFloat64ArrayFunc); |
2075 } | 2089 } |
2076 } | 2090 } |
2077 } | 2091 } |
2078 return Type::Constant(value, zone()); | 2092 return Type::Constant(value, zone()); |
2079 } | 2093 } |
2080 | 2094 |
2081 } // namespace compiler | 2095 } // namespace compiler |
2082 } // namespace internal | 2096 } // namespace internal |
2083 } // namespace v8 | 2097 } // namespace v8 |
OLD | NEW |