| 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 "types.h" | 5 #include "types.h" |
| 6 | 6 |
| 7 #include "string-stream.h" | 7 #include "string-stream.h" |
| 8 #include "types-inl.h" | 8 #include "types-inl.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 } | 299 } |
| 300 return false; | 300 return false; |
| 301 } | 301 } |
| 302 | 302 |
| 303 return false; | 303 return false; |
| 304 } | 304 } |
| 305 | 305 |
| 306 | 306 |
| 307 template<class Config> | 307 template<class Config> |
| 308 bool TypeImpl<Config>::NowIs(TypeImpl* that) { | 308 bool TypeImpl<Config>::NowIs(TypeImpl* that) { |
| 309 // TODO(rossberg): this is incorrect for |
| 310 // Union(Constant(V), T)->NowIs(Class(M)) |
| 311 // but fuzzing does not cover that! |
| 309 DisallowHeapAllocation no_allocation; | 312 DisallowHeapAllocation no_allocation; |
| 310 if (this->IsConstant()) { | 313 if (this->IsConstant()) { |
| 311 i::Object* object = *this->AsConstant(); | 314 i::Object* object = *this->AsConstant(); |
| 312 if (object->IsHeapObject()) { | 315 if (object->IsHeapObject()) { |
| 313 i::Map* map = i::HeapObject::cast(object)->map(); | 316 i::Map* map = i::HeapObject::cast(object)->map(); |
| 314 for (Iterator<i::Map> it = that->Classes(); !it.Done(); it.Advance()) { | 317 for (Iterator<i::Map> it = that->Classes(); !it.Done(); it.Advance()) { |
| 315 if (*it.Current() == map) return true; | 318 if (*it.Current() == map) return true; |
| 316 } | 319 } |
| 317 } | 320 } |
| 318 } | 321 } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 | 444 |
| 442 // Slow case: may need to produce a Unioned object. | 445 // Slow case: may need to produce a Unioned object. |
| 443 int size = 0; | 446 int size = 0; |
| 444 if (!type1->IsBitset()) { | 447 if (!type1->IsBitset()) { |
| 445 size += (type1->IsUnion() ? Config::struct_length(type1->AsUnion()) : 1); | 448 size += (type1->IsUnion() ? Config::struct_length(type1->AsUnion()) : 1); |
| 446 } | 449 } |
| 447 if (!type2->IsBitset()) { | 450 if (!type2->IsBitset()) { |
| 448 size += (type2->IsUnion() ? Config::struct_length(type2->AsUnion()) : 1); | 451 size += (type2->IsUnion() ? Config::struct_length(type2->AsUnion()) : 1); |
| 449 } | 452 } |
| 450 int bitset = type1->GlbBitset() | type2->GlbBitset(); | 453 int bitset = type1->GlbBitset() | type2->GlbBitset(); |
| 451 if (IsInhabited(bitset)) ++size; | 454 if (bitset != kNone) ++size; |
| 452 ASSERT(size >= 1); | 455 ASSERT(size >= 1); |
| 453 StructHandle unioned = Config::struct_create(kUnionTag, size, region); | 456 StructHandle unioned = Config::struct_create(kUnionTag, size, region); |
| 454 | 457 |
| 455 size = 0; | 458 size = 0; |
| 456 if (IsInhabited(bitset)) { | 459 if (bitset != kNone) { |
| 457 Config::struct_set(unioned, size++, Config::from_bitset(bitset, region)); | 460 Config::struct_set(unioned, size++, Config::from_bitset(bitset, region)); |
| 458 } | 461 } |
| 459 size = ExtendUnion(unioned, type1, size); | 462 size = ExtendUnion(unioned, type1, size); |
| 460 size = ExtendUnion(unioned, type2, size); | 463 size = ExtendUnion(unioned, type2, size); |
| 461 | 464 |
| 462 if (size == 1) { | 465 if (size == 1) { |
| 463 return Config::struct_get(unioned, 0); | 466 return Config::struct_get(unioned, 0); |
| 464 } else { | 467 } else { |
| 465 Config::struct_shrink(unioned, size); | 468 Config::struct_shrink(unioned, size); |
| 466 return Config::from_struct(unioned); | 469 return Config::from_struct(unioned); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 // Slow case: may need to produce a Unioned object. | 520 // Slow case: may need to produce a Unioned object. |
| 518 int size = INT_MAX; | 521 int size = INT_MAX; |
| 519 if (!type1->IsBitset()) { | 522 if (!type1->IsBitset()) { |
| 520 size = (type1->IsUnion() ? Config::struct_length(type1->AsUnion()) : 1); | 523 size = (type1->IsUnion() ? Config::struct_length(type1->AsUnion()) : 1); |
| 521 } | 524 } |
| 522 if (!type2->IsBitset()) { | 525 if (!type2->IsBitset()) { |
| 523 size = Min(size, | 526 size = Min(size, |
| 524 type2->IsUnion() ? Config::struct_length(type2->AsUnion()) : 1); | 527 type2->IsUnion() ? Config::struct_length(type2->AsUnion()) : 1); |
| 525 } | 528 } |
| 526 int bitset = type1->GlbBitset() & type2->GlbBitset(); | 529 int bitset = type1->GlbBitset() & type2->GlbBitset(); |
| 527 if (IsInhabited(bitset)) ++size; | 530 if (bitset != kNone) ++size; |
| 528 ASSERT(size >= 1); | 531 ASSERT(size >= 1); |
| 529 StructHandle unioned = Config::struct_create(kUnionTag, size, region); | 532 StructHandle unioned = Config::struct_create(kUnionTag, size, region); |
| 530 | 533 |
| 531 size = 0; | 534 size = 0; |
| 532 if (IsInhabited(bitset)) { | 535 if (bitset != kNone) { |
| 533 Config::struct_set(unioned, size++, Config::from_bitset(bitset, region)); | 536 Config::struct_set(unioned, size++, Config::from_bitset(bitset, region)); |
| 534 } | 537 } |
| 535 size = ExtendIntersection(unioned, type1, type2, size); | 538 size = ExtendIntersection(unioned, type1, type2, size); |
| 536 size = ExtendIntersection(unioned, type2, type1, size); | 539 size = ExtendIntersection(unioned, type2, type1, size); |
| 537 | 540 |
| 538 if (size == 0) { | 541 if (size == 0) { |
| 539 return None(region); | 542 return None(region); |
| 540 } else if (size == 1) { | 543 } else if (size == 1) { |
| 541 return Config::struct_get(unioned, 0); | 544 return Config::struct_get(unioned, 0); |
| 542 } else { | 545 } else { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; | 691 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; |
| 689 | 692 |
| 690 template TypeImpl<ZoneTypeConfig>::TypeHandle | 693 template TypeImpl<ZoneTypeConfig>::TypeHandle |
| 691 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( | 694 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( |
| 692 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); | 695 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); |
| 693 template TypeImpl<HeapTypeConfig>::TypeHandle | 696 template TypeImpl<HeapTypeConfig>::TypeHandle |
| 694 TypeImpl<HeapTypeConfig>::Convert<Type>( | 697 TypeImpl<HeapTypeConfig>::Convert<Type>( |
| 695 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); | 698 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); |
| 696 | 699 |
| 697 } } // namespace v8::internal | 700 } } // namespace v8::internal |
| OLD | NEW |