| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef V8_TYPES_INL_H_ | |
| 6 #define V8_TYPES_INL_H_ | |
| 7 | |
| 8 #include "src/types.h" | |
| 9 | |
| 10 #include "src/factory.h" | |
| 11 #include "src/handles-inl.h" | |
| 12 | |
| 13 namespace v8 { | |
| 14 namespace internal { | |
| 15 | |
| 16 // ----------------------------------------------------------------------------- | |
| 17 // TypeImpl | |
| 18 | |
| 19 template<class Config> | |
| 20 typename TypeImpl<Config>::bitset TypeImpl<Config>::BitsetType::SignedSmall() { | |
| 21 return i::SmiValuesAre31Bits() ? kSigned31 : kSigned32; | |
| 22 } | |
| 23 | |
| 24 | |
| 25 template<class Config> | |
| 26 typename TypeImpl<Config>::bitset | |
| 27 TypeImpl<Config>::BitsetType::UnsignedSmall() { | |
| 28 return i::SmiValuesAre31Bits() ? kUnsigned30 : kUnsigned31; | |
| 29 } | |
| 30 | |
| 31 | |
| 32 #define CONSTRUCT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \ | |
| 33 template<class Config> \ | |
| 34 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Name( \ | |
| 35 Isolate* isolate, Region* region) { \ | |
| 36 return Class(i::handle(isolate->heap()->name##_map()), region); \ | |
| 37 } | |
| 38 SIMD128_TYPES(CONSTRUCT_SIMD_TYPE) | |
| 39 #undef CONSTRUCT_SIMD_TYPE | |
| 40 | |
| 41 | |
| 42 template<class Config> | |
| 43 TypeImpl<Config>* TypeImpl<Config>::cast(typename Config::Base* object) { | |
| 44 TypeImpl* t = static_cast<TypeImpl*>(object); | |
| 45 DCHECK(t->IsBitset() || t->IsClass() || t->IsConstant() || t->IsRange() || | |
| 46 t->IsUnion() || t->IsArray() || t->IsFunction() || t->IsContext()); | |
| 47 return t; | |
| 48 } | |
| 49 | |
| 50 | |
| 51 // Most precise _current_ type of a value (usually its class). | |
| 52 template<class Config> | |
| 53 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::NowOf( | |
| 54 i::Object* value, Region* region) { | |
| 55 if (value->IsSmi() || | |
| 56 i::HeapObject::cast(value)->map()->instance_type() == HEAP_NUMBER_TYPE) { | |
| 57 return Of(value, region); | |
| 58 } | |
| 59 return Class(i::handle(i::HeapObject::cast(value)->map()), region); | |
| 60 } | |
| 61 | |
| 62 | |
| 63 template<class Config> | |
| 64 bool TypeImpl<Config>::NowContains(i::Object* value) { | |
| 65 DisallowHeapAllocation no_allocation; | |
| 66 if (this->IsAny()) return true; | |
| 67 if (value->IsHeapObject()) { | |
| 68 i::Map* map = i::HeapObject::cast(value)->map(); | |
| 69 for (Iterator<i::Map> it = this->Classes(); !it.Done(); it.Advance()) { | |
| 70 if (*it.Current() == map) return true; | |
| 71 } | |
| 72 } | |
| 73 return this->Contains(value); | |
| 74 } | |
| 75 | |
| 76 | |
| 77 // ----------------------------------------------------------------------------- | |
| 78 // ZoneTypeConfig | |
| 79 | |
| 80 // static | |
| 81 template<class T> | |
| 82 T* ZoneTypeConfig::handle(T* type) { | |
| 83 return type; | |
| 84 } | |
| 85 | |
| 86 | |
| 87 // static | |
| 88 template<class T> | |
| 89 T* ZoneTypeConfig::cast(Type* type) { | |
| 90 return static_cast<T*>(type); | |
| 91 } | |
| 92 | |
| 93 | |
| 94 // static | |
| 95 bool ZoneTypeConfig::is_bitset(Type* type) { | |
| 96 return reinterpret_cast<uintptr_t>(type) & 1; | |
| 97 } | |
| 98 | |
| 99 | |
| 100 // static | |
| 101 bool ZoneTypeConfig::is_struct(Type* type, int tag) { | |
| 102 DCHECK(tag != kRangeStructTag); | |
| 103 if (is_bitset(type)) return false; | |
| 104 int type_tag = struct_tag(as_struct(type)); | |
| 105 return type_tag == tag; | |
| 106 } | |
| 107 | |
| 108 | |
| 109 // static | |
| 110 bool ZoneTypeConfig::is_range(Type* type) { | |
| 111 if (is_bitset(type)) return false; | |
| 112 int type_tag = struct_tag(as_struct(type)); | |
| 113 return type_tag == kRangeStructTag; | |
| 114 } | |
| 115 | |
| 116 | |
| 117 // static | |
| 118 bool ZoneTypeConfig::is_class(Type* type) { | |
| 119 return false; | |
| 120 } | |
| 121 | |
| 122 | |
| 123 // static | |
| 124 ZoneTypeConfig::Type::bitset ZoneTypeConfig::as_bitset(Type* type) { | |
| 125 DCHECK(is_bitset(type)); | |
| 126 return static_cast<Type::bitset>(reinterpret_cast<uintptr_t>(type) ^ 1u); | |
| 127 } | |
| 128 | |
| 129 | |
| 130 // static | |
| 131 ZoneTypeConfig::Struct* ZoneTypeConfig::as_struct(Type* type) { | |
| 132 DCHECK(!is_bitset(type)); | |
| 133 return reinterpret_cast<Struct*>(type); | |
| 134 } | |
| 135 | |
| 136 | |
| 137 // static | |
| 138 ZoneTypeConfig::Range* ZoneTypeConfig::as_range(Type* type) { | |
| 139 DCHECK(!is_bitset(type)); | |
| 140 return reinterpret_cast<Range*>(type); | |
| 141 } | |
| 142 | |
| 143 | |
| 144 // static | |
| 145 i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) { | |
| 146 UNREACHABLE(); | |
| 147 return i::Handle<i::Map>(); | |
| 148 } | |
| 149 | |
| 150 | |
| 151 // static | |
| 152 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(Type::bitset bitset) { | |
| 153 return reinterpret_cast<Type*>(static_cast<uintptr_t>(bitset | 1u)); | |
| 154 } | |
| 155 | |
| 156 | |
| 157 // static | |
| 158 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset( | |
| 159 Type::bitset bitset, Zone* Zone) { | |
| 160 return from_bitset(bitset); | |
| 161 } | |
| 162 | |
| 163 | |
| 164 // static | |
| 165 ZoneTypeConfig::Type* ZoneTypeConfig::from_struct(Struct* structure) { | |
| 166 return reinterpret_cast<Type*>(structure); | |
| 167 } | |
| 168 | |
| 169 | |
| 170 // static | |
| 171 ZoneTypeConfig::Type* ZoneTypeConfig::from_range(Range* range) { | |
| 172 return reinterpret_cast<Type*>(range); | |
| 173 } | |
| 174 | |
| 175 | |
| 176 // static | |
| 177 ZoneTypeConfig::Type* ZoneTypeConfig::from_class( | |
| 178 i::Handle<i::Map> map, Zone* zone) { | |
| 179 return from_bitset(0); | |
| 180 } | |
| 181 | |
| 182 | |
| 183 // static | |
| 184 ZoneTypeConfig::Struct* ZoneTypeConfig::struct_create( | |
| 185 int tag, int length, Zone* zone) { | |
| 186 DCHECK(tag != kRangeStructTag); | |
| 187 Struct* structure = reinterpret_cast<Struct*>( | |
| 188 zone->New(sizeof(void*) * (length + 2))); // NOLINT | |
| 189 structure[0] = reinterpret_cast<void*>(tag); | |
| 190 structure[1] = reinterpret_cast<void*>(length); | |
| 191 return structure; | |
| 192 } | |
| 193 | |
| 194 | |
| 195 // static | |
| 196 void ZoneTypeConfig::struct_shrink(Struct* structure, int length) { | |
| 197 DCHECK(0 <= length && length <= struct_length(structure)); | |
| 198 structure[1] = reinterpret_cast<void*>(length); | |
| 199 } | |
| 200 | |
| 201 | |
| 202 // static | |
| 203 int ZoneTypeConfig::struct_tag(Struct* structure) { | |
| 204 return static_cast<int>(reinterpret_cast<intptr_t>(structure[0])); | |
| 205 } | |
| 206 | |
| 207 | |
| 208 // static | |
| 209 int ZoneTypeConfig::struct_length(Struct* structure) { | |
| 210 return static_cast<int>(reinterpret_cast<intptr_t>(structure[1])); | |
| 211 } | |
| 212 | |
| 213 | |
| 214 // static | |
| 215 Type* ZoneTypeConfig::struct_get(Struct* structure, int i) { | |
| 216 DCHECK(0 <= i && i <= struct_length(structure)); | |
| 217 return static_cast<Type*>(structure[2 + i]); | |
| 218 } | |
| 219 | |
| 220 | |
| 221 // static | |
| 222 void ZoneTypeConfig::struct_set(Struct* structure, int i, Type* x) { | |
| 223 DCHECK(0 <= i && i <= struct_length(structure)); | |
| 224 structure[2 + i] = x; | |
| 225 } | |
| 226 | |
| 227 | |
| 228 // static | |
| 229 template<class V> | |
| 230 i::Handle<V> ZoneTypeConfig::struct_get_value(Struct* structure, int i) { | |
| 231 DCHECK(0 <= i && i <= struct_length(structure)); | |
| 232 return i::Handle<V>(static_cast<V**>(structure[2 + i])); | |
| 233 } | |
| 234 | |
| 235 | |
| 236 // static | |
| 237 template<class V> | |
| 238 void ZoneTypeConfig::struct_set_value( | |
| 239 Struct* structure, int i, i::Handle<V> x) { | |
| 240 DCHECK(0 <= i && i <= struct_length(structure)); | |
| 241 structure[2 + i] = x.location(); | |
| 242 } | |
| 243 | |
| 244 | |
| 245 // static | |
| 246 ZoneTypeConfig::Range* ZoneTypeConfig::range_create(Zone* zone) { | |
| 247 Range* range = reinterpret_cast<Range*>(zone->New(sizeof(Range))); // NOLINT | |
| 248 range->tag = reinterpret_cast<void*>(kRangeStructTag); | |
| 249 range->bitset = 0; | |
| 250 range->limits[0] = 1; | |
| 251 range->limits[1] = 0; | |
| 252 return range; | |
| 253 } | |
| 254 | |
| 255 | |
| 256 // static | |
| 257 int ZoneTypeConfig::range_get_bitset(ZoneTypeConfig::Range* range) { | |
| 258 return range->bitset; | |
| 259 } | |
| 260 | |
| 261 | |
| 262 // static | |
| 263 void ZoneTypeConfig::range_set_bitset(ZoneTypeConfig::Range* range, int value) { | |
| 264 range->bitset = value; | |
| 265 } | |
| 266 | |
| 267 | |
| 268 // static | |
| 269 double ZoneTypeConfig::range_get_double(ZoneTypeConfig::Range* range, | |
| 270 int index) { | |
| 271 DCHECK(index >= 0 && index < 2); | |
| 272 return range->limits[index]; | |
| 273 } | |
| 274 | |
| 275 | |
| 276 // static | |
| 277 void ZoneTypeConfig::range_set_double(ZoneTypeConfig::Range* range, int index, | |
| 278 double value, Zone*) { | |
| 279 DCHECK(index >= 0 && index < 2); | |
| 280 range->limits[index] = value; | |
| 281 } | |
| 282 | |
| 283 } // namespace internal | |
| 284 } // namespace v8 | |
| 285 | |
| 286 #endif // V8_TYPES_INL_H_ | |
| OLD | NEW |