| Index: src/types.cc
|
| diff --git a/src/types.cc b/src/types.cc
|
| index d9c12d209e5aea4ce5bfbc3cbdca8b20489300d9..4526b6fe4470866c27a5fb6c3a208c301f3b4c7c 100644
|
| --- a/src/types.cc
|
| +++ b/src/types.cc
|
| @@ -306,9 +306,6 @@ bool TypeImpl<Config>::SlowIs(TypeImpl* that) {
|
|
|
| template<class Config>
|
| bool TypeImpl<Config>::NowIs(TypeImpl* that) {
|
| - // TODO(rossberg): this is incorrect for
|
| - // Union(Constant(V), T)->NowIs(Class(M))
|
| - // but fuzzing does not cover that!
|
| DisallowHeapAllocation no_allocation;
|
| if (this->IsConstant()) {
|
| i::Object* object = *this->AsConstant();
|
| @@ -438,12 +435,12 @@ typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Union(
|
| size += (type2->IsUnion() ? Config::struct_length(type2->AsUnion()) : 1);
|
| }
|
| int bitset = type1->GlbBitset() | type2->GlbBitset();
|
| - if (bitset != kNone) ++size;
|
| + if (IsInhabited(bitset)) ++size;
|
| ASSERT(size >= 1);
|
| StructHandle unioned = Config::struct_create(kUnionTag, size, region);
|
|
|
| size = 0;
|
| - if (bitset != kNone) {
|
| + if (IsInhabited(bitset)) {
|
| Config::struct_set(unioned, size++, Config::from_bitset(bitset, region));
|
| }
|
| size = ExtendUnion(unioned, type1, size);
|
| @@ -514,12 +511,12 @@ typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Intersect(
|
| type2->IsUnion() ? Config::struct_length(type2->AsUnion()) : 1);
|
| }
|
| int bitset = type1->GlbBitset() & type2->GlbBitset();
|
| - if (bitset != kNone) ++size;
|
| + if (IsInhabited(bitset)) ++size;
|
| ASSERT(size >= 1);
|
| StructHandle unioned = Config::struct_create(kUnionTag, size, region);
|
|
|
| size = 0;
|
| - if (bitset != kNone) {
|
| + if (IsInhabited(bitset)) {
|
| Config::struct_set(unioned, size++, Config::from_bitset(bitset, region));
|
| }
|
| size = ExtendIntersection(unioned, type1, type2, size);
|
|
|