OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 if (this->IsBitset()) { | 134 if (this->IsBitset()) { |
135 return this->AsBitset(); | 135 return this->AsBitset(); |
136 } else if (this->IsUnion()) { | 136 } else if (this->IsUnion()) { |
137 UnionedHandle unioned = this->AsUnion(); | 137 UnionedHandle unioned = this->AsUnion(); |
138 int bitset = kNone; | 138 int bitset = kNone; |
139 for (int i = 0; i < Config::union_length(unioned); ++i) { | 139 for (int i = 0; i < Config::union_length(unioned); ++i) { |
140 bitset |= Config::union_get(unioned, i)->LubBitset(); | 140 bitset |= Config::union_get(unioned, i)->LubBitset(); |
141 } | 141 } |
142 return bitset; | 142 return bitset; |
143 } else if (this->IsClass()) { | 143 } else if (this->IsClass()) { |
144 return LubBitset(*this->AsClass()); | 144 int bitset = Config::lub_bitset(this); |
| 145 return bitset ? bitset : LubBitset(*this->AsClass()); |
145 } else { | 146 } else { |
146 return LubBitset(*this->AsConstant()); | 147 int bitset = Config::lub_bitset(this); |
| 148 return bitset ? bitset : LubBitset(*this->AsConstant()); |
147 } | 149 } |
148 } | 150 } |
149 | 151 |
150 | 152 |
151 template<class Config> | 153 template<class Config> |
152 int TypeImpl<Config>::LubBitset(i::Object* value) { | 154 int TypeImpl<Config>::LubBitset(i::Object* value) { |
153 if (value->IsSmi()) return kSmi; | 155 if (value->IsSmi()) return kSmi; |
154 i::Map* map = i::HeapObject::cast(value)->map(); | 156 i::Map* map = i::HeapObject::cast(value)->map(); |
155 if (map->instance_type() == HEAP_NUMBER_TYPE) { | 157 if (map->instance_type() == HEAP_NUMBER_TYPE) { |
156 int32_t i; | 158 int32_t i; |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 } | 543 } |
542 | 544 |
543 | 545 |
544 template<class Config> | 546 template<class Config> |
545 template<class OtherType> | 547 template<class OtherType> |
546 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Convert( | 548 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Convert( |
547 typename OtherType::TypeHandle type, Region* region) { | 549 typename OtherType::TypeHandle type, Region* region) { |
548 if (type->IsBitset()) { | 550 if (type->IsBitset()) { |
549 return Config::from_bitset(type->AsBitset(), region); | 551 return Config::from_bitset(type->AsBitset(), region); |
550 } else if (type->IsClass()) { | 552 } else if (type->IsClass()) { |
551 return Config::from_class(type->AsClass(), region); | 553 return Config::from_class(type->AsClass(), type->LubBitset(), region); |
552 } else if (type->IsConstant()) { | 554 } else if (type->IsConstant()) { |
553 return Config::from_constant(type->AsConstant(), region); | 555 return Config::from_constant(type->AsConstant(), type->LubBitset(), region); |
554 } else { | 556 } else { |
555 ASSERT(type->IsUnion()); | 557 ASSERT(type->IsUnion()); |
556 typename OtherType::UnionedHandle unioned = type->AsUnion(); | 558 typename OtherType::UnionedHandle unioned = type->AsUnion(); |
557 int length = OtherType::UnionLength(unioned); | 559 int length = OtherType::UnionLength(unioned); |
558 UnionedHandle new_unioned = Config::union_create(length, region); | 560 UnionedHandle new_unioned = Config::union_create(length, region); |
559 for (int i = 0; i < length; ++i) { | 561 for (int i = 0; i < length; ++i) { |
560 Config::union_set(new_unioned, i, | 562 Config::union_set(new_unioned, i, |
561 Convert<OtherType>(OtherType::UnionGet(unioned, i), region)); | 563 Convert<OtherType>(OtherType::UnionGet(unioned, i), region)); |
562 } | 564 } |
563 return Config::from_union(new_unioned); | 565 return Config::from_union(new_unioned); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 | 649 |
648 template TypeImpl<ZoneTypeConfig>::TypeHandle | 650 template TypeImpl<ZoneTypeConfig>::TypeHandle |
649 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( | 651 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( |
650 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); | 652 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); |
651 template TypeImpl<HeapTypeConfig>::TypeHandle | 653 template TypeImpl<HeapTypeConfig>::TypeHandle |
652 TypeImpl<HeapTypeConfig>::Convert<Type>( | 654 TypeImpl<HeapTypeConfig>::Convert<Type>( |
653 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); | 655 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); |
654 | 656 |
655 | 657 |
656 } } // namespace v8::internal | 658 } } // namespace v8::internal |
OLD | NEW |