| 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/types.h" | 5 #include "src/types.h" |
| 6 | 6 |
| 7 #include "src/ostreams.h" | 7 #include "src/ostreams.h" |
| 8 #include "src/types-inl.h" | 8 #include "src/types-inl.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 // Predicates. | 241 // Predicates. |
| 242 | 242 |
| 243 // Check this <= that. | 243 // Check this <= that. |
| 244 template<class Config> | 244 template<class Config> |
| 245 bool TypeImpl<Config>::SlowIs(TypeImpl* that) { | 245 bool TypeImpl<Config>::SlowIs(TypeImpl* that) { |
| 246 DisallowHeapAllocation no_allocation; | 246 DisallowHeapAllocation no_allocation; |
| 247 | 247 |
| 248 // Fast path for bitsets. | 248 // Fast path for bitsets. |
| 249 if (this->IsNone()) return true; | 249 if (this->IsNone()) return true; |
| 250 if (that->IsBitset()) { | 250 if (that->IsBitset()) { |
| 251 return (BitsetType::Lub(this) | that->AsBitset()) == that->AsBitset(); | 251 return BitsetType::Is(BitsetType::Lub(this), that->AsBitset()); |
| 252 } | 252 } |
| 253 if (this->IsBitset() && SEMANTIC(this->AsBitset()) == BitsetType::kNone) { | 253 if (this->IsBitset() && SEMANTIC(this->AsBitset()) == BitsetType::kNone) { |
| 254 // Bitsets only have non-bitset supertypes along the representation axis. | 254 // Bitsets only have non-bitset supertypes along the representation axis. |
| 255 int that_bitset = that->BitsetGlb(); | 255 return BitsetType::Is(this->AsBitset(), that->BitsetGlb()); |
| 256 return (BitsetType::Is(this->AsBitset(), that_bitset)); | |
| 257 } | 256 } |
| 258 | 257 |
| 259 if (that->IsClass()) { | 258 if (that->IsClass()) { |
| 260 return this->IsClass() | 259 return this->IsClass() |
| 261 && *this->AsClass()->Map() == *that->AsClass()->Map() | 260 && *this->AsClass()->Map() == *that->AsClass()->Map() |
| 262 && ((Config::is_class(that) && Config::is_class(this)) || | 261 && ((Config::is_class(that) && Config::is_class(this)) || |
| 263 BitsetType::New(this->BitsetLub())->Is( | 262 BitsetType::New(this->BitsetLub())->Is( |
| 264 BitsetType::New(that->BitsetLub()))); | 263 BitsetType::New(that->BitsetLub()))); |
| 265 } | 264 } |
| 266 if (that->IsConstant()) { | 265 if (that->IsConstant()) { |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 } | 478 } |
| 480 | 479 |
| 481 | 480 |
| 482 template<class Config> | 481 template<class Config> |
| 483 int TypeImpl<Config>::IndexInUnion( | 482 int TypeImpl<Config>::IndexInUnion( |
| 484 int bound, UnionHandle unioned, int current_size) { | 483 int bound, UnionHandle unioned, int current_size) { |
| 485 DCHECK(!this->IsUnion()); | 484 DCHECK(!this->IsUnion()); |
| 486 for (int i = 0; i < current_size; ++i) { | 485 for (int i = 0; i < current_size; ++i) { |
| 487 TypeHandle that = unioned->Get(i); | 486 TypeHandle that = unioned->Get(i); |
| 488 if (that->IsBitset()) { | 487 if (that->IsBitset()) { |
| 489 if ((bound | that->AsBitset()) == that->AsBitset()) return i; | 488 if (BitsetType::Is(bound, that->AsBitset())) return i; |
| 490 } else if (that->IsClass() && this->IsClass()) { | 489 } else if (that->IsClass() && this->IsClass()) { |
| 491 if (*this->AsClass()->Map() == *that->AsClass()->Map()) return i; | 490 if (*this->AsClass()->Map() == *that->AsClass()->Map()) return i; |
| 492 } else if (that->IsConstant() && this->IsConstant()) { | 491 } else if (that->IsConstant() && this->IsConstant()) { |
| 493 if (*this->AsConstant()->Value() == *that->AsConstant()->Value()) | 492 if (*this->AsConstant()->Value() == *that->AsConstant()->Value()) |
| 494 return i; | 493 return i; |
| 495 } else if (that->IsContext() && this->IsContext()) { | 494 } else if (that->IsContext() && this->IsContext()) { |
| 496 if (this->Is(that)) return i; | 495 if (this->Is(that)) return i; |
| 497 } else if (that->IsArray() && this->IsArray()) { | 496 } else if (that->IsArray() && this->IsArray()) { |
| 498 if (this->Is(that)) return i; | 497 if (this->Is(that)) return i; |
| 499 } else if (that->IsFunction() && this->IsFunction()) { | 498 } else if (that->IsFunction() && this->IsFunction()) { |
| 500 if (this->Is(that)) return i; | 499 if (this->Is(that)) return i; |
| 501 } | 500 } |
| 502 } | 501 } |
| 503 return -1; | 502 return -1; |
| 504 } | 503 } |
| 505 | 504 |
| 506 | 505 |
| 507 // Get non-bitsets from type, bounded by upper. | 506 // Get non-bitsets from type, bounded by upper. |
| 508 // Store at result starting at index. Returns updated index. | 507 // Store at result starting at index. Returns updated index. |
| 509 template<class Config> | 508 template<class Config> |
| 510 int TypeImpl<Config>::ExtendUnion( | 509 int TypeImpl<Config>::ExtendUnion( |
| 511 UnionHandle result, int size, TypeHandle type, | 510 UnionHandle result, int size, TypeHandle type, |
| 512 TypeHandle other, bool is_intersect, Region* region) { | 511 TypeHandle other, bool is_intersect, Region* region) { |
| 513 int old_size = size; | |
| 514 if (type->IsUnion()) { | 512 if (type->IsUnion()) { |
| 515 UnionHandle unioned = handle(type->AsUnion()); | 513 UnionHandle unioned = handle(type->AsUnion()); |
| 516 for (int i = 0; i < unioned->Length(); ++i) { | 514 for (int i = 0; i < unioned->Length(); ++i) { |
| 517 TypeHandle type_i = unioned->Get(i); | 515 TypeHandle type_i = unioned->Get(i); |
| 518 DCHECK(i == 0 || !(type_i->IsBitset() || type_i->Is(unioned->Get(0)))); | 516 DCHECK(i == 0 || !(type_i->IsBitset() || type_i->Is(unioned->Get(0)))); |
| 519 if (!type_i->IsBitset()) { | 517 if (!type_i->IsBitset()) { |
| 520 size = ExtendUnion(result, size, type_i, other, is_intersect, region); | 518 size = ExtendUnion(result, size, type_i, other, is_intersect, region); |
| 521 } | 519 } |
| 522 } | 520 } |
| 523 } else if (!type->IsBitset()) { | 521 } else if (!type->IsBitset()) { |
| 524 DCHECK(type->IsClass() || type->IsConstant() || | 522 DCHECK(type->IsClass() || type->IsConstant() || |
| 525 type->IsArray() || type->IsFunction() || type->IsContext()); | 523 type->IsArray() || type->IsFunction() || type->IsContext()); |
| 526 int inherent_bound = type->InherentBitsetLub(); | 524 int inherent_bound = type->InherentBitsetLub(); |
| 527 int old_bound = type->BitsetLub(); | 525 int old_bound = type->BitsetLub(); |
| 528 int other_bound = type->BoundBy(other->unhandle()) & inherent_bound; | 526 int other_bound = type->BoundBy(other->unhandle()) & inherent_bound; |
| 529 int new_bound = | 527 int new_bound = |
| 530 is_intersect ? (old_bound & other_bound) : (old_bound | other_bound); | 528 is_intersect ? (old_bound & other_bound) : (old_bound | other_bound); |
| 531 if (new_bound != BitsetType::kNone) { | 529 if (new_bound != BitsetType::kNone) { |
| 532 int i = type->IndexInUnion(new_bound, result, old_size); | 530 int i = type->IndexInUnion(new_bound, result, size); |
| 533 if (i == -1) { | 531 if (i == -1) { |
| 534 i = size++; | 532 i = size++; |
| 535 } else if (result->Get(i)->IsBitset()) { | 533 } else if (result->Get(i)->IsBitset()) { |
| 536 return size; // Already fully subsumed. | 534 return size; // Already fully subsumed. |
| 537 } else { | 535 } else { |
| 538 int type_i_bound = result->Get(i)->BitsetLub(); | 536 int type_i_bound = result->Get(i)->BitsetLub(); |
| 539 new_bound |= type_i_bound; | 537 new_bound |= type_i_bound; |
| 540 if (new_bound == type_i_bound) return size; | 538 if (new_bound == type_i_bound) return size; |
| 541 } | 539 } |
| 542 if (new_bound != old_bound) type = type->Rebound(new_bound, region); | 540 if (new_bound != old_bound) type = type->Rebound(new_bound, region); |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 | 879 |
| 882 | 880 |
| 883 template <class Config> | 881 template <class Config> |
| 884 void TypeImpl<Config>::PrintTo(OStream& os, PrintDimension dim) { // NOLINT | 882 void TypeImpl<Config>::PrintTo(OStream& os, PrintDimension dim) { // NOLINT |
| 885 DisallowHeapAllocation no_allocation; | 883 DisallowHeapAllocation no_allocation; |
| 886 if (dim != REPRESENTATION_DIM) { | 884 if (dim != REPRESENTATION_DIM) { |
| 887 if (this->IsBitset()) { | 885 if (this->IsBitset()) { |
| 888 BitsetType::Print(os, SEMANTIC(this->AsBitset())); | 886 BitsetType::Print(os, SEMANTIC(this->AsBitset())); |
| 889 } else if (this->IsClass()) { | 887 } else if (this->IsClass()) { |
| 890 os << "Class(" << static_cast<void*>(*this->AsClass()->Map()) << " < "; | 888 os << "Class(" << static_cast<void*>(*this->AsClass()->Map()) << " < "; |
| 891 return BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); | 889 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); |
| 892 os << ")"; | 890 os << ")"; |
| 893 } else if (this->IsConstant()) { | 891 } else if (this->IsConstant()) { |
| 894 os << "Constant(" << static_cast<void*>(*this->AsConstant()->Value()) | 892 os << "Constant(" << static_cast<void*>(*this->AsConstant()->Value()) |
| 895 << " : "; | 893 << " : "; |
| 896 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); | 894 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); |
| 897 os << ")"; | 895 os << ")"; |
| 898 } else if (this->IsRange()) { | 896 } else if (this->IsRange()) { |
| 899 os << "Range(" << this->AsRange()->Min() | 897 os << "Range(" << this->AsRange()->Min() |
| 900 << ".." << this->AsRange()->Max() << " : "; | 898 << ".." << this->AsRange()->Max() << " : "; |
| 901 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); | 899 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; | 950 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; |
| 953 | 951 |
| 954 template TypeImpl<ZoneTypeConfig>::TypeHandle | 952 template TypeImpl<ZoneTypeConfig>::TypeHandle |
| 955 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( | 953 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( |
| 956 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); | 954 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); |
| 957 template TypeImpl<HeapTypeConfig>::TypeHandle | 955 template TypeImpl<HeapTypeConfig>::TypeHandle |
| 958 TypeImpl<HeapTypeConfig>::Convert<Type>( | 956 TypeImpl<HeapTypeConfig>::Convert<Type>( |
| 959 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); | 957 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); |
| 960 | 958 |
| 961 } } // namespace v8::internal | 959 } } // namespace v8::internal |
| OLD | NEW |