OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "src/compiler/types.h" | 7 #include "src/compiler/types.h" |
8 #include "src/crankshaft/hydrogen-types.h" | 8 #include "src/crankshaft/hydrogen-types.h" |
9 #include "src/factory.h" | 9 #include "src/factory.h" |
10 #include "src/heap/heap.h" | 10 #include "src/heap/heap.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 CHECK(!type2->Is(type1)); | 107 CHECK(!type2->Is(type1)); |
108 CHECK(!type1->Maybe(type2)); | 108 CHECK(!type1->Maybe(type2)); |
109 CHECK(!type2->Maybe(type1)); | 109 CHECK(!type2->Maybe(type1)); |
110 } | 110 } |
111 | 111 |
112 void IsSomeType() { | 112 void IsSomeType() { |
113 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 113 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
114 Type* t = *it; | 114 Type* t = *it; |
115 CHECK(1 == | 115 CHECK(1 == |
116 this->IsBitset(t) + t->IsConstant() + t->IsRange() + | 116 this->IsBitset(t) + t->IsConstant() + t->IsRange() + |
117 this->IsUnion(t)); | 117 t->IsOtherNumberConstant() + this->IsUnion(t)); |
118 } | 118 } |
119 } | 119 } |
120 | 120 |
121 void Bitset() { | 121 void Bitset() { |
122 // None and Any are bitsets. | 122 // None and Any are bitsets. |
123 CHECK(this->IsBitset(T.None)); | 123 CHECK(this->IsBitset(T.None)); |
124 CHECK(this->IsBitset(T.Any)); | 124 CHECK(this->IsBitset(T.Any)); |
125 | 125 |
126 CHECK(bitset(0) == this->AsBitset(T.None)); | 126 CHECK(bitset(0) == this->AsBitset(T.None)); |
127 CHECK(bitset(0xfffffffeu) == this->AsBitset(T.Any)); | 127 CHECK(bitset(0xfffffffeu) == this->AsBitset(T.Any)); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 CHECK(bits == this->AsBitset(intersect12)); | 184 CHECK(bits == this->AsBitset(intersect12)); |
185 } | 185 } |
186 } | 186 } |
187 } | 187 } |
188 } | 188 } |
189 | 189 |
190 void Constant() { | 190 void Constant() { |
191 // Constructor | 191 // Constructor |
192 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 192 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
193 Handle<i::Object> value = *vt; | 193 Handle<i::Object> value = *vt; |
194 Type* type = T.Constant(value); | 194 Type* type = T.NewConstant(value); |
195 CHECK(type->IsConstant()); | 195 CHECK(type->IsConstant() || type->IsOtherNumberConstant() || |
| 196 type->IsRange()); |
196 } | 197 } |
197 | 198 |
198 // Value attribute | 199 // Value attribute |
199 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 200 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
200 Handle<i::Object> value = *vt; | 201 Handle<i::Object> value = *vt; |
201 Type* type = T.Constant(value); | 202 Type* type = T.NewConstant(value); |
202 CHECK(*value == *type->AsConstant()->Value()); | 203 if (type->IsConstant()) { |
| 204 CHECK(*value == *type->AsConstant()->Value()); |
| 205 } else if (type->IsOtherNumberConstant()) { |
| 206 CHECK(value->IsHeapNumber()); |
| 207 double v = HeapNumber::cast(*value)->value(); |
| 208 CHECK(v == type->AsOtherNumberConstant()->Value()); |
| 209 } else { |
| 210 CHECK(type->IsRange()); |
| 211 double v = value->IsSmi() ? Smi::cast(*value)->value() |
| 212 : HeapNumber::cast(*value)->value(); |
| 213 CHECK(v == type->AsRange()->Min() && v == type->AsRange()->Max()); |
| 214 } |
203 } | 215 } |
204 | 216 |
205 // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2 | 217 // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2 |
206 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { | 218 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
207 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { | 219 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
208 Handle<i::Object> value1 = *vt1; | 220 Handle<i::Object> value1 = *vt1; |
209 Handle<i::Object> value2 = *vt2; | 221 Handle<i::Object> value2 = *vt2; |
210 Type* type1 = T.Constant(value1); | 222 Type* type1 = T.NewConstant(value1); |
211 Type* type2 = T.Constant(value2); | 223 Type* type2 = T.NewConstant(value2); |
212 CHECK(Equal(type1, type2) == (*value1 == *value2)); | 224 if (type1->IsOtherNumberConstant() && type2->IsOtherNumberConstant()) { |
| 225 CHECK(Equal(type1, type2) == |
| 226 (type1->AsOtherNumberConstant()->Value() == |
| 227 type2->AsOtherNumberConstant()->Value())); |
| 228 } else if (type1->IsRange() && type2->IsRange()) { |
| 229 CHECK(Equal(type1, type2) == |
| 230 ((type1->AsRange()->Min() == type2->AsRange()->Min()) && |
| 231 (type1->AsRange()->Max() == type2->AsRange()->Max()))); |
| 232 } else { |
| 233 CHECK(Equal(type1, type2) == (*value1 == *value2)); |
| 234 } |
213 } | 235 } |
214 } | 236 } |
215 | 237 |
216 // Typing of numbers | 238 // Typing of numbers |
217 Factory* fac = isolate->factory(); | 239 Factory* fac = isolate->factory(); |
218 CHECK(T.Constant(fac->NewNumber(0))->Is(T.UnsignedSmall)); | 240 CHECK(T.NewConstant(fac->NewNumber(0))->Is(T.UnsignedSmall)); |
219 CHECK(T.Constant(fac->NewNumber(1))->Is(T.UnsignedSmall)); | 241 CHECK(T.NewConstant(fac->NewNumber(1))->Is(T.UnsignedSmall)); |
220 CHECK(T.Constant(fac->NewNumber(0x3fffffff))->Is(T.UnsignedSmall)); | 242 CHECK(T.NewConstant(fac->NewNumber(0x3fffffff))->Is(T.UnsignedSmall)); |
221 CHECK(T.Constant(fac->NewNumber(-1))->Is(T.Negative31)); | 243 CHECK(T.NewConstant(fac->NewNumber(-1))->Is(T.Negative31)); |
222 CHECK(T.Constant(fac->NewNumber(-0x3fffffff))->Is(T.Negative31)); | 244 CHECK(T.NewConstant(fac->NewNumber(-0x3fffffff))->Is(T.Negative31)); |
223 CHECK(T.Constant(fac->NewNumber(-0x40000000))->Is(T.Negative31)); | 245 CHECK(T.NewConstant(fac->NewNumber(-0x40000000))->Is(T.Negative31)); |
224 CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.Unsigned31)); | 246 CHECK(T.NewConstant(fac->NewNumber(0x40000000))->Is(T.Unsigned31)); |
225 CHECK(!T.Constant(fac->NewNumber(0x40000000))->Is(T.Unsigned30)); | 247 CHECK(!T.NewConstant(fac->NewNumber(0x40000000))->Is(T.Unsigned30)); |
226 CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.Unsigned31)); | 248 CHECK(T.NewConstant(fac->NewNumber(0x7fffffff))->Is(T.Unsigned31)); |
227 CHECK(!T.Constant(fac->NewNumber(0x7fffffff))->Is(T.Unsigned30)); | 249 CHECK(!T.NewConstant(fac->NewNumber(0x7fffffff))->Is(T.Unsigned30)); |
228 CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.Negative32)); | 250 CHECK(T.NewConstant(fac->NewNumber(-0x40000001))->Is(T.Negative32)); |
229 CHECK(!T.Constant(fac->NewNumber(-0x40000001))->Is(T.Negative31)); | 251 CHECK(!T.NewConstant(fac->NewNumber(-0x40000001))->Is(T.Negative31)); |
230 CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.Negative32)); | 252 CHECK(T.NewConstant(fac->NewNumber(-0x7fffffff))->Is(T.Negative32)); |
231 CHECK(!T.Constant(fac->NewNumber(-0x7fffffff - 1))->Is(T.Negative31)); | 253 CHECK(!T.NewConstant(fac->NewNumber(-0x7fffffff - 1))->Is(T.Negative31)); |
232 if (SmiValuesAre31Bits()) { | 254 if (SmiValuesAre31Bits()) { |
233 CHECK(!T.Constant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall)); | 255 CHECK(!T.NewConstant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall)); |
234 CHECK(!T.Constant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall)); | 256 CHECK(!T.NewConstant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall)); |
235 CHECK(!T.Constant(fac->NewNumber(-0x40000001))->Is(T.SignedSmall)); | 257 CHECK(!T.NewConstant(fac->NewNumber(-0x40000001))->Is(T.SignedSmall)); |
236 CHECK(!T.Constant(fac->NewNumber(-0x7fffffff - 1))->Is(T.SignedSmall)); | 258 CHECK(!T.NewConstant(fac->NewNumber(-0x7fffffff - 1))->Is(T.SignedSmall)); |
237 } else { | 259 } else { |
238 CHECK(SmiValuesAre32Bits()); | 260 CHECK(SmiValuesAre32Bits()); |
239 CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall)); | 261 CHECK(T.NewConstant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall)); |
240 CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall)); | 262 CHECK(T.NewConstant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall)); |
241 CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.SignedSmall)); | 263 CHECK(T.NewConstant(fac->NewNumber(-0x40000001))->Is(T.SignedSmall)); |
242 CHECK(T.Constant(fac->NewNumber(-0x7fffffff - 1))->Is(T.SignedSmall)); | 264 CHECK(T.NewConstant(fac->NewNumber(-0x7fffffff - 1))->Is(T.SignedSmall)); |
243 } | 265 } |
244 CHECK(T.Constant(fac->NewNumber(0x80000000u))->Is(T.Unsigned32)); | 266 CHECK(T.NewConstant(fac->NewNumber(0x80000000u))->Is(T.Unsigned32)); |
245 CHECK(!T.Constant(fac->NewNumber(0x80000000u))->Is(T.Unsigned31)); | 267 CHECK(!T.NewConstant(fac->NewNumber(0x80000000u))->Is(T.Unsigned31)); |
246 CHECK(T.Constant(fac->NewNumber(0xffffffffu))->Is(T.Unsigned32)); | 268 CHECK(T.NewConstant(fac->NewNumber(0xffffffffu))->Is(T.Unsigned32)); |
247 CHECK(!T.Constant(fac->NewNumber(0xffffffffu))->Is(T.Unsigned31)); | 269 CHECK(!T.NewConstant(fac->NewNumber(0xffffffffu))->Is(T.Unsigned31)); |
248 CHECK(T.Constant(fac->NewNumber(0xffffffffu + 1.0))->Is(T.PlainNumber)); | 270 CHECK(T.NewConstant(fac->NewNumber(0xffffffffu + 1.0))->Is(T.PlainNumber)); |
249 CHECK(!T.Constant(fac->NewNumber(0xffffffffu + 1.0))->Is(T.Integral32)); | 271 CHECK(!T.NewConstant(fac->NewNumber(0xffffffffu + 1.0))->Is(T.Integral32)); |
250 CHECK(T.Constant(fac->NewNumber(-0x7fffffff - 2.0))->Is(T.PlainNumber)); | 272 CHECK(T.NewConstant(fac->NewNumber(-0x7fffffff - 2.0))->Is(T.PlainNumber)); |
251 CHECK(!T.Constant(fac->NewNumber(-0x7fffffff - 2.0))->Is(T.Integral32)); | 273 CHECK(!T.NewConstant(fac->NewNumber(-0x7fffffff - 2.0))->Is(T.Integral32)); |
252 CHECK(T.Constant(fac->NewNumber(0.1))->Is(T.PlainNumber)); | 274 CHECK(T.NewConstant(fac->NewNumber(0.1))->Is(T.PlainNumber)); |
253 CHECK(!T.Constant(fac->NewNumber(0.1))->Is(T.Integral32)); | 275 CHECK(!T.NewConstant(fac->NewNumber(0.1))->Is(T.Integral32)); |
254 CHECK(T.Constant(fac->NewNumber(-10.1))->Is(T.PlainNumber)); | 276 CHECK(T.NewConstant(fac->NewNumber(-10.1))->Is(T.PlainNumber)); |
255 CHECK(!T.Constant(fac->NewNumber(-10.1))->Is(T.Integral32)); | 277 CHECK(!T.NewConstant(fac->NewNumber(-10.1))->Is(T.Integral32)); |
256 CHECK(T.Constant(fac->NewNumber(10e60))->Is(T.PlainNumber)); | 278 CHECK(T.NewConstant(fac->NewNumber(10e60))->Is(T.PlainNumber)); |
257 CHECK(!T.Constant(fac->NewNumber(10e60))->Is(T.Integral32)); | 279 CHECK(!T.NewConstant(fac->NewNumber(10e60))->Is(T.Integral32)); |
258 CHECK(T.Constant(fac->NewNumber(-1.0*0.0))->Is(T.MinusZero)); | 280 CHECK(T.NewConstant(fac->NewNumber(-1.0 * 0.0))->Is(T.MinusZero)); |
259 CHECK(T.Constant(fac->NewNumber(std::numeric_limits<double>::quiet_NaN())) | 281 CHECK( |
260 ->Is(T.NaN)); | 282 T.NewConstant(fac->NewNumber(std::numeric_limits<double>::quiet_NaN())) |
261 CHECK(T.Constant(fac->NewNumber(V8_INFINITY))->Is(T.PlainNumber)); | 283 ->Is(T.NaN)); |
262 CHECK(!T.Constant(fac->NewNumber(V8_INFINITY))->Is(T.Integral32)); | 284 CHECK(T.NewConstant(fac->NewNumber(V8_INFINITY))->Is(T.PlainNumber)); |
263 CHECK(T.Constant(fac->NewNumber(-V8_INFINITY))->Is(T.PlainNumber)); | 285 CHECK(!T.NewConstant(fac->NewNumber(V8_INFINITY))->Is(T.Integral32)); |
264 CHECK(!T.Constant(fac->NewNumber(-V8_INFINITY))->Is(T.Integral32)); | 286 CHECK(T.NewConstant(fac->NewNumber(-V8_INFINITY))->Is(T.PlainNumber)); |
| 287 CHECK(!T.NewConstant(fac->NewNumber(-V8_INFINITY))->Is(T.Integral32)); |
265 } | 288 } |
266 | 289 |
267 void Range() { | 290 void Range() { |
268 // Constructor | 291 // Constructor |
269 for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) { | 292 for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) { |
270 for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) { | 293 for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) { |
271 double min = (*i)->Number(); | 294 double min = (*i)->Number(); |
272 double max = (*j)->Number(); | 295 double max = (*j)->Number(); |
273 if (min > max) std::swap(min, max); | 296 if (min > max) std::swap(min, max); |
274 Type* type = T.Range(min, max); | 297 Type* type = T.Range(min, max); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 } | 333 } |
311 } | 334 } |
312 } | 335 } |
313 } | 336 } |
314 } | 337 } |
315 | 338 |
316 void Of() { | 339 void Of() { |
317 // Constant(V)->Is(Of(V)) | 340 // Constant(V)->Is(Of(V)) |
318 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 341 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
319 Handle<i::Object> value = *vt; | 342 Handle<i::Object> value = *vt; |
320 Type* const_type = T.Constant(value); | 343 Type* const_type = T.NewConstant(value); |
321 Type* of_type = T.Of(value); | 344 Type* of_type = T.Of(value); |
322 CHECK(const_type->Is(of_type)); | 345 CHECK(const_type->Is(of_type)); |
323 } | 346 } |
324 | 347 |
325 // If Of(V)->Is(T), then Constant(V)->Is(T) | 348 // If Of(V)->Is(T), then Constant(V)->Is(T) |
326 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 349 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
327 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 350 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
328 Handle<i::Object> value = *vt; | 351 Handle<i::Object> value = *vt; |
329 Type* type = *it; | 352 Type* type = *it; |
330 Type* const_type = T.Constant(value); | 353 Type* const_type = T.NewConstant(value); |
331 Type* of_type = T.Of(value); | 354 Type* of_type = T.Of(value); |
332 CHECK(!of_type->Is(type) || const_type->Is(type)); | 355 CHECK(!of_type->Is(type) || const_type->Is(type)); |
333 } | 356 } |
334 } | 357 } |
335 | 358 |
336 // If Constant(V)->Is(T), then Of(V)->Is(T) or T->Maybe(Constant(V)) | 359 // If Constant(V)->Is(T), then Of(V)->Is(T) or T->Maybe(Constant(V)) |
337 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 360 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
338 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 361 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
339 Handle<i::Object> value = *vt; | 362 Handle<i::Object> value = *vt; |
340 Type* type = *it; | 363 Type* type = *it; |
341 Type* const_type = T.Constant(value); | 364 Type* const_type = T.NewConstant(value); |
342 Type* of_type = T.Of(value); | 365 Type* of_type = T.Of(value); |
343 CHECK(!const_type->Is(type) || | 366 CHECK(!const_type->Is(type) || |
344 of_type->Is(type) || type->Maybe(const_type)); | 367 of_type->Is(type) || type->Maybe(const_type)); |
345 } | 368 } |
346 } | 369 } |
347 } | 370 } |
348 | 371 |
349 void MinMax() { | 372 void MinMax() { |
350 // If b is regular numeric bitset, then Range(b->Min(), b->Max())->Is(b). | 373 // If b is regular numeric bitset, then Range(b->Min(), b->Max())->Is(b). |
351 // TODO(neis): Need to ignore representation for this to be true. | 374 // TODO(neis): Need to ignore representation for this to be true. |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 for (TypeIterator i = T.types.begin(); i != T.types.end(); ++i) { | 541 for (TypeIterator i = T.types.begin(); i != T.types.end(); ++i) { |
519 for (TypeIterator j = T.types.begin(); j != T.types.end(); ++j) { | 542 for (TypeIterator j = T.types.begin(); j != T.types.end(); ++j) { |
520 Type* type1 = *i; | 543 Type* type1 = *i; |
521 Type* type2 = *j; | 544 Type* type2 = *j; |
522 CHECK(!type1->Is(type2) || this->IsBitset(type2) || | 545 CHECK(!type1->Is(type2) || this->IsBitset(type2) || |
523 this->IsUnion(type2) || this->IsUnion(type1) || | 546 this->IsUnion(type2) || this->IsUnion(type1) || |
524 (type1->IsConstant() && type2->IsConstant()) || | 547 (type1->IsConstant() && type2->IsConstant()) || |
525 (type1->IsConstant() && type2->IsRange()) || | 548 (type1->IsConstant() && type2->IsRange()) || |
526 (this->IsBitset(type1) && type2->IsRange()) || | 549 (this->IsBitset(type1) && type2->IsRange()) || |
527 (type1->IsRange() && type2->IsRange()) || | 550 (type1->IsRange() && type2->IsRange()) || |
| 551 (type1->IsOtherNumberConstant() && |
| 552 type2->IsOtherNumberConstant()) || |
528 !type1->IsInhabited()); | 553 !type1->IsInhabited()); |
529 } | 554 } |
530 } | 555 } |
531 } | 556 } |
532 | 557 |
533 void Is2() { | 558 void Is2() { |
534 // Range(X1, Y1)->Is(Range(X2, Y2)) iff X1 >= X2 /\ Y1 <= Y2 | 559 // Range(X1, Y1)->Is(Range(X2, Y2)) iff X1 >= X2 /\ Y1 <= Y2 |
535 for (ValueIterator i1 = T.integers.begin(); | 560 for (ValueIterator i1 = T.integers.begin(); |
536 i1 != T.integers.end(); ++i1) { | 561 i1 != T.integers.end(); ++i1) { |
537 for (ValueIterator j1 = i1; | 562 for (ValueIterator j1 = i1; |
(...skipping 14 matching lines...) Expand all Loading... |
552 } | 577 } |
553 } | 578 } |
554 } | 579 } |
555 } | 580 } |
556 | 581 |
557 // Constant(V1)->Is(Constant(V2)) iff V1 = V2 | 582 // Constant(V1)->Is(Constant(V2)) iff V1 = V2 |
558 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { | 583 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
559 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { | 584 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
560 Handle<i::Object> value1 = *vt1; | 585 Handle<i::Object> value1 = *vt1; |
561 Handle<i::Object> value2 = *vt2; | 586 Handle<i::Object> value2 = *vt2; |
562 Type* const_type1 = T.Constant(value1); | 587 Type* const_type1 = T.NewConstant(value1); |
563 Type* const_type2 = T.Constant(value2); | 588 Type* const_type2 = T.NewConstant(value2); |
564 CHECK(const_type1->Is(const_type2) == (*value1 == *value2)); | 589 if (const_type1->IsOtherNumberConstant() && |
| 590 const_type2->IsOtherNumberConstant()) { |
| 591 CHECK(const_type1->Is(const_type2) == |
| 592 (const_type1->AsOtherNumberConstant()->Value() == |
| 593 const_type2->AsOtherNumberConstant()->Value())); |
| 594 } else if (const_type1->IsRange() && const_type2->IsRange()) { |
| 595 CHECK(Equal(const_type1, const_type2) == |
| 596 ((const_type1->AsRange()->Min() == |
| 597 const_type2->AsRange()->Min()) && |
| 598 (const_type1->AsRange()->Max() == |
| 599 const_type2->AsRange()->Max()))); |
| 600 } else { |
| 601 CHECK(const_type1->Is(const_type2) == (*value1 == *value2)); |
| 602 } |
565 } | 603 } |
566 } | 604 } |
567 | 605 |
568 // Range-specific subtyping | 606 // Range-specific subtyping |
569 | 607 |
570 // If IsInteger(v) then Constant(v)->Is(Range(v, v)). | 608 // If IsInteger(v) then Constant(v)->Is(Range(v, v)). |
571 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 609 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
572 Type* type = *it; | 610 Type* type = *it; |
573 if (type->IsConstant() && IsInteger(*type->AsConstant()->Value())) { | 611 if (type->IsConstant() && IsInteger(*type->AsConstant()->Value())) { |
574 CHECK(type->Is(T.Range(type->AsConstant()->Value()->Number(), | 612 CHECK(type->Is(T.Range(type->AsConstant()->Value()->Number(), |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 CHECK(!(type1->Is(type2) && type1->IsInhabited()) || | 743 CHECK(!(type1->Is(type2) && type1->IsInhabited()) || |
706 type1->Maybe(type2)); | 744 type1->Maybe(type2)); |
707 } | 745 } |
708 } | 746 } |
709 | 747 |
710 // Constant(V1)->Maybe(Constant(V2)) iff V1 = V2 | 748 // Constant(V1)->Maybe(Constant(V2)) iff V1 = V2 |
711 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { | 749 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
712 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { | 750 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
713 Handle<i::Object> value1 = *vt1; | 751 Handle<i::Object> value1 = *vt1; |
714 Handle<i::Object> value2 = *vt2; | 752 Handle<i::Object> value2 = *vt2; |
715 Type* const_type1 = T.Constant(value1); | 753 Type* const_type1 = T.NewConstant(value1); |
716 Type* const_type2 = T.Constant(value2); | 754 Type* const_type2 = T.NewConstant(value2); |
717 CHECK(const_type1->Maybe(const_type2) == (*value1 == *value2)); | 755 if (const_type1->IsOtherNumberConstant() && |
| 756 const_type2->IsOtherNumberConstant()) { |
| 757 CHECK(const_type1->Maybe(const_type2) == |
| 758 (const_type1->AsOtherNumberConstant()->Value() == |
| 759 const_type2->AsOtherNumberConstant()->Value())); |
| 760 } else if (const_type1->IsRange() && const_type2->IsRange()) { |
| 761 CHECK(Equal(const_type1, const_type2) == |
| 762 ((const_type1->AsRange()->Min() == |
| 763 const_type2->AsRange()->Min()) && |
| 764 (const_type1->AsRange()->Max() == |
| 765 const_type2->AsRange()->Max()))); |
| 766 } else { |
| 767 CHECK(const_type1->Maybe(const_type2) == (*value1 == *value2)); |
| 768 } |
718 } | 769 } |
719 } | 770 } |
720 | 771 |
721 // Basic types | 772 // Basic types |
722 CheckDisjoint(T.Boolean, T.Null); | 773 CheckDisjoint(T.Boolean, T.Null); |
723 CheckDisjoint(T.Undefined, T.Null); | 774 CheckDisjoint(T.Undefined, T.Null); |
724 CheckDisjoint(T.Boolean, T.Undefined); | 775 CheckDisjoint(T.Boolean, T.Undefined); |
725 CheckOverlap(T.SignedSmall, T.Number); | 776 CheckOverlap(T.SignedSmall, T.Number); |
726 CheckOverlap(T.NaN, T.Number); | 777 CheckOverlap(T.NaN, T.Number); |
727 CheckDisjoint(T.Signed32, T.NaN); | 778 CheckDisjoint(T.Signed32, T.NaN); |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 | 1152 |
1102 TEST(Union3) { Tests().Union3(); } | 1153 TEST(Union3) { Tests().Union3(); } |
1103 | 1154 |
1104 TEST(Union4) { Tests().Union4(); } | 1155 TEST(Union4) { Tests().Union4(); } |
1105 | 1156 |
1106 TEST(Intersect) { Tests().Intersect(); } | 1157 TEST(Intersect) { Tests().Intersect(); } |
1107 | 1158 |
1108 TEST(Distributivity) { Tests().Distributivity(); } | 1159 TEST(Distributivity) { Tests().Distributivity(); } |
1109 | 1160 |
1110 TEST(GetRange) { Tests().GetRange(); } | 1161 TEST(GetRange) { Tests().GetRange(); } |
OLD | NEW |