1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/types.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h" 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/types-inl.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// NOTE: If code is marked as being a "shortcut", this means that removing 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// the code won't affect the semantics of the surrounding function definition. 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Range-related helper functions. 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The result may be invalid (max < min). 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::Limits TypeImpl<Config>::Intersect( 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Limits lhs, Limits rhs) { 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Limits result(lhs); 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs.min->Number() < rhs.min->Number()) result.min = rhs.min; 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs.max->Number() > rhs.max->Number()) result.max = rhs.max; 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::Limits TypeImpl<Config>::Union( 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Limits lhs, Limits rhs) { 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Limits result(lhs); 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs.min->Number() > rhs.min->Number()) result.min = rhs.min; 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs.max->Number() < rhs.max->Number()) result.max = rhs.max; 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::Overlap( 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename TypeImpl<Config>::RangeType* lhs, 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename TypeImpl<Config>::RangeType* rhs) { 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename TypeImpl<Config>::Limits lim = Intersect(Limits(lhs), Limits(rhs)); 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return lim.min->Number() <= lim.max->Number(); 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::Contains( 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename TypeImpl<Config>::RangeType* lhs, 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename TypeImpl<Config>::RangeType* rhs) { 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return lhs->Min()->Number() <= rhs->Min()->Number() 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && rhs->Max()->Number() <= lhs->Max()->Number(); 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::Contains( 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename TypeImpl<Config>::RangeType* range, i::Object* val) { 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsInteger(val) 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && range->Min()->Number() <= val->Number() 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && val->Number() <= range->Max()->Number(); 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Min and Max computation. 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble TypeImpl<Config>::Min() { 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this->Is(Number())); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsBitset()) return BitsetType::Min(this->AsBitset()); 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsUnion()) { 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double min = +V8_INFINITY; 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < this->AsUnion()->Length(); ++i) { 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch min = std::min(min, this->AsUnion()->Get(i)->Min()); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return min; 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsRange()) return this->AsRange()->Min()->Number(); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsConstant()) return this->AsConstant()->Value()->Number(); 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble TypeImpl<Config>::Max() { 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this->Is(Number())); 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsBitset()) return BitsetType::Max(this->AsBitset()); 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsUnion()) { 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double max = -V8_INFINITY; 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < this->AsUnion()->Length(); ++i) { 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch max = std::max(max, this->AsUnion()->Get(i)->Max()); 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return max; 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsRange()) return this->AsRange()->Max()->Number(); 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsConstant()) return this->AsConstant()->Value()->Number(); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Glb and lub computation. 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The largest bitset subsumed by this type. 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Glb(TypeImpl* type) { 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsBitset()) { 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return type->AsBitset(); 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsUnion()) { 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SLOW_DCHECK(type->AsUnion()->Wellformed()); 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return type->AsUnion()->Get(0)->BitsetGlb(); // Shortcut. 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (The remaining BitsetGlb's are None anyway). 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kNone; 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The smallest bitset subsuming this type. 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Lub(TypeImpl* type) { 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsBitset()) return type->AsBitset(); 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsUnion()) { 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int bitset = kNone; 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < type->AsUnion()->Length(); ++i) { 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bitset |= type->AsUnion()->Get(i)->BitsetLub(); 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return bitset; 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsClass()) { 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Little hack to avoid the need for a region for handlification here... 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Config::is_class(type) ? Lub(*Config::as_class(type)) : 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type->AsClass()->Bound(NULL)->AsBitset(); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsRange()) return type->AsRange()->BitsetLub(); 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsContext()) return kInternal & kTaggedPtr; 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsArray()) return kArray; 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsFunction()) return kFunction; 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kNone; 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Lub(i::Map* map) { 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (map->instance_type()) { 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case STRING_TYPE: 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case ONE_BYTE_STRING_TYPE: 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case CONS_STRING_TYPE: 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case CONS_ONE_BYTE_STRING_TYPE: 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SLICED_STRING_TYPE: 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SLICED_ONE_BYTE_STRING_TYPE: 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_STRING_TYPE: 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_ONE_BYTE_STRING_TYPE: 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_STRING_TYPE: 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE: 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kOtherString; 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case INTERNALIZED_STRING_TYPE: 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case ONE_BYTE_INTERNALIZED_STRING_TYPE: 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_INTERNALIZED_STRING_TYPE: 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE: 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE: 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE: 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE: 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE: 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kInternalizedString; 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SYMBOL_TYPE: 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kSymbol; 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case ODDBALL_TYPE: { 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Heap* heap = map->GetHeap(); 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (map == heap->undefined_map()) return kUndefined; 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (map == heap->null_map()) return kNull; 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (map == heap->boolean_map()) return kBoolean; 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(map == heap->the_hole_map() || 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map == heap->uninitialized_map() || 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map == heap->no_interceptor_result_sentinel_map() || 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map == heap->termination_exception_map() || 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map == heap->arguments_marker_map()); 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kInternal & kTaggedPtr; 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case HEAP_NUMBER_TYPE: 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kNumber & kTaggedPtr; 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_VALUE_TYPE: 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_DATE_TYPE: 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_OBJECT_TYPE: 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_GENERATOR_OBJECT_TYPE: 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_MODULE_TYPE: 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_GLOBAL_OBJECT_TYPE: 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_BUILTINS_OBJECT_TYPE: 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_GLOBAL_PROXY_TYPE: 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_ARRAY_BUFFER_TYPE: 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_TYPED_ARRAY_TYPE: 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_DATA_VIEW_TYPE: 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_SET_TYPE: 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_MAP_TYPE: 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_SET_ITERATOR_TYPE: 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_MAP_ITERATOR_TYPE: 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_WEAK_MAP_TYPE: 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_WEAK_SET_TYPE: 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (map->is_undetectable()) return kUndetectable; 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kOtherObject; 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_ARRAY_TYPE: 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kArray; 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_FUNCTION_TYPE: 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kFunction; 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_REGEXP_TYPE: 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kRegExp; 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_PROXY_TYPE: 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case JS_FUNCTION_PROXY_TYPE: 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kProxy; 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case MAP_TYPE: 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // When compiling stub templates, the meta map is used as a place holder 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // for the actual map with which the template is later instantiated. 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We treat it as a kind of type variable whose upper bound is Any. 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(rossberg): for caching of CompareNilIC stubs to work correctly, 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // we must exclude Undetectable here. This makes no sense, really, 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // because it means that the template isn't actually parametric. 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Also, it doesn't apply elsewhere. 8-( 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We ought to find a cleaner solution for compiling stubs parameterised 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // over type or class variables, esp ones with bounds... 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kDetectable; 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case DECLARED_ACCESSOR_INFO_TYPE: 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXECUTABLE_ACCESSOR_INFO_TYPE: 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHARED_FUNCTION_INFO_TYPE: 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case ACCESSOR_PAIR_TYPE: 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case FIXED_ARRAY_TYPE: 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case FOREIGN_TYPE: 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case CODE_TYPE: 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kInternal & kTaggedPtr; 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kNone; 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Lub(i::Object* value) { 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsNumber()) { 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Lub(value->Number()) & (value->IsSmi() ? kTaggedInt : kTaggedPtr); 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Lub(i::HeapObject::cast(value)->map()); 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Lub(double value) { 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i::IsMinusZero(value)) return kMinusZero; 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (std::isnan(value)) return kNaN; 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsUint32Double(value)) return Lub(FastD2UI(value)); 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsInt32Double(value)) return Lub(FastD2I(value)); 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kOtherNumber; 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Lub(int32_t value) { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value >= 0x40000000) { 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return i::SmiValuesAre31Bits() ? kOtherUnsigned31 : kUnsignedSmall; 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value >= 0) return kUnsignedSmall; 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value >= -0x40000000) return kOtherSignedSmall; 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return i::SmiValuesAre31Bits() ? kOtherSigned32 : kOtherSignedSmall; 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Lub(uint32_t value) { 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value >= 0x80000000u) return kOtherUnsigned32; 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value >= 0x40000000u) { 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return i::SmiValuesAre31Bits() ? kOtherUnsigned31 : kUnsignedSmall; 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kUnsignedSmall; 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Minimum values of regular numeric bitsets when SmiValuesAre31Bits. 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst typename TypeImpl<Config>::BitsetType::BitsetMin 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::BitsetMins31[] = { 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherNumber, -V8_INFINITY}, 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherSigned32, kMinInt}, 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherSignedSmall, -0x40000000}, 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kUnsignedSmall, 0}, 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherUnsigned31, 0x40000000}, 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherUnsigned32, 0x80000000}, 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherNumber, static_cast<double>(kMaxUInt32) + 1} 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Minimum values of regular numeric bitsets when SmiValuesAre32Bits. 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OtherSigned32 and OtherUnsigned31 are empty (see the diagrams in types.h). 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst typename TypeImpl<Config>::BitsetType::BitsetMin 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::BitsetMins32[] = { 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherNumber, -V8_INFINITY}, 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherSignedSmall, kMinInt}, 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kUnsignedSmall, 0}, 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherUnsigned32, 0x80000000}, 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {kOtherNumber, static_cast<double>(kMaxUInt32) + 1} 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::bitset 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::BitsetType::Lub(Limits lim) { 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double min = lim.min->Number(); 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double max = lim.max->Number(); 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int lub = kNone; 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BitsetMin* mins = BitsetMins(); 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 1; i < BitsetMinsSize(); ++i) { 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (min < mins[i].min) { 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch lub |= mins[i-1].bits; 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (max < mins[i].min) return lub; 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return lub |= mins[BitsetMinsSize()-1].bits; 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble TypeImpl<Config>::BitsetType::Min(bitset bits) { 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Is(bits, kNumber)); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BitsetMin* mins = BitsetMins(); 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool mz = SEMANTIC(bits & kMinusZero); 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = 0; i < BitsetMinsSize(); ++i) { 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (Is(SEMANTIC(mins[i].bits), bits)) { 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return mz ? std::min(0.0, mins[i].min) : mins[i].min; 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mz) return 0; 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return base::OS::nan_value(); 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble TypeImpl<Config>::BitsetType::Max(bitset bits) { 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Is(bits, kNumber)); 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const BitsetMin* mins = BitsetMins(); 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool mz = bits & kMinusZero; 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (BitsetType::Is(mins[BitsetMinsSize()-1].bits, bits)) { 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return +V8_INFINITY; 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (size_t i = BitsetMinsSize()-1; i-- > 0; ) { 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (Is(SEMANTIC(mins[i].bits), bits)) { 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return mz ? 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::max(0.0, mins[i+1].min - 1) : mins[i+1].min - 1; 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mz) return 0; 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return base::OS::nan_value(); 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Predicates. 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::SimplyEquals(TypeImpl* that) { 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsClass()) { 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return that->IsClass() 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && *this->AsClass()->Map() == *that->AsClass()->Map(); 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsConstant()) { 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return that->IsConstant() 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && *this->AsConstant()->Value() == *that->AsConstant()->Value(); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsContext()) { 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return that->IsContext() 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && this->AsContext()->Outer()->Equals(that->AsContext()->Outer()); 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsArray()) { 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return that->IsArray() 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && this->AsArray()->Element()->Equals(that->AsArray()->Element()); 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsFunction()) { 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!that->IsFunction()) return false; 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionType* this_fun = this->AsFunction(); 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionType* that_fun = that->AsFunction(); 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this_fun->Arity() != that_fun->Arity() || 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !this_fun->Result()->Equals(that_fun->Result()) || 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !this_fun->Receiver()->Equals(that_fun->Receiver())) { 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < this_fun->Arity(); ++i) { 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!this_fun->Parameter(i)->Equals(that_fun->Parameter(i))) return false; 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Check if [this] <= [that]. 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::SlowIs(TypeImpl* that) { 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that->IsBitset()) { 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BitsetType::Is(this->BitsetLub(), that->AsBitset()); 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsBitset()) { 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BitsetType::Is(this->AsBitset(), that->BitsetGlb()); 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (T1 \/ ... \/ Tn) <= T if (T1 <= T) /\ ... /\ (Tn <= T) 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsUnion()) { 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned = handle(this->AsUnion()); 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < unioned->Length(); ++i) { 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!unioned->Get(i)->Is(that)) return false; 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // T <= (T1 \/ ... \/ Tn) if (T <= T1) \/ ... \/ (T <= Tn) 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that->IsUnion()) { 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < that->AsUnion()->Length(); ++i) { 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->Is(that->AsUnion()->Get(i))) return true; 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i > 1 && this->IsRange()) return false; // Shortcut. 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that->IsRange()) { 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (this->IsRange() && Contains(that->AsRange(), this->AsRange())) 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch || (this->IsConstant() && 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Contains(that->AsRange(), *this->AsConstant()->Value())); 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsRange()) return false; 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this->SimplyEquals(that); 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::NowIs(TypeImpl* that) { 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(rossberg): this is incorrect for 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Union(Constant(V), T)->NowIs(Class(M)) 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // but fuzzing does not cover that! 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsConstant()) { 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch i::Object* object = *this->AsConstant()->Value(); 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (object->IsHeapObject()) { 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch i::Map* map = i::HeapObject::cast(object)->map(); 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (Iterator<i::Map> it = that->Classes(); !it.Done(); it.Advance()) { 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*it.Current() == map) return true; 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this->Is(that); 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Check if [this] contains only (currently) stable classes. 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::NowStable() { 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (Iterator<i::Map> it = this->Classes(); !it.Done(); it.Advance()) { 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!it.Current()->is_stable()) return false; 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Check if [this] and [that] overlap. 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::Maybe(TypeImpl* that) { 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (T1 \/ ... \/ Tn) overlaps T if (T1 overlaps T) \/ ... \/ (Tn overlaps T) 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsUnion()) { 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned = handle(this->AsUnion()); 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < unioned->Length(); ++i) { 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (unioned->Get(i)->Maybe(that)) return true; 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // T overlaps (T1 \/ ... \/ Tn) if (T overlaps T1) \/ ... \/ (T overlaps Tn) 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that->IsUnion()) { 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < that->AsUnion()->Length(); ++i) { 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->Maybe(that->AsUnion()->Get(i))) return true; 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!BitsetType::IsInhabited(this->BitsetLub() & that->BitsetLub())) 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsBitset() || that->IsBitset()) return true; 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsClass() != that->IsClass()) return true; 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsRange()) { 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that->IsConstant()) { 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Contains(this->AsRange(), *that->AsConstant()->Value()); 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return that->IsRange() && Overlap(this->AsRange(), that->AsRange()); 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (that->IsRange()) { 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsConstant()) { 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Contains(that->AsRange(), *this->AsConstant()->Value()); 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this->IsRange() && Overlap(this->AsRange(), that->AsRange()); 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this->SimplyEquals(that); 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Return the range in [this], or [NULL]. 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::RangeType* TypeImpl<Config>::GetRange() { 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsRange()) return this->AsRange(); 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsUnion() && this->AsUnion()->Get(1)->IsRange()) { 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this->AsUnion()->Get(1)->AsRange(); 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::Contains(i::Object* value) { 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (Iterator<i::Object> it = this->Constants(); !it.Done(); it.Advance()) { 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*it.Current() == value) return true; 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsInteger(value)) { 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeType* range = this->GetRange(); 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (range != NULL && Contains(range, value)) return true; 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BitsetType::New(BitsetType::Lub(value))->Is(this); 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::UnionType::Wellformed() { 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This checks the invariants of the union representation: 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 1. There are at least two elements. 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 2. At most one element is a bitset, and it must be the first one. 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 3. At most one element is a range, and it must be the second one 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (even when the first element is not a bitset). 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 4. No element is itself a union. 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 5. No element is a subtype of any other. 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this->Length() >= 2); // (1) 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < this->Length(); ++i) { 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i != 0) DCHECK(!this->Get(i)->IsBitset()); // (2) 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i != 1) DCHECK(!this->Get(i)->IsRange()); // (3) 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!this->Get(i)->IsUnion()); // (4) 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int j = 0; j < this->Length(); ++j) { 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i != j) DCHECK(!this->Get(i)->Is(this->Get(j))); // (5) 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Union and intersection 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic bool AddIsSafe(int x, int y) { 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return x >= 0 ? 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch y <= std::numeric_limits<int>::max() - x : 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch y >= std::numeric_limits<int>::min() - x; 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Intersect( 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle type1, TypeHandle type2, Region* region) { 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bitset bits = type1->BitsetGlb() & type2->BitsetGlb(); 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!BitsetType::IsInhabited(bits)) bits = BitsetType::kNone; 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast case: bit sets. 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type1->IsBitset() && type2->IsBitset()) { 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BitsetType::New(bits, region); 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast case: top or bottom types. 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type1->IsNone() || type2->IsAny()) return type1; // Shortcut. 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type2->IsNone() || type1->IsAny()) return type2; // Shortcut. 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Semi-fast case. 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type1->Is(type2)) return type1; 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type2->Is(type1)) return type2; 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Slow case: create union. 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!AddIsSafe(size1, size2)) return Any(region); 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size = size1 + size2; 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!AddIsSafe(size, 2)) return Any(region); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size += 2; 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle result = UnionType::New(size, region); 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = 0; 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Deal with bitsets. 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->Set(size++, BitsetType::New(bits, region)); 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Deal with ranges. 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle range = None(region); 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeType* range1 = type1->GetRange(); 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeType* range2 = type2->GetRange(); 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (range1 != NULL && range2 != NULL) { 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Limits lim = Intersect(Limits(range1), Limits(range2)); 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lim.min->Number() <= lim.max->Number()) { 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch range = RangeType::New(lim, region); 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->Set(size++, range); 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = IntersectAux(type1, type2, result, size, region); 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NormalizeUnion(result, size); 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeImpl<Config>::UpdateRange( 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeHandle range, UnionHandle result, int size, Region* region) { 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle old_range = result->Get(1); 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(old_range->IsRange() || old_range->IsNone()); 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (range->Is(old_range)) return size; 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!old_range->Is(range->unhandle())) { 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch range = RangeType::New( 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Union(Limits(range->AsRange()), Limits(old_range->AsRange())), region); 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->Set(1, range); 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Remove any components that just got subsumed. 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 2; i < size; ) { 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result->Get(i)->Is(range->unhandle())) { 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->Set(i, result->Get(--size)); 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ++i; 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeImpl<Config>::IntersectAux( 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle lhs, TypeHandle rhs, 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle result, int size, Region* region) { 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs->IsUnion()) { 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < lhs->AsUnion()->Length(); ++i) { 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = IntersectAux(lhs->AsUnion()->Get(i), rhs, result, size, region); 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rhs->IsUnion()) { 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < rhs->AsUnion()->Length(); ++i) { 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = IntersectAux(lhs, rhs->AsUnion()->Get(i), result, size, region); 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!BitsetType::IsInhabited(lhs->BitsetLub() & rhs->BitsetLub())) { 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs->IsRange()) { 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rhs->IsBitset() || rhs->IsClass()) { 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return UpdateRange( 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Config::template cast<RangeType>(lhs), result, size, region); 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rhs->IsConstant() && 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Contains(lhs->AsRange(), *rhs->AsConstant()->Value())) { 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AddToUnion(rhs, result, size, region); 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rhs->IsRange()) { 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs->IsBitset() || lhs->IsClass()) { 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return UpdateRange( 716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Config::template cast<RangeType>(rhs), result, size, region); 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs->IsConstant() && 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Contains(rhs->AsRange(), *lhs->AsConstant()->Value())) { 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AddToUnion(lhs, result, size, region); 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs->IsBitset() || rhs->IsBitset()) { 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AddToUnion(lhs->IsBitset() ? rhs : lhs, result, size, region); 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs->IsClass() != rhs->IsClass()) { 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AddToUnion(lhs->IsClass() ? rhs : lhs, result, size, region); 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (lhs->SimplyEquals(rhs->unhandle())) { 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AddToUnion(lhs, result, size, region); 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Union( 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle type1, TypeHandle type2, Region* region) { 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast case: bit sets. 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type1->IsBitset() && type2->IsBitset()) { 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BitsetType::New(type1->AsBitset() | type2->AsBitset(), region); 745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fast case: top or bottom types. 748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type1->IsAny() || type2->IsNone()) return type1; 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type2->IsAny() || type1->IsNone()) return type2; 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Semi-fast case. 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type1->Is(type2)) return type2; 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type2->Is(type1)) return type1; 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Slow case: create union. 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!AddIsSafe(size1, size2)) return Any(region); 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size = size1 + size2; 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!AddIsSafe(size, 2)) return Any(region); 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size += 2; 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle result = UnionType::New(size, region); 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = 0; 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Deal with bitsets. 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle bits = BitsetType::New( 767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type1->BitsetGlb() | type2->BitsetGlb(), region); 768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->Set(size++, bits); 769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Deal with ranges. 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle range = None(region); 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeType* range1 = type1->GetRange(); 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeType* range2 = type2->GetRange(); 774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (range1 != NULL && range2 != NULL) { 775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch range = RangeType::New(Union(Limits(range1), Limits(range2)), region); 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (range1 != NULL) { 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch range = handle(range1); 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (range2 != NULL) { 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch range = handle(range2); 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->Set(size++, range); 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = AddToUnion(type1, result, size, region); 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = AddToUnion(type2, result, size, region); 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NormalizeUnion(result, size); 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Add [type] to [result] unless [type] is bitset, range, or already subsumed. 790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Return new size of [result]. 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeImpl<Config>::AddToUnion( 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle type, UnionHandle result, int size, Region* region) { 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsBitset() || type->IsRange()) return size; 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsUnion()) { 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < type->AsUnion()->Length(); ++i) { 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size = AddToUnion(type->AsUnion()->Get(i), result, size, region); 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < size; ++i) { 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->Is(result->Get(i))) return size; 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->Set(size++, type); 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return size; 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::TypeHandle TypeImpl<Config>::NormalizeUnion( 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned, int size) { 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(size >= 2); 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If range is subsumed by bitset, use its place for a different type. 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (unioned->Get(1)->Is(unioned->Get(0))) { 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unioned->Set(1, unioned->Get(--size)); 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If bitset is None, use its place for a different type. 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (size >= 2 && unioned->Get(0)->IsNone()) { 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unioned->Set(0, unioned->Get(--size)); 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (size == 1) return unioned->Get(0); 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unioned->Shrink(size); 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SLOW_DCHECK(unioned->Wellformed()); 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return unioned; 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Iteration. 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeImpl<Config>::NumClasses() { 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsClass()) { 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 1; 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsUnion()) { 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned = handle(this->AsUnion()); 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int result = 0; 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < unioned->Length(); ++i) { 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (unioned->Get(i)->IsClass()) ++result; 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeImpl<Config>::NumConstants() { 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsConstant()) { 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 1; 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsUnion()) { 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned = handle(this->AsUnion()); 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int result = 0; 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < unioned->Length(); ++i) { 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (unioned->Get(i)->IsConstant()) ++result; 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> template<class T> 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::TypeHandle 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTypeImpl<Config>::Iterator<T>::get_type() { 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!Done()); 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return type_->IsUnion() ? type_->AsUnion()->Get(index_) : type_; 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// C++ cannot specialise nested templates, so we have to go through this 876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// contortion with an auxiliary template to simulate it. 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config, class T> 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct TypeImplIteratorAux { 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool matches(typename TypeImpl<Config>::TypeHandle type); 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static i::Handle<T> current(typename TypeImpl<Config>::TypeHandle type); 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct TypeImplIteratorAux<Config, i::Map> { 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool matches(typename TypeImpl<Config>::TypeHandle type) { 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return type->IsClass(); 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static i::Handle<i::Map> current(typename TypeImpl<Config>::TypeHandle type) { 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return type->AsClass()->Map(); 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct TypeImplIteratorAux<Config, i::Object> { 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool matches(typename TypeImpl<Config>::TypeHandle type) { 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return type->IsConstant(); 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static i::Handle<i::Object> current( 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename TypeImpl<Config>::TypeHandle type) { 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return type->AsConstant()->Value(); 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> template<class T> 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeImpl<Config>::Iterator<T>::matches(TypeHandle type) { 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return TypeImplIteratorAux<Config, T>::matches(type); 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> template<class T> 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochi::Handle<T> TypeImpl<Config>::Iterator<T>::Current() { 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return TypeImplIteratorAux<Config, T>::current(get_type()); 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> template<class T> 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeImpl<Config>::Iterator<T>::Advance() { 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ++index_; 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type_->IsUnion()) { 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned = Config::template cast<UnionType>(type_); 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (; index_ < unioned->Length(); ++index_) { 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (matches(unioned->Get(index_))) return; 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (index_ == 0 && matches(type_)) { 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index_ = -1; 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Conversion between low-level representations. 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class OtherType> 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Convert( 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typename OtherType::TypeHandle type, Region* region) { 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type->IsBitset()) { 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BitsetType::New(type->AsBitset(), region); 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsClass()) { 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ClassType::New(type->AsClass()->Map(), region); 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsConstant()) { 943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ConstantType::New(type->AsConstant()->Value(), region); 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsRange()) { 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RangeType::New( 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type->AsRange()->Min(), type->AsRange()->Max(), region); 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsContext()) { 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle outer = Convert<OtherType>(type->AsContext()->Outer(), region); 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ContextType::New(outer, region); 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsUnion()) { 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = type->AsUnion()->Length(); 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned = UnionType::New(length, region); 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < length; ++i) { 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle t = Convert<OtherType>(type->AsUnion()->Get(i), region); 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unioned->Set(i, t); 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return unioned; 958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsArray()) { 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle element = Convert<OtherType>(type->AsArray()->Element(), region); 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ArrayType::New(element, region); 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (type->IsFunction()) { 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle res = Convert<OtherType>(type->AsFunction()->Result(), region); 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle rcv = Convert<OtherType>(type->AsFunction()->Receiver(), region); 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionHandle function = FunctionType::New( 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch res, rcv, type->AsFunction()->Arity(), region); 966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < function->Arity(); ++i) { 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle param = Convert<OtherType>( 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type->AsFunction()->Parameter(i), region); 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function->InitParameter(i, param); 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return function; 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return None(region); 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Printing. 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Config> 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst char* TypeImpl<Config>::BitsetType::Name(bitset bits) { 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (bits) { 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case REPRESENTATION(kAny): return "Any"; 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #define RETURN_NAMED_REPRESENTATION_TYPE(type, value) \ 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case REPRESENTATION(k##type): return #type; 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch REPRESENTATION_BITSET_TYPE_LIST(RETURN_NAMED_REPRESENTATION_TYPE) 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #undef RETURN_NAMED_REPRESENTATION_TYPE 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #define RETURN_NAMED_SEMANTIC_TYPE(type, value) \ 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SEMANTIC(k##type): return #type; 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SEMANTIC_BITSET_TYPE_LIST(RETURN_NAMED_SEMANTIC_TYPE) 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #undef RETURN_NAMED_SEMANTIC_TYPE 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Config> 1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeImpl<Config>::BitsetType::Print(OStream& os, // NOLINT 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bitset bits) { 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* name = Name(bits); 1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (name != NULL) { 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << name; 1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bitset named_bitsets[] = { 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define BITSET_CONSTANT(type, value) REPRESENTATION(k##type), 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch REPRESENTATION_BITSET_TYPE_LIST(BITSET_CONSTANT) 1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef BITSET_CONSTANT 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define BITSET_CONSTANT(type, value) SEMANTIC(k##type), 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SEMANTIC_BITSET_TYPE_LIST(BITSET_CONSTANT) 1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef BITSET_CONSTANT 1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_first = true; 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "("; 1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i(arraysize(named_bitsets) - 1); bits != 0 && i >= 0; --i) { 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bitset subset = named_bitsets[i]; 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((bits & subset) == subset) { 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!is_first) os << " | "; 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_first = false; 1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << Name(subset); 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bits -= subset; 1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(bits == 0); 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ")"; 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Config> 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeImpl<Config>::PrintTo(OStream& os, PrintDimension dim) { // NOLINT 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (dim != REPRESENTATION_DIM) { 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->IsBitset()) { 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitsetType::Print(os, SEMANTIC(this->AsBitset())); 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsClass()) { 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "Class(" << static_cast<void*>(*this->AsClass()->Map()) << " < "; 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ")"; 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsConstant()) { 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "Constant(" << static_cast<void*>(*this->AsConstant()->Value()) 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch << ")"; 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsRange()) { 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "Range(" << this->AsRange()->Min()->Number() 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch << ", " << this->AsRange()->Max()->Number() << ")"; 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsContext()) { 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "Context("; 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->AsContext()->Outer()->PrintTo(os, dim); 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ")"; 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsUnion()) { 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "("; 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnionHandle unioned = handle(this->AsUnion()); 1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < unioned->Length(); ++i) { 1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeHandle type_i = unioned->Get(i); 1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i > 0) os << " | "; 1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type_i->PrintTo(os, dim); 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ")"; 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsArray()) { 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "Array("; 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AsArray()->Element()->PrintTo(os, dim); 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ")"; 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (this->IsFunction()) { 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!this->AsFunction()->Receiver()->IsAny()) { 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->AsFunction()->Receiver()->PrintTo(os, dim); 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "."; 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "("; 1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < this->AsFunction()->Arity(); ++i) { 1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (i > 0) os << ", "; 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->AsFunction()->Parameter(i)->PrintTo(os, dim); 1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ")->"; 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->AsFunction()->Result()->PrintTo(os, dim); 1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (dim == BOTH_DIMS) os << "/"; 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (dim != SEMANTIC_DIM) { 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitsetType::Print(os, REPRESENTATION(this->BitsetLub())); 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Config> 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeImpl<Config>::Print() { 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OFStream os(stdout); 1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintTo(os); 1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << endl; 1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Config> 1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeImpl<Config>::BitsetType::Print(bitset bits) { 1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OFStream os(stdout); 1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Print(os, bits); 1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << endl; 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Instantiations. 1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate class TypeImpl<ZoneTypeConfig>; 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate class TypeImpl<ZoneTypeConfig>::Iterator<i::Map>; 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate class TypeImpl<ZoneTypeConfig>::Iterator<i::Object>; 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate class TypeImpl<HeapTypeConfig>; 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate class TypeImpl<HeapTypeConfig>::Iterator<i::Map>; 1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; 1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate TypeImpl<ZoneTypeConfig>::TypeHandle 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeImpl<ZoneTypeConfig>::Convert<HeapType>( 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate TypeImpl<HeapTypeConfig>::TypeHandle 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeImpl<HeapTypeConfig>::Convert<Type>( 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} } // namespace v8::internal 1129