OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_TYPES_INL_H_ | 5 #ifndef V8_TYPES_INL_H_ |
6 #define V8_TYPES_INL_H_ | 6 #define V8_TYPES_INL_H_ |
7 | 7 |
8 #include "src/types.h" | 8 #include "src/types.h" |
9 | 9 |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 89 |
90 | 90 |
91 // static | 91 // static |
92 bool ZoneTypeConfig::is_bitset(Type* type) { | 92 bool ZoneTypeConfig::is_bitset(Type* type) { |
93 return reinterpret_cast<uintptr_t>(type) & 1; | 93 return reinterpret_cast<uintptr_t>(type) & 1; |
94 } | 94 } |
95 | 95 |
96 | 96 |
97 // static | 97 // static |
98 bool ZoneTypeConfig::is_struct(Type* type, int tag) { | 98 bool ZoneTypeConfig::is_struct(Type* type, int tag) { |
99 return !is_bitset(type) && struct_tag(as_struct(type)) == tag; | 99 DCHECK(tag != kRangeStructTag); |
| 100 if (is_bitset(type)) return false; |
| 101 int type_tag = struct_tag(as_struct(type)); |
| 102 return type_tag == tag; |
100 } | 103 } |
101 | 104 |
102 | 105 |
| 106 // static |
| 107 bool ZoneTypeConfig::is_range(Type* type) { |
| 108 if (is_bitset(type)) return false; |
| 109 int type_tag = struct_tag(as_struct(type)); |
| 110 return type_tag == kRangeStructTag; |
| 111 } |
| 112 |
| 113 |
103 // static | 114 // static |
104 bool ZoneTypeConfig::is_class(Type* type) { | 115 bool ZoneTypeConfig::is_class(Type* type) { |
105 return false; | 116 return false; |
106 } | 117 } |
107 | 118 |
108 | 119 |
109 // static | 120 // static |
110 ZoneTypeConfig::Type::bitset ZoneTypeConfig::as_bitset(Type* type) { | 121 ZoneTypeConfig::Type::bitset ZoneTypeConfig::as_bitset(Type* type) { |
111 DCHECK(is_bitset(type)); | 122 DCHECK(is_bitset(type)); |
112 return static_cast<Type::bitset>(reinterpret_cast<uintptr_t>(type) ^ 1u); | 123 return static_cast<Type::bitset>(reinterpret_cast<uintptr_t>(type) ^ 1u); |
113 } | 124 } |
114 | 125 |
115 | 126 |
116 // static | 127 // static |
117 ZoneTypeConfig::Struct* ZoneTypeConfig::as_struct(Type* type) { | 128 ZoneTypeConfig::Struct* ZoneTypeConfig::as_struct(Type* type) { |
118 DCHECK(!is_bitset(type)); | 129 DCHECK(!is_bitset(type)); |
119 return reinterpret_cast<Struct*>(type); | 130 return reinterpret_cast<Struct*>(type); |
120 } | 131 } |
121 | 132 |
122 | 133 |
123 // static | 134 // static |
| 135 ZoneTypeConfig::Range* ZoneTypeConfig::as_range(Type* type) { |
| 136 DCHECK(!is_bitset(type)); |
| 137 return reinterpret_cast<Range*>(type); |
| 138 } |
| 139 |
| 140 |
| 141 // static |
124 i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) { | 142 i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) { |
125 UNREACHABLE(); | 143 UNREACHABLE(); |
126 return i::Handle<i::Map>(); | 144 return i::Handle<i::Map>(); |
127 } | 145 } |
128 | 146 |
129 | 147 |
130 // static | 148 // static |
131 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(Type::bitset bitset) { | 149 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(Type::bitset bitset) { |
132 return reinterpret_cast<Type*>(static_cast<uintptr_t>(bitset | 1u)); | 150 return reinterpret_cast<Type*>(static_cast<uintptr_t>(bitset | 1u)); |
133 } | 151 } |
134 | 152 |
135 | 153 |
136 // static | 154 // static |
137 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset( | 155 ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset( |
138 Type::bitset bitset, Zone* Zone) { | 156 Type::bitset bitset, Zone* Zone) { |
139 return from_bitset(bitset); | 157 return from_bitset(bitset); |
140 } | 158 } |
141 | 159 |
142 | 160 |
143 // static | 161 // static |
144 ZoneTypeConfig::Type* ZoneTypeConfig::from_struct(Struct* structure) { | 162 ZoneTypeConfig::Type* ZoneTypeConfig::from_struct(Struct* structure) { |
145 return reinterpret_cast<Type*>(structure); | 163 return reinterpret_cast<Type*>(structure); |
146 } | 164 } |
147 | 165 |
148 | 166 |
149 // static | 167 // static |
| 168 ZoneTypeConfig::Type* ZoneTypeConfig::from_range(Range* range) { |
| 169 return reinterpret_cast<Type*>(range); |
| 170 } |
| 171 |
| 172 |
| 173 // static |
150 ZoneTypeConfig::Type* ZoneTypeConfig::from_class( | 174 ZoneTypeConfig::Type* ZoneTypeConfig::from_class( |
151 i::Handle<i::Map> map, Zone* zone) { | 175 i::Handle<i::Map> map, Zone* zone) { |
152 return from_bitset(0); | 176 return from_bitset(0); |
153 } | 177 } |
154 | 178 |
155 | 179 |
156 // static | 180 // static |
157 ZoneTypeConfig::Struct* ZoneTypeConfig::struct_create( | 181 ZoneTypeConfig::Struct* ZoneTypeConfig::struct_create( |
158 int tag, int length, Zone* zone) { | 182 int tag, int length, Zone* zone) { |
| 183 DCHECK(tag != kRangeStructTag); |
159 Struct* structure = reinterpret_cast<Struct*>( | 184 Struct* structure = reinterpret_cast<Struct*>( |
160 zone->New(sizeof(void*) * (length + 2))); // NOLINT | 185 zone->New(sizeof(void*) * (length + 2))); // NOLINT |
161 structure[0] = reinterpret_cast<void*>(tag); | 186 structure[0] = reinterpret_cast<void*>(tag); |
162 structure[1] = reinterpret_cast<void*>(length); | 187 structure[1] = reinterpret_cast<void*>(length); |
163 return structure; | 188 return structure; |
164 } | 189 } |
165 | 190 |
166 | 191 |
167 // static | 192 // static |
168 void ZoneTypeConfig::struct_shrink(Struct* structure, int length) { | 193 void ZoneTypeConfig::struct_shrink(Struct* structure, int length) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 | 232 |
208 // static | 233 // static |
209 template<class V> | 234 template<class V> |
210 void ZoneTypeConfig::struct_set_value( | 235 void ZoneTypeConfig::struct_set_value( |
211 Struct* structure, int i, i::Handle<V> x) { | 236 Struct* structure, int i, i::Handle<V> x) { |
212 DCHECK(0 <= i && i <= struct_length(structure)); | 237 DCHECK(0 <= i && i <= struct_length(structure)); |
213 structure[2 + i] = x.location(); | 238 structure[2 + i] = x.location(); |
214 } | 239 } |
215 | 240 |
216 | 241 |
| 242 // static |
| 243 ZoneTypeConfig::Range* ZoneTypeConfig::range_create(Zone* zone) { |
| 244 Range* range = reinterpret_cast<Range*>(zone->New(sizeof(Range))); // NOLINT |
| 245 range->tag = reinterpret_cast<void*>(kRangeStructTag); |
| 246 range->bitset = 0; |
| 247 range->limits[0] = 1; |
| 248 range->limits[1] = 0; |
| 249 return range; |
| 250 } |
| 251 |
| 252 |
| 253 // static |
| 254 int ZoneTypeConfig::range_get_bitset(ZoneTypeConfig::Range* range) { |
| 255 return range->bitset; |
| 256 } |
| 257 |
| 258 |
| 259 // static |
| 260 void ZoneTypeConfig::range_set_bitset(ZoneTypeConfig::Range* range, int value) { |
| 261 range->bitset = value; |
| 262 } |
| 263 |
| 264 |
| 265 // static |
| 266 double ZoneTypeConfig::range_get_double(ZoneTypeConfig::Range* range, |
| 267 int index) { |
| 268 DCHECK(index >= 0 && index < 2); |
| 269 return range->limits[index]; |
| 270 } |
| 271 |
| 272 |
| 273 // static |
| 274 void ZoneTypeConfig::range_set_double(ZoneTypeConfig::Range* range, int index, |
| 275 double value, Zone*) { |
| 276 DCHECK(index >= 0 && index < 2); |
| 277 range->limits[index] = value; |
| 278 } |
| 279 |
| 280 |
217 // ----------------------------------------------------------------------------- | 281 // ----------------------------------------------------------------------------- |
218 // HeapTypeConfig | 282 // HeapTypeConfig |
219 | 283 |
220 // static | 284 // static |
221 template<class T> | 285 template<class T> |
222 i::Handle<T> HeapTypeConfig::null_handle() { | 286 i::Handle<T> HeapTypeConfig::null_handle() { |
223 return i::Handle<T>(); | 287 return i::Handle<T>(); |
224 } | 288 } |
225 | 289 |
226 | 290 |
(...skipping 18 matching lines...) Expand all Loading... |
245 | 309 |
246 | 310 |
247 // static | 311 // static |
248 bool HeapTypeConfig::is_class(Type* type) { | 312 bool HeapTypeConfig::is_class(Type* type) { |
249 return type->IsMap(); | 313 return type->IsMap(); |
250 } | 314 } |
251 | 315 |
252 | 316 |
253 // static | 317 // static |
254 bool HeapTypeConfig::is_struct(Type* type, int tag) { | 318 bool HeapTypeConfig::is_struct(Type* type, int tag) { |
| 319 DCHECK(tag != kRangeStructTag); |
255 return type->IsFixedArray() && struct_tag(as_struct(type)) == tag; | 320 return type->IsFixedArray() && struct_tag(as_struct(type)) == tag; |
256 } | 321 } |
257 | 322 |
258 | 323 |
259 // static | 324 // static |
| 325 bool HeapTypeConfig::is_range(Type* type) { |
| 326 return type->IsFixedArray() && struct_tag(as_struct(type)) == kRangeStructTag; |
| 327 } |
| 328 |
| 329 |
| 330 // static |
260 HeapTypeConfig::Type::bitset HeapTypeConfig::as_bitset(Type* type) { | 331 HeapTypeConfig::Type::bitset HeapTypeConfig::as_bitset(Type* type) { |
261 // TODO(rossberg): Breaks the Smi abstraction. Fix once there is a better way. | 332 // TODO(rossberg): Breaks the Smi abstraction. Fix once there is a better way. |
262 return static_cast<Type::bitset>(reinterpret_cast<uintptr_t>(type)); | 333 return static_cast<Type::bitset>(reinterpret_cast<uintptr_t>(type)); |
263 } | 334 } |
264 | 335 |
265 | 336 |
266 // static | 337 // static |
267 i::Handle<i::Map> HeapTypeConfig::as_class(Type* type) { | 338 i::Handle<i::Map> HeapTypeConfig::as_class(Type* type) { |
268 return i::handle(i::Map::cast(type)); | 339 return i::handle(i::Map::cast(type)); |
269 } | 340 } |
270 | 341 |
271 | 342 |
272 // static | 343 // static |
273 i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::as_struct(Type* type) { | 344 i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::as_struct(Type* type) { |
274 return i::handle(Struct::cast(type)); | 345 return i::handle(Struct::cast(type)); |
275 } | 346 } |
276 | 347 |
277 | 348 |
278 // static | 349 // static |
| 350 i::Handle<HeapTypeConfig::Range> HeapTypeConfig::as_range(Type* type) { |
| 351 return i::handle(Range::cast(type)); |
| 352 } |
| 353 |
| 354 |
| 355 // static |
279 HeapTypeConfig::Type* HeapTypeConfig::from_bitset(Type::bitset bitset) { | 356 HeapTypeConfig::Type* HeapTypeConfig::from_bitset(Type::bitset bitset) { |
280 // TODO(rossberg): Breaks the Smi abstraction. Fix once there is a better way. | 357 // TODO(rossberg): Breaks the Smi abstraction. Fix once there is a better way. |
281 return reinterpret_cast<Type*>(static_cast<uintptr_t>(bitset)); | 358 return reinterpret_cast<Type*>(static_cast<uintptr_t>(bitset)); |
282 } | 359 } |
283 | 360 |
284 | 361 |
285 // static | 362 // static |
286 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_bitset( | 363 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_bitset( |
287 Type::bitset bitset, Isolate* isolate) { | 364 Type::bitset bitset, Isolate* isolate) { |
288 return i::handle(from_bitset(bitset), isolate); | 365 return i::handle(from_bitset(bitset), isolate); |
289 } | 366 } |
290 | 367 |
291 | 368 |
292 // static | 369 // static |
293 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_class( | 370 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_class( |
294 i::Handle<i::Map> map, Isolate* isolate) { | 371 i::Handle<i::Map> map, Isolate* isolate) { |
295 return i::Handle<Type>::cast(i::Handle<Object>::cast(map)); | 372 return i::Handle<Type>::cast(i::Handle<Object>::cast(map)); |
296 } | 373 } |
297 | 374 |
298 | 375 |
299 // static | 376 // static |
300 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_struct( | 377 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_struct( |
301 i::Handle<Struct> structure) { | 378 i::Handle<Struct> structure) { |
302 return i::Handle<Type>::cast(i::Handle<Object>::cast(structure)); | 379 return i::Handle<Type>::cast(i::Handle<Object>::cast(structure)); |
303 } | 380 } |
304 | 381 |
305 | 382 |
306 // static | 383 // static |
| 384 i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_range( |
| 385 i::Handle<Range> range) { |
| 386 return i::Handle<Type>::cast(i::Handle<Object>::cast(range)); |
| 387 } |
| 388 |
| 389 |
| 390 // static |
307 i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::struct_create( | 391 i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::struct_create( |
308 int tag, int length, Isolate* isolate) { | 392 int tag, int length, Isolate* isolate) { |
309 i::Handle<Struct> structure = isolate->factory()->NewFixedArray(length + 1); | 393 i::Handle<Struct> structure = isolate->factory()->NewFixedArray(length + 1); |
310 structure->set(0, i::Smi::FromInt(tag)); | 394 structure->set(0, i::Smi::FromInt(tag)); |
311 return structure; | 395 return structure; |
312 } | 396 } |
313 | 397 |
314 | 398 |
315 // static | 399 // static |
316 void HeapTypeConfig::struct_shrink(i::Handle<Struct> structure, int length) { | 400 void HeapTypeConfig::struct_shrink(i::Handle<Struct> structure, int length) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 } | 438 } |
355 | 439 |
356 | 440 |
357 // static | 441 // static |
358 template<class V> | 442 template<class V> |
359 void HeapTypeConfig::struct_set_value( | 443 void HeapTypeConfig::struct_set_value( |
360 i::Handle<Struct> structure, int i, i::Handle<V> x) { | 444 i::Handle<Struct> structure, int i, i::Handle<V> x) { |
361 structure->set(i + 1, *x); | 445 structure->set(i + 1, *x); |
362 } | 446 } |
363 | 447 |
| 448 |
| 449 // static |
| 450 i::Handle<HeapTypeConfig::Range> HeapTypeConfig::range_create( |
| 451 Isolate* isolate) { |
| 452 i::Handle<Range> range = isolate->factory()->NewFixedArray(4); |
| 453 range->set(0, i::Smi::FromInt(kRangeStructTag)); |
| 454 return range; |
| 455 } |
| 456 |
| 457 |
| 458 // static |
| 459 int HeapTypeConfig::range_get_bitset(i::Handle<HeapTypeConfig::Range> range) { |
| 460 Type* v = static_cast<Type*>(range->get(1)); |
| 461 return as_bitset(v); |
| 462 } |
| 463 |
| 464 |
| 465 // static |
| 466 void HeapTypeConfig::range_set_bitset(i::Handle<HeapTypeConfig::Range> range, |
| 467 int value) { |
| 468 range->set(1, from_bitset(value)); |
| 469 } |
| 470 |
| 471 |
| 472 // static |
| 473 double HeapTypeConfig::range_get_double(i::Handle<HeapTypeConfig::Range> range, |
| 474 int index) { |
| 475 DCHECK(index >= 0 && index < 2); |
| 476 return range->get(index + 2)->Number(); |
| 477 } |
| 478 |
| 479 |
| 480 // static |
| 481 void HeapTypeConfig::range_set_double(i::Handle<HeapTypeConfig::Range> range, |
| 482 int index, double value, |
| 483 Isolate* isolate) { |
| 484 DCHECK(index >= 0 && index < 2); |
| 485 i::Handle<Object> number = isolate->factory()->NewNumber(value); |
| 486 range->set(index + 2, *number); |
| 487 } |
364 } } // namespace v8::internal | 488 } } // namespace v8::internal |
365 | 489 |
366 #endif // V8_TYPES_INL_H_ | 490 #endif // V8_TYPES_INL_H_ |
OLD | NEW |