31 using namespace v8::internal;
33 template<
class Type,
class TypeHandle,
class Region>
38 Semantic(
Type::Semantic(region)),
40 Any(
Type::Any(region)),
42 Boolean(
Type::Boolean(region)),
45 Number(
Type::Number(region)),
46 SignedSmall(
Type::SignedSmall(region)),
47 Signed32(
Type::Signed32(region)),
48 Float(
Type::Float(region)),
50 UniqueName(
Type::UniqueName(region)),
52 InternalizedString(
Type::InternalizedString(region)),
54 Receiver(
Type::Receiver(region)),
56 Array(
Type::Array(region)),
57 Function(
Type::Function(region)),
58 Proxy(
Type::Proxy(region)),
119 TypeHandle
Union(TypeHandle t1, TypeHandle t2) {
126 template<
class Type2,
class TypeHandle2>
128 return Type::template Convert<Type2>(t, region_);
131 TypeHandle
Fuzz(
int depth = 5) {
132 switch (rand() % (depth == 0 ? 3 : 20)) {
135 #define COUNT_BITSET_TYPES(type, value) + 1
137 #undef COUNT_BITSET_TYPES
140 #define PICK_BITSET_TYPE(type, value) \
141 if (i-- == 0) return Type::type(region_);
143 #undef PICK_BITSET_TYPE
147 switch (rand() % 2) {
148 case 0:
return ObjectClass;
149 case 1:
return ArrayClass;
153 switch (rand() % 6) {
154 case 0:
return SmiConstant;
155 case 1:
return Signed32Constant;
156 case 2:
return ObjectConstant1;
157 case 3:
return ObjectConstant2;
158 case 4:
return ArrayConstant1;
159 case 5:
return ArrayConstant2;
164 TypeHandle type =
None;
165 for (
int i = 0; i < n; ++i) {
166 type =
Type::Union(type, Fuzz(depth - 1), region_);
183 &&
reinterpret_cast<intptr_t
>(AsTagged(t)->at(0)) == tag;
185 static bool IsBitset(
Type* t) {
return reinterpret_cast<intptr_t
>(t) & 1; }
194 return static_cast<int>(
reinterpret_cast<intptr_t
>(t) >> 1);
197 return *
reinterpret_cast<Map**
>(AsTagged(t)->at(2));
200 return *
reinterpret_cast<Object**
>(AsTagged(t)->at(2));
229 template<
class Type,
class TypeHandle,
class Region,
class Rep>
237 isolate(
CcTest::i_isolate()),
240 T(Rep::ToRegion(&zone, isolate), isolate) {
244 CHECK_EQ(Rep::IsBitset(type1), Rep::IsBitset(type2));
245 CHECK_EQ(Rep::IsClass(type1), Rep::IsClass(type2));
246 CHECK_EQ(Rep::IsConstant(type1), Rep::IsConstant(type2));
247 CHECK_EQ(Rep::IsUnion(type1), Rep::IsUnion(type2));
248 CHECK_EQ(type1->NumClasses(), type2->NumClasses());
249 CHECK_EQ(type1->NumConstants(), type2->NumConstants());
250 if (Rep::IsBitset(type1)) {
251 CHECK_EQ(Rep::AsBitset(type1), Rep::AsBitset(type2));
252 }
else if (Rep::IsClass(type1)) {
253 CHECK_EQ(Rep::AsClass(type1), Rep::AsClass(type2));
254 }
else if (Rep::IsConstant(type1)) {
255 CHECK_EQ(Rep::AsConstant(type1), Rep::AsConstant(type2));
256 }
else if (Rep::IsUnion(type1)) {
257 CHECK_EQ(Rep::AsUnion(type1)->length(), Rep::AsUnion(type2)->length());
259 CHECK(type1->Is(type2));
260 CHECK(type2->Is(type1));
263 void CheckSub(TypeHandle type1, TypeHandle type2) {
264 CHECK(type1->Is(type2));
265 CHECK(!type2->Is(type1));
266 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
267 CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2));
272 CHECK(!type1->Is(type2));
273 CHECK(!type2->Is(type1));
274 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
275 CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2));
279 void CheckOverlap(TypeHandle type1, TypeHandle type2, TypeHandle mask) {
280 CHECK(type1->Maybe(type2));
281 CHECK(type2->Maybe(type1));
282 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
284 Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask));
289 CHECK(!type1->Is(type2));
290 CHECK(!type2->Is(type1));
291 CHECK(!type1->Maybe(type2));
292 CHECK(!type2->Maybe(type1));
293 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
295 Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask));
300 CHECK(this->IsBitset(
T.None));
301 CHECK(this->IsBitset(
T.Any));
302 CHECK(this->IsBitset(
T.String));
303 CHECK(this->IsBitset(
T.Object));
305 CHECK(this->IsBitset(
T.Union(
T.String,
T.Number)));
306 CHECK(this->IsBitset(
T.Union(
T.String,
T.Receiver)));
310 this->AsBitset(
T.Number) | this->AsBitset(
T.String),
311 this->AsBitset(
T.Union(
T.String,
T.Number)));
313 this->AsBitset(
T.Receiver),
314 this->AsBitset(
T.Union(
T.Receiver,
T.Object)));
318 CHECK(this->IsClass(
T.ObjectClass));
319 CHECK(this->IsClass(
T.ArrayClass));
321 CHECK(*
T.object_map == this->AsClass(
T.ObjectClass));
322 CHECK(*
T.array_map == this->AsClass(
T.ArrayClass));
326 CHECK(this->IsConstant(
T.SmiConstant));
327 CHECK(this->IsConstant(
T.ObjectConstant1));
328 CHECK(this->IsConstant(
T.ObjectConstant2));
329 CHECK(this->IsConstant(
T.ArrayConstant1));
330 CHECK(this->IsConstant(
T.ArrayConstant2));
332 CHECK(*
T.smi == this->AsConstant(
T.SmiConstant));
333 CHECK(*
T.object1 == this->AsConstant(
T.ObjectConstant1));
334 CHECK(*
T.object2 == this->AsConstant(
T.ObjectConstant2));
335 CHECK(*
T.object1 != this->AsConstant(
T.ObjectConstant2));
336 CHECK(*
T.array == this->AsConstant(
T.ArrayConstant1));
337 CHECK(*
T.array == this->AsConstant(
T.ArrayConstant2));
346 CHECK(
T.ObjectClass->Is(
T.ObjectClass));
347 CHECK(
T.ObjectConstant1->Is(
T.ObjectConstant1));
348 CHECK(
T.ArrayConstant1->Is(
T.ArrayConstant2));
351 CheckSub(
T.None,
T.Number);
352 CheckSub(
T.None,
T.Any);
354 CheckSub(
T.Oddball,
T.Any);
355 CheckSub(
T.Boolean,
T.Oddball);
356 CheckSub(
T.Null,
T.Oddball);
357 CheckSub(
T.Undefined,
T.Oddball);
358 CheckUnordered(
T.Boolean,
T.Null);
359 CheckUnordered(
T.Undefined,
T.Null);
360 CheckUnordered(
T.Boolean,
T.Undefined);
362 CheckSub(
T.Number,
T.Any);
363 CheckSub(
T.SignedSmall,
T.Number);
364 CheckSub(
T.Signed32,
T.Number);
365 CheckSub(
T.Float,
T.Number);
366 CheckSub(
T.SignedSmall,
T.Signed32);
367 CheckUnordered(
T.SignedSmall,
T.Float);
368 CheckUnordered(
T.Signed32,
T.Float);
370 CheckSub(
T.Name,
T.Any);
371 CheckSub(
T.UniqueName,
T.Any);
372 CheckSub(
T.UniqueName,
T.Name);
373 CheckSub(
T.String,
T.Name);
374 CheckSub(
T.InternalizedString,
T.String);
375 CheckSub(
T.InternalizedString,
T.UniqueName);
376 CheckSub(
T.InternalizedString,
T.Name);
377 CheckSub(
T.Symbol,
T.UniqueName);
378 CheckSub(
T.Symbol,
T.Name);
379 CheckUnordered(
T.String,
T.UniqueName);
380 CheckUnordered(
T.String,
T.Symbol);
381 CheckUnordered(
T.InternalizedString,
T.Symbol);
383 CheckSub(
T.Receiver,
T.Any);
384 CheckSub(
T.Object,
T.Any);
385 CheckSub(
T.Object,
T.Receiver);
386 CheckSub(
T.Array,
T.Object);
387 CheckSub(
T.Function,
T.Object);
388 CheckSub(
T.Proxy,
T.Receiver);
389 CheckUnordered(
T.Object,
T.Proxy);
390 CheckUnordered(
T.Array,
T.Function);
393 CheckSub(
T.None,
T.ObjectClass);
394 CheckSub(
T.None,
T.ObjectConstant1);
395 CheckSub(
T.ObjectClass,
T.Any);
396 CheckSub(
T.ObjectConstant1,
T.Any);
398 CheckSub(
T.ObjectClass,
T.Object);
399 CheckSub(
T.ArrayClass,
T.Object);
400 CheckUnordered(
T.ObjectClass,
T.ArrayClass);
402 CheckSub(
T.SmiConstant,
T.SignedSmall);
403 CheckSub(
T.SmiConstant,
T.Signed32);
404 CheckSub(
T.SmiConstant,
T.Number);
405 CheckSub(
T.ObjectConstant1,
T.Object);
406 CheckSub(
T.ObjectConstant2,
T.Object);
407 CheckSub(
T.ArrayConstant1,
T.Object);
408 CheckSub(
T.ArrayConstant1,
T.Array);
409 CheckUnordered(
T.ObjectConstant1,
T.ObjectConstant2);
410 CheckUnordered(
T.ObjectConstant1,
T.ArrayConstant1);
412 CheckUnordered(
T.ObjectConstant1,
T.ObjectClass);
413 CheckUnordered(
T.ObjectConstant2,
T.ObjectClass);
414 CheckUnordered(
T.ObjectConstant1,
T.ArrayClass);
415 CheckUnordered(
T.ObjectConstant2,
T.ArrayClass);
416 CheckUnordered(
T.ArrayConstant1,
T.ObjectClass);
420 CheckOverlap(
T.Any,
T.Any,
T.Semantic);
421 CheckOverlap(
T.Object,
T.Object,
T.Semantic);
423 CheckOverlap(
T.Oddball,
T.Any,
T.Semantic);
424 CheckOverlap(
T.Boolean,
T.Oddball,
T.Semantic);
425 CheckOverlap(
T.Null,
T.Oddball,
T.Semantic);
426 CheckOverlap(
T.Undefined,
T.Oddball,
T.Semantic);
427 CheckDisjoint(
T.Boolean,
T.Null,
T.Semantic);
428 CheckDisjoint(
T.Undefined,
T.Null,
T.Semantic);
429 CheckDisjoint(
T.Boolean,
T.Undefined,
T.Semantic);
431 CheckOverlap(
T.Number,
T.Any,
T.Semantic);
432 CheckOverlap(
T.SignedSmall,
T.Number,
T.Semantic);
433 CheckOverlap(
T.Float,
T.Number,
T.Semantic);
434 CheckDisjoint(
T.Signed32,
T.Float,
T.Semantic);
436 CheckOverlap(
T.Name,
T.Any,
T.Semantic);
437 CheckOverlap(
T.UniqueName,
T.Any,
T.Semantic);
438 CheckOverlap(
T.UniqueName,
T.Name,
T.Semantic);
439 CheckOverlap(
T.String,
T.Name,
T.Semantic);
440 CheckOverlap(
T.InternalizedString,
T.String,
T.Semantic);
441 CheckOverlap(
T.InternalizedString,
T.UniqueName,
T.Semantic);
442 CheckOverlap(
T.InternalizedString,
T.Name,
T.Semantic);
443 CheckOverlap(
T.Symbol,
T.UniqueName,
T.Semantic);
444 CheckOverlap(
T.Symbol,
T.Name,
T.Semantic);
445 CheckOverlap(
T.String,
T.UniqueName,
T.Semantic);
446 CheckDisjoint(
T.String,
T.Symbol,
T.Semantic);
447 CheckDisjoint(
T.InternalizedString,
T.Symbol,
T.Semantic);
449 CheckOverlap(
T.Receiver,
T.Any,
T.Semantic);
450 CheckOverlap(
T.Object,
T.Any,
T.Semantic);
451 CheckOverlap(
T.Object,
T.Receiver,
T.Semantic);
452 CheckOverlap(
T.Array,
T.Object,
T.Semantic);
453 CheckOverlap(
T.Function,
T.Object,
T.Semantic);
454 CheckOverlap(
T.Proxy,
T.Receiver,
T.Semantic);
455 CheckDisjoint(
T.Object,
T.Proxy,
T.Semantic);
456 CheckDisjoint(
T.Array,
T.Function,
T.Semantic);
458 CheckOverlap(
T.ObjectClass,
T.Any,
T.Semantic);
459 CheckOverlap(
T.ObjectConstant1,
T.Any,
T.Semantic);
461 CheckOverlap(
T.ObjectClass,
T.Object,
T.Semantic);
462 CheckOverlap(
T.ArrayClass,
T.Object,
T.Semantic);
463 CheckOverlap(
T.ObjectClass,
T.ObjectClass,
T.Semantic);
464 CheckOverlap(
T.ArrayClass,
T.ArrayClass,
T.Semantic);
465 CheckDisjoint(
T.ObjectClass,
T.ArrayClass,
T.Semantic);
467 CheckOverlap(
T.SmiConstant,
T.SignedSmall,
T.Semantic);
468 CheckOverlap(
T.SmiConstant,
T.Signed32,
T.Semantic);
469 CheckOverlap(
T.SmiConstant,
T.Number,
T.Semantic);
470 CheckDisjoint(
T.SmiConstant,
T.Float,
T.Semantic);
471 CheckOverlap(
T.ObjectConstant1,
T.Object,
T.Semantic);
472 CheckOverlap(
T.ObjectConstant2,
T.Object,
T.Semantic);
473 CheckOverlap(
T.ArrayConstant1,
T.Object,
T.Semantic);
474 CheckOverlap(
T.ArrayConstant1,
T.Array,
T.Semantic);
475 CheckOverlap(
T.ArrayConstant1,
T.ArrayConstant2,
T.Semantic);
476 CheckOverlap(
T.ObjectConstant1,
T.ObjectConstant1,
T.Semantic);
477 CheckDisjoint(
T.ObjectConstant1,
T.ObjectConstant2,
T.Semantic);
478 CheckDisjoint(
T.ObjectConstant1,
T.ArrayConstant1,
T.Semantic);
480 CheckDisjoint(
T.ObjectConstant1,
T.ObjectClass,
T.Semantic);
481 CheckDisjoint(
T.ObjectConstant2,
T.ObjectClass,
T.Semantic);
482 CheckDisjoint(
T.ObjectConstant1,
T.ArrayClass,
T.Semantic);
483 CheckDisjoint(
T.ObjectConstant2,
T.ArrayClass,
T.Semantic);
484 CheckDisjoint(
T.ArrayConstant1,
T.ObjectClass,
T.Semantic);
489 CHECK(this->IsBitset(
T.Union(
T.Object,
T.Number)));
490 CHECK(this->IsBitset(
T.Union(
T.Object,
T.Object)));
491 CHECK(this->IsBitset(
T.Union(
T.Any,
T.None)));
493 CheckEqual(
T.Union(
T.None,
T.Number),
T.Number);
494 CheckEqual(
T.Union(
T.Object,
T.Proxy),
T.Receiver);
495 CheckEqual(
T.Union(
T.Number,
T.String),
T.Union(
T.String,
T.Number));
496 CheckSub(
T.Union(
T.Number,
T.String),
T.Any);
499 CHECK(this->IsClass(
T.Union(
T.ObjectClass,
T.ObjectClass)));
500 CHECK(this->IsUnion(
T.Union(
T.ObjectClass,
T.ArrayClass)));
502 CheckEqual(
T.Union(
T.ObjectClass,
T.ObjectClass),
T.ObjectClass);
503 CheckSub(
T.None,
T.Union(
T.ObjectClass,
T.ArrayClass));
504 CheckSub(
T.Union(
T.ObjectClass,
T.ArrayClass),
T.Any);
505 CheckSub(
T.ObjectClass,
T.Union(
T.ObjectClass,
T.ArrayClass));
506 CheckSub(
T.ArrayClass,
T.Union(
T.ObjectClass,
T.ArrayClass));
507 CheckSub(
T.Union(
T.ObjectClass,
T.ArrayClass),
T.Object);
508 CheckUnordered(
T.Union(
T.ObjectClass,
T.ArrayClass),
T.Array);
509 CheckOverlap(
T.Union(
T.ObjectClass,
T.ArrayClass),
T.Array,
T.Semantic);
510 CheckDisjoint(
T.Union(
T.ObjectClass,
T.ArrayClass),
T.Number,
T.Semantic);
513 CHECK(this->IsConstant(
T.Union(
T.ObjectConstant1,
T.ObjectConstant1)));
514 CHECK(this->IsConstant(
T.Union(
T.ArrayConstant1,
T.ArrayConstant1)));
515 CHECK(this->IsUnion(
T.Union(
T.ObjectConstant1,
T.ObjectConstant2)));
518 T.Union(
T.ObjectConstant1,
T.ObjectConstant1),
520 CheckEqual(
T.Union(
T.ArrayConstant1,
T.ArrayConstant1),
T.ArrayConstant1);
521 CheckEqual(
T.Union(
T.ArrayConstant1,
T.ArrayConstant1),
T.ArrayConstant2);
522 CheckSub(
T.None,
T.Union(
T.ObjectConstant1,
T.ObjectConstant2));
523 CheckSub(
T.Union(
T.ObjectConstant1,
T.ObjectConstant2),
T.Any);
524 CheckSub(
T.ObjectConstant1,
T.Union(
T.ObjectConstant1,
T.ObjectConstant2));
525 CheckSub(
T.ObjectConstant2,
T.Union(
T.ObjectConstant1,
T.ObjectConstant2));
526 CheckSub(
T.ArrayConstant2,
T.Union(
T.ArrayConstant1,
T.ObjectConstant2));
527 CheckSub(
T.Union(
T.ObjectConstant1,
T.ObjectConstant2),
T.Object);
529 T.Union(
T.ObjectConstant1,
T.ObjectConstant2),
T.ObjectClass);
530 CheckUnordered(
T.Union(
T.ObjectConstant1,
T.ArrayConstant1),
T.Array);
532 T.Union(
T.ObjectConstant1,
T.ArrayConstant1),
T.Array,
T.Semantic);
534 T.Union(
T.ObjectConstant1,
T.ArrayConstant1),
T.ArrayConstant2,
537 T.Union(
T.ObjectConstant1,
T.ArrayConstant1),
T.Number,
T.Semantic);
539 T.Union(
T.ObjectConstant1,
T.ArrayConstant1),
T.ObjectClass,
543 CHECK(this->IsBitset(
T.Union(
T.ObjectClass,
T.Object)));
544 CHECK(this->IsUnion(
T.Union(
T.ObjectClass,
T.Number)));
546 CheckEqual(
T.Union(
T.ObjectClass,
T.Object),
T.Object);
547 CheckSub(
T.None,
T.Union(
T.ObjectClass,
T.Number));
548 CheckSub(
T.Union(
T.ObjectClass,
T.Number),
T.Any);
550 T.Union(
T.ObjectClass,
T.SignedSmall),
T.Union(
T.Object,
T.Number));
551 CheckSub(
T.Union(
T.ObjectClass,
T.Array),
T.Object);
552 CheckUnordered(
T.Union(
T.ObjectClass,
T.String),
T.Array);
553 CheckOverlap(
T.Union(
T.ObjectClass,
T.String),
T.Object,
T.Semantic);
554 CheckDisjoint(
T.Union(
T.ObjectClass,
T.String),
T.Number,
T.Semantic);
557 CHECK(this->IsBitset(
T.Union(
T.SmiConstant,
T.Number)));
558 CHECK(this->IsBitset(
T.Union(
T.ObjectConstant1,
T.Object)));
559 CHECK(this->IsUnion(
T.Union(
T.ObjectConstant2,
T.Number)));
561 CheckEqual(
T.Union(
T.SmiConstant,
T.Number),
T.Number);
562 CheckEqual(
T.Union(
T.ObjectConstant1,
T.Object),
T.Object);
563 CheckSub(
T.None,
T.Union(
T.ObjectConstant1,
T.Number));
564 CheckSub(
T.Union(
T.ObjectConstant1,
T.Number),
T.Any);
566 T.Union(
T.ObjectConstant1,
T.Signed32),
T.Union(
T.Object,
T.Number));
567 CheckSub(
T.Union(
T.ObjectConstant1,
T.Array),
T.Object);
568 CheckUnordered(
T.Union(
T.ObjectConstant1,
T.String),
T.Array);
569 CheckOverlap(
T.Union(
T.ObjectConstant1,
T.String),
T.Object,
T.Semantic);
570 CheckDisjoint(
T.Union(
T.ObjectConstant1,
T.String),
T.Number,
T.Semantic);
571 CheckEqual(
T.Union(
T.Signed32,
T.Signed32Constant),
T.Signed32);
574 CHECK(this->IsUnion(
T.Union(
T.ObjectConstant1,
T.ObjectClass)));
575 CHECK(this->IsUnion(
T.Union(
T.ArrayClass,
T.ObjectConstant2)));
577 CheckSub(
T.None,
T.Union(
T.ObjectConstant1,
T.ArrayClass));
578 CheckSub(
T.Union(
T.ObjectConstant1,
T.ArrayClass),
T.Any);
579 CheckSub(
T.Union(
T.ObjectConstant1,
T.ArrayClass),
T.Object);
580 CheckSub(
T.ObjectConstant1,
T.Union(
T.ObjectConstant1,
T.ArrayClass));
581 CheckSub(
T.ArrayClass,
T.Union(
T.ObjectConstant1,
T.ArrayClass));
582 CheckUnordered(
T.ObjectClass,
T.Union(
T.ObjectConstant1,
T.ArrayClass));
584 T.Union(
T.ObjectConstant1,
T.ArrayClass),
T.Union(
T.Array,
T.Object));
585 CheckUnordered(
T.Union(
T.ObjectConstant1,
T.ArrayClass),
T.ArrayConstant1);
587 T.Union(
T.ObjectConstant1,
T.ArrayClass),
T.ObjectConstant2,
590 T.Union(
T.ObjectConstant1,
T.ArrayClass),
T.ObjectClass,
T.Semantic);
593 CHECK(this->IsBitset(
594 T.Union(
T.Object,
T.Union(
T.ObjectConstant1,
T.ObjectClass))));
596 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant2),
T.Number)));
599 T.Union(
T.Object,
T.Union(
T.ObjectConstant1,
T.ObjectClass)),
602 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant1),
T.Number),
603 T.Union(
T.ObjectConstant1,
T.Union(
T.Number,
T.ArrayClass)));
606 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant1),
T.Number));
609 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant1),
T.Float));
612 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant1),
T.Float));
614 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant1),
T.Float),
617 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant1),
T.Float),
618 T.Union(
T.ObjectConstant1,
T.Union(
T.Number,
T.ArrayClass)));
622 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant2),
T.ArrayClass)));
624 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant2),
T.ObjectClass)));
627 T.Union(
T.ObjectClass,
T.Union(
T.ObjectConstant1,
T.ObjectClass)),
628 T.Union(
T.ObjectClass,
T.ObjectConstant1));
631 T.Union(
T.ObjectClass,
T.Union(
T.ObjectConstant1,
T.ObjectClass)));
633 T.Union(
T.ObjectClass,
T.Union(
T.ObjectConstant1,
T.ObjectClass)),
636 T.Union(
T.ObjectClass,
T.Union(
T.ObjectConstant1,
T.ObjectClass)),
639 T.Union(
T.Union(
T.ArrayClass,
T.ObjectConstant2),
T.ArrayClass),
640 T.Union(
T.ArrayClass,
T.ObjectConstant2));
643 CHECK(this->IsUnion(
T.Union(
644 T.ObjectConstant1,
T.Union(
T.ObjectConstant1,
T.ObjectConstant2))));
645 CHECK(this->IsUnion(
T.Union(
646 T.Union(
T.ArrayConstant1,
T.ObjectClass),
T.ObjectConstant1)));
647 CHECK(this->IsUnion(
T.Union(
648 T.Union(
T.ArrayConstant1,
T.ObjectConstant2),
T.ObjectConstant1)));
652 T.ObjectConstant1,
T.Union(
T.ObjectConstant1,
T.ObjectConstant2)),
653 T.Union(
T.ObjectConstant2,
T.ObjectConstant1));
656 T.Union(
T.ArrayConstant1,
T.ObjectConstant2),
T.ObjectConstant1),
658 T.ObjectConstant2,
T.Union(
T.ArrayConstant1,
T.ObjectConstant1)));
661 CHECK(this->IsBitset(
T.Union(
662 T.Union(
T.Number,
T.ArrayClass),
663 T.Union(
T.Signed32,
T.Array))));
664 CHECK(this->IsUnion(
T.Union(
665 T.Union(
T.Number,
T.ArrayClass),
666 T.Union(
T.ObjectClass,
T.ArrayClass))));
670 T.Union(
T.ObjectConstant2,
T.ObjectConstant1),
671 T.Union(
T.ObjectConstant1,
T.ObjectConstant2)),
672 T.Union(
T.ObjectConstant2,
T.ObjectConstant1));
675 T.Union(
T.ObjectConstant2,
T.ArrayConstant1),
676 T.Union(
T.ObjectConstant1,
T.ArrayConstant2)),
678 T.Union(
T.ObjectConstant1,
T.ObjectConstant2),
682 T.Union(
T.Number,
T.ArrayClass),
683 T.Union(
T.SignedSmall,
T.Array)),
684 T.Union(
T.Number,
T.Array));
689 CHECK(this->IsBitset(
T.Intersect(
T.Object,
T.Number)));
690 CHECK(this->IsBitset(
T.Intersect(
T.Object,
T.Object)));
691 CHECK(this->IsBitset(
T.Intersect(
T.Any,
T.None)));
693 CheckEqual(
T.Intersect(
T.None,
T.Number),
T.None);
694 CheckSub(
T.Intersect(
T.Object,
T.Proxy),
T.Representation);
695 CheckEqual(
T.Intersect(
T.Name,
T.String),
T.Intersect(
T.String,
T.Name));
696 CheckEqual(
T.Intersect(
T.UniqueName,
T.String),
T.InternalizedString);
699 CHECK(this->IsClass(
T.Intersect(
T.ObjectClass,
T.ObjectClass)));
700 CHECK(this->IsBitset(
T.Intersect(
T.ObjectClass,
T.ArrayClass)));
702 CheckEqual(
T.Intersect(
T.ObjectClass,
T.ObjectClass),
T.ObjectClass);
703 CheckEqual(
T.Intersect(
T.ObjectClass,
T.ArrayClass),
T.None);
706 CHECK(this->IsConstant(
T.Intersect(
T.ObjectConstant1,
T.ObjectConstant1)));
707 CHECK(this->IsConstant(
T.Intersect(
T.ArrayConstant1,
T.ArrayConstant2)));
708 CHECK(this->IsBitset(
T.Intersect(
T.ObjectConstant1,
T.ObjectConstant2)));
711 T.Intersect(
T.ObjectConstant1,
T.ObjectConstant1),
T.ObjectConstant1);
713 T.Intersect(
T.ArrayConstant1,
T.ArrayConstant2),
T.ArrayConstant1);
714 CheckEqual(
T.Intersect(
T.ObjectConstant1,
T.ObjectConstant2),
T.None);
717 CHECK(this->IsClass(
T.Intersect(
T.ObjectClass,
T.Object)));
718 CHECK(this->IsBitset(
T.Intersect(
T.ObjectClass,
T.Number)));
720 CheckEqual(
T.Intersect(
T.ObjectClass,
T.Object),
T.ObjectClass);
721 CheckSub(
T.Intersect(
T.ObjectClass,
T.Array),
T.Representation);
722 CheckSub(
T.Intersect(
T.ObjectClass,
T.Number),
T.Representation);
725 CHECK(this->IsBitset(
T.Intersect(
T.SignedSmall,
T.Number)));
726 CHECK(this->IsConstant(
T.Intersect(
T.SmiConstant,
T.Number)));
727 CHECK(this->IsConstant(
T.Intersect(
T.ObjectConstant1,
T.Object)));
729 CheckEqual(
T.Intersect(
T.SignedSmall,
T.Number),
T.SignedSmall);
730 CheckEqual(
T.Intersect(
T.SmiConstant,
T.Number),
T.SmiConstant);
731 CheckEqual(
T.Intersect(
T.ObjectConstant1,
T.Object),
T.ObjectConstant1);
734 CHECK(this->IsBitset(
T.Intersect(
T.ObjectConstant1,
T.ObjectClass)));
735 CHECK(this->IsBitset(
T.Intersect(
T.ArrayClass,
T.ObjectConstant2)));
737 CheckEqual(
T.Intersect(
T.ObjectConstant1,
T.ObjectClass),
T.None);
738 CheckEqual(
T.Intersect(
T.ArrayClass,
T.ObjectConstant2),
T.None);
742 T.Intersect(
T.Object,
T.Union(
T.ObjectConstant1,
T.ObjectClass))));
743 CHECK(this->IsBitset(
744 T.Intersect(
T.Union(
T.ArrayClass,
T.ObjectConstant2),
T.Number)));
747 T.Intersect(
T.Object,
T.Union(
T.ObjectConstant1,
T.ObjectClass)),
748 T.Union(
T.ObjectConstant1,
T.ObjectClass));
750 T.Intersect(
T.Union(
T.ArrayClass,
T.ObjectConstant1),
T.Number),
755 T.Intersect(
T.Union(
T.ArrayClass,
T.ObjectConstant2),
T.ArrayClass)));
757 T.Intersect(
T.Union(
T.Object,
T.SmiConstant),
T.ArrayClass)));
758 CHECK(this->IsBitset(
759 T.Intersect(
T.Union(
T.ObjectClass,
T.ArrayConstant1),
T.ArrayClass)));
762 T.Intersect(
T.ArrayClass,
T.Union(
T.ObjectConstant2,
T.ArrayClass)),
765 T.Intersect(
T.ArrayClass,
T.Union(
T.Object,
T.SmiConstant)),
768 T.Intersect(
T.Union(
T.ObjectClass,
T.ArrayConstant1),
T.ArrayClass),
772 CHECK(this->IsConstant(
T.Intersect(
773 T.ObjectConstant1,
T.Union(
T.ObjectConstant1,
T.ObjectConstant2))));
774 CHECK(this->IsConstant(
T.Intersect(
775 T.Union(
T.Number,
T.ObjectClass),
T.SmiConstant)));
776 CHECK(this->IsBitset(
T.Intersect(
777 T.Union(
T.ArrayConstant1,
T.ObjectClass),
T.ObjectConstant1)));
781 T.ObjectConstant1,
T.Union(
T.ObjectConstant1,
T.ObjectConstant2)),
784 T.Intersect(
T.SmiConstant,
T.Union(
T.Number,
T.ObjectConstant2)),
788 T.Union(
T.ArrayConstant1,
T.ObjectClass),
T.ObjectConstant1),
792 CHECK(this->IsUnion(
T.Intersect(
793 T.Union(
T.Number,
T.ArrayClass),
T.Union(
T.Signed32,
T.Array))));
794 CHECK(this->IsBitset(
T.Intersect(
795 T.Union(
T.Number,
T.ObjectClass),
T.Union(
T.Signed32,
T.Array))));
799 T.Union(
T.Number,
T.ArrayClass),
800 T.Union(
T.SignedSmall,
T.Array)),
801 T.Union(
T.SignedSmall,
T.ArrayClass));
804 T.Union(
T.Number,
T.ObjectClass),
805 T.Union(
T.Signed32,
T.Array)),
809 T.Union(
T.ObjectConstant2,
T.ObjectConstant1),
810 T.Union(
T.ObjectConstant1,
T.ObjectConstant2)),
811 T.Union(
T.ObjectConstant2,
T.ObjectConstant1));
815 T.Union(
T.ObjectConstant2,
T.ObjectConstant1),
T.ArrayClass),
818 T.Union(
T.ArrayConstant1,
T.ObjectConstant2))),
819 T.Union(
T.ObjectConstant2,
T.ObjectConstant1));
822 T.Union(
T.ObjectConstant2,
T.ArrayConstant1),
823 T.Union(
T.ObjectConstant1,
T.ArrayConstant2)),
827 template<
class Type2,
class TypeHandle2,
class Region2,
class Rep2>
830 Rep2::ToRegion(&zone, isolate), isolate);
831 for (
int i = 0; i < 100; ++i) {
832 TypeHandle type =
T.Fuzz();
834 T.template Convert<Type2>(T2.template Convert<Type>(type)));
void CheckEqual(TypeHandle type1, TypeHandle type2)
TypeHandle ArrayConstant1
static bool IsBitset(Type *t)
TypeHandle Union(TypeHandle t1, TypeHandle t2)
#define CHECK_EQ(expected, value)
static bool IsUnion(Handle< HeapType > t)
void CheckSub(TypeHandle type1, TypeHandle type2)
TypeHandle Fuzz(int depth=5)
static Smi * FromInt(int value)
static ZoneList< Type * > * AsUnion(Type *t)
Types(Region *region, Isolate *isolate)
static Map * cast(Object *obj)
Tests< Type, Type *, Zone, ZoneRep > ZoneTests
TypeImpl< ZoneTypeConfig > Type
Handle< i::Map > object_map
Handle< i::HeapNumber > signed32
TypeHandle InternalizedString
Handle< i::JSObject > object2
static int AsBitset(Handle< HeapType > t)
void CheckUnordered(TypeHandle type1, TypeHandle type2)
TypeHandle ObjectConstant2
static Zone * ToRegion(Zone *zone, Isolate *isolate)
static bool IsConstant(Type *t)
static Map * AsClass(Handle< HeapType > t)
TypeHandle ObjectConstant1
static Smi * cast(Object *object)
static Isolate * ToRegion(Zone *zone, Isolate *isolate)
static bool IsBitset(Handle< HeapType > t)
Handle< JSObject > NewJSObjectFromMap(Handle< Map > map, PretenureFlag pretenure=NOT_TENURED, bool allocate_properties=true, Handle< AllocationSite > allocation_site=Handle< AllocationSite >::null())
void CheckOverlap(TypeHandle type1, TypeHandle type2, TypeHandle mask)
static Box * cast(Object *obj)
TypeHandle Signed32Constant
TypeHandle ArrayConstant2
#define BITSET_TYPE_LIST(V)
Handle< i::Map > array_map
static bool IsConstant(Handle< HeapType > t)
static FixedArray * AsUnion(Handle< HeapType > t)
Handle< HeapNumber > NewHeapNumber(double value, PretenureFlag pretenure=NOT_TENURED)
static bool IsUnion(Type *t)
static Object * AsConstant(Handle< HeapType > t)
Handle< i::JSObject > object1
V8_INLINE Handle< Primitive > Undefined(Isolate *isolate)
#define CHECK_NE(unexpected, value)
Handle< i::JSArray > array
static bool IsClass(Type *t)
#define T(name, string, precedence)
static TypeHandle Intersect(TypeHandle type1, TypeHandle type2, Region *reg)
static Map * AsClass(Type *t)
void CheckDisjoint(TypeHandle type1, TypeHandle type2, TypeHandle mask)
Types< Type, TypeHandle, Region > T
static void InitializeVM()
static ZoneList< void * > * AsTagged(Type *t)
Handle< T > handle(T *t, Isolate *isolate)
TypeHandle Representation
static bool IsClass(Handle< HeapType > t)
TypeHandle Intersect(TypeHandle t1, TypeHandle t2)
#define PICK_BITSET_TYPE(type, value)
static Object * AsConstant(Type *t)
static FixedArray * cast(Object *obj)
static TypeHandle Constant(i::Handle< i::Object > value, Region *region)
Tests< HeapType, Handle< HeapType >, Isolate, HeapRep > HeapTests
static TypeHandle Union(TypeHandle type1, TypeHandle type2, Region *reg)
static TypeHandle Class(i::Handle< i::Map > map, Region *region)
TypeHandle Convert(TypeHandle2 t)
#define COUNT_BITSET_TYPES(type, value)
TypeImpl< HeapTypeConfig > HeapType
V8_INLINE Handle< Primitive > Null(Isolate *isolate)
static bool IsTagged(Type *t, int tag)
Handle< JSArray > NewJSArray(ElementsKind elements_kind, int length, int capacity, ArrayStorageAllocationMode mode=INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE, PretenureFlag pretenure=NOT_TENURED)
static int AsBitset(Type *t)