Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(217)

Side by Side Diff: src/ast/ast-types.h

Issue 2302283002: Forking the type system between Crankshaft & Turbofan. (Closed)
Patch Set: Nits. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ast/ast-type-bounds.h ('k') | src/ast/ast-types.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_H_ 5 #ifndef V8_AST_AST_TYPES_H_
6 #define V8_TYPES_H_ 6 #define V8_AST_AST_TYPES_H_
7 7
8 #include "src/conversions.h" 8 #include "src/conversions.h"
9 #include "src/handles.h" 9 #include "src/handles.h"
10 #include "src/objects.h" 10 #include "src/objects.h"
11 #include "src/ostreams.h" 11 #include "src/ostreams.h"
12 12
13 namespace v8 { 13 namespace v8 {
14 namespace internal { 14 namespace internal {
15 15
16 // SUMMARY 16 // SUMMARY
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 // constructors and predicates (those prefixed 'Now'). 137 // constructors and predicates (those prefixed 'Now').
138 // 138 //
139 // 139 //
140 // IMPLEMENTATION 140 // IMPLEMENTATION
141 // 141 //
142 // Internally, all 'primitive' types, and their unions, are represented as 142 // Internally, all 'primitive' types, and their unions, are represented as
143 // bitsets. Bit 0 is reserved for tagging. Class is a heap pointer to the 143 // bitsets. Bit 0 is reserved for tagging. Class is a heap pointer to the
144 // respective map. Only structured types require allocation. 144 // respective map. Only structured types require allocation.
145 // Note that the bitset representation is closed under both Union and Intersect. 145 // Note that the bitset representation is closed under both Union and Intersect.
146 146
147
148 // ----------------------------------------------------------------------------- 147 // -----------------------------------------------------------------------------
149 // Values for bitset types 148 // Values for bitset types
150 149
151 // clang-format off 150 // clang-format off
152 151
153 #define MASK_BITSET_TYPE_LIST(V) \ 152 #define AST_MASK_BITSET_TYPE_LIST(V) \
154 V(Representation, 0xffc00000u) \ 153 V(Representation, 0xffc00000u) \
155 V(Semantic, 0x003ffffeu) 154 V(Semantic, 0x003ffffeu)
156 155
157 #define REPRESENTATION(k) ((k) & BitsetType::kRepresentation) 156 #define AST_REPRESENTATION(k) ((k) & AstBitsetType::kRepresentation)
158 #define SEMANTIC(k) ((k) & BitsetType::kSemantic) 157 #define AST_SEMANTIC(k) ((k) & AstBitsetType::kSemantic)
159 158
160 #define REPRESENTATION_BITSET_TYPE_LIST(V) \ 159 #define AST_REPRESENTATION_BITSET_TYPE_LIST(V) \
161 V(None, 0) \ 160 V(None, 0) \
162 V(UntaggedBit, 1u << 22 | kSemantic) \ 161 V(UntaggedBit, 1u << 22 | kSemantic) \
163 V(UntaggedIntegral8, 1u << 23 | kSemantic) \ 162 V(UntaggedIntegral8, 1u << 23 | kSemantic) \
164 V(UntaggedIntegral16, 1u << 24 | kSemantic) \ 163 V(UntaggedIntegral16, 1u << 24 | kSemantic) \
165 V(UntaggedIntegral32, 1u << 25 | kSemantic) \ 164 V(UntaggedIntegral32, 1u << 25 | kSemantic) \
166 V(UntaggedFloat32, 1u << 26 | kSemantic) \ 165 V(UntaggedFloat32, 1u << 26 | kSemantic) \
167 V(UntaggedFloat64, 1u << 27 | kSemantic) \ 166 V(UntaggedFloat64, 1u << 27 | kSemantic) \
168 V(UntaggedSimd128, 1u << 28 | kSemantic) \ 167 V(UntaggedSimd128, 1u << 28 | kSemantic) \
169 V(UntaggedPointer, 1u << 29 | kSemantic) \ 168 V(UntaggedPointer, 1u << 29 | kSemantic) \
170 V(TaggedSigned, 1u << 30 | kSemantic) \ 169 V(TaggedSigned, 1u << 30 | kSemantic) \
171 V(TaggedPointer, 1u << 31 | kSemantic) \ 170 V(TaggedPointer, 1u << 31 | kSemantic) \
172 \ 171 \
173 V(UntaggedIntegral, kUntaggedBit | kUntaggedIntegral8 | \ 172 V(UntaggedIntegral, kUntaggedBit | kUntaggedIntegral8 | \
174 kUntaggedIntegral16 | kUntaggedIntegral32) \ 173 kUntaggedIntegral16 | kUntaggedIntegral32) \
175 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \ 174 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \
176 V(UntaggedNumber, kUntaggedIntegral | kUntaggedFloat) \ 175 V(UntaggedNumber, kUntaggedIntegral | kUntaggedFloat) \
177 V(Untagged, kUntaggedNumber | kUntaggedPointer) \ 176 V(Untagged, kUntaggedNumber | kUntaggedPointer) \
178 V(Tagged, kTaggedSigned | kTaggedPointer) 177 V(Tagged, kTaggedSigned | kTaggedPointer)
179 178
180 #define INTERNAL_BITSET_TYPE_LIST(V) \ 179 #define AST_INTERNAL_BITSET_TYPE_LIST(V) \
181 V(OtherUnsigned31, 1u << 1 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 180 V(OtherUnsigned31, 1u << 1 | AST_REPRESENTATION(kTagged | kUntaggedNumber)) \
182 V(OtherUnsigned32, 1u << 2 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 181 V(OtherUnsigned32, 1u << 2 | AST_REPRESENTATION(kTagged | kUntaggedNumber)) \
183 V(OtherSigned32, 1u << 3 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 182 V(OtherSigned32, 1u << 3 | AST_REPRESENTATION(kTagged | kUntaggedNumber)) \
184 V(OtherNumber, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) 183 V(OtherNumber, 1u << 4 | AST_REPRESENTATION(kTagged | kUntaggedNumber))
185 184
186 #define SEMANTIC_BITSET_TYPE_LIST(V) \ 185 #define AST_SEMANTIC_BITSET_TYPE_LIST(V) \
187 V(Negative31, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 186 V(Negative31, 1u << 5 | \
188 V(Null, 1u << 6 | REPRESENTATION(kTaggedPointer)) \ 187 AST_REPRESENTATION(kTagged | kUntaggedNumber)) \
189 V(Undefined, 1u << 7 | REPRESENTATION(kTaggedPointer)) \ 188 V(Null, 1u << 6 | AST_REPRESENTATION(kTaggedPointer)) \
190 V(Boolean, 1u << 8 | REPRESENTATION(kTaggedPointer)) \ 189 V(Undefined, 1u << 7 | AST_REPRESENTATION(kTaggedPointer)) \
191 V(Unsigned30, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 190 V(Boolean, 1u << 8 | AST_REPRESENTATION(kTaggedPointer)) \
192 V(MinusZero, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 191 V(Unsigned30, 1u << 9 | \
193 V(NaN, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \ 192 AST_REPRESENTATION(kTagged | kUntaggedNumber)) \
194 V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPointer)) \ 193 V(MinusZero, 1u << 10 | \
195 V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPointer)) \ 194 AST_REPRESENTATION(kTagged | kUntaggedNumber)) \
196 V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPointer)) \ 195 V(NaN, 1u << 11 | \
197 V(Simd, 1u << 15 | REPRESENTATION(kTaggedPointer)) \ 196 AST_REPRESENTATION(kTagged | kUntaggedNumber)) \
198 V(OtherObject, 1u << 17 | REPRESENTATION(kTaggedPointer)) \ 197 V(Symbol, 1u << 12 | AST_REPRESENTATION(kTaggedPointer)) \
199 V(OtherUndetectable, 1u << 16 | REPRESENTATION(kTaggedPointer)) \ 198 V(InternalizedString, 1u << 13 | AST_REPRESENTATION(kTaggedPointer)) \
200 V(Proxy, 1u << 18 | REPRESENTATION(kTaggedPointer)) \ 199 V(OtherString, 1u << 14 | AST_REPRESENTATION(kTaggedPointer)) \
201 V(Function, 1u << 19 | REPRESENTATION(kTaggedPointer)) \ 200 V(Simd, 1u << 15 | AST_REPRESENTATION(kTaggedPointer)) \
202 V(Hole, 1u << 20 | REPRESENTATION(kTaggedPointer)) \ 201 V(OtherObject, 1u << 17 | AST_REPRESENTATION(kTaggedPointer)) \
203 V(OtherInternal, 1u << 21 | REPRESENTATION(kTagged | kUntagged)) \ 202 V(OtherUndetectable, 1u << 16 | AST_REPRESENTATION(kTaggedPointer)) \
203 V(Proxy, 1u << 18 | AST_REPRESENTATION(kTaggedPointer)) \
204 V(Function, 1u << 19 | AST_REPRESENTATION(kTaggedPointer)) \
205 V(Hole, 1u << 20 | AST_REPRESENTATION(kTaggedPointer)) \
206 V(OtherInternal, 1u << 21 | \
207 AST_REPRESENTATION(kTagged | kUntagged)) \
204 \ 208 \
205 V(Signed31, kUnsigned30 | kNegative31) \ 209 V(Signed31, kUnsigned30 | kNegative31) \
206 V(Signed32, kSigned31 | kOtherUnsigned31 | kOtherSigned32) \ 210 V(Signed32, kSigned31 | kOtherUnsigned31 | \
211 kOtherSigned32) \
207 V(Signed32OrMinusZero, kSigned32 | kMinusZero) \ 212 V(Signed32OrMinusZero, kSigned32 | kMinusZero) \
208 V(Signed32OrMinusZeroOrNaN, kSigned32 | kMinusZero | kNaN) \ 213 V(Signed32OrMinusZeroOrNaN, kSigned32 | kMinusZero | kNaN) \
209 V(Negative32, kNegative31 | kOtherSigned32) \ 214 V(Negative32, kNegative31 | kOtherSigned32) \
210 V(Unsigned31, kUnsigned30 | kOtherUnsigned31) \ 215 V(Unsigned31, kUnsigned30 | kOtherUnsigned31) \
211 V(Unsigned32, kUnsigned30 | kOtherUnsigned31 | \ 216 V(Unsigned32, kUnsigned30 | kOtherUnsigned31 | \
212 kOtherUnsigned32) \ 217 kOtherUnsigned32) \
213 V(Unsigned32OrMinusZero, kUnsigned32 | kMinusZero) \ 218 V(Unsigned32OrMinusZero, kUnsigned32 | kMinusZero) \
214 V(Unsigned32OrMinusZeroOrNaN, kUnsigned32 | kMinusZero | kNaN) \ 219 V(Unsigned32OrMinusZeroOrNaN, kUnsigned32 | kMinusZero | kNaN) \
215 V(Integral32, kSigned32 | kUnsigned32) \ 220 V(Integral32, kSigned32 | kUnsigned32) \
216 V(PlainNumber, kIntegral32 | kOtherNumber) \ 221 V(PlainNumber, kIntegral32 | kOtherNumber) \
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 * -2^31 -2^30 0 2^30 2^31 2^32 259 * -2^31 -2^30 0 2^30 2^31 2^32
255 * 260 *
256 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. 261 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1.
257 * 262 *
258 * Some of the atomic numerical bitsets are internal only (see 263 * Some of the atomic numerical bitsets are internal only (see
259 * INTERNAL_BITSET_TYPE_LIST). To a types user, they should only occur in 264 * INTERNAL_BITSET_TYPE_LIST). To a types user, they should only occur in
260 * union with certain other bitsets. For instance, OtherNumber should only 265 * union with certain other bitsets. For instance, OtherNumber should only
261 * occur as part of PlainNumber. 266 * occur as part of PlainNumber.
262 */ 267 */
263 268
264 #define PROPER_BITSET_TYPE_LIST(V) \ 269 #define AST_PROPER_BITSET_TYPE_LIST(V) \
265 REPRESENTATION_BITSET_TYPE_LIST(V) \ 270 AST_REPRESENTATION_BITSET_TYPE_LIST(V) \
266 SEMANTIC_BITSET_TYPE_LIST(V) 271 AST_SEMANTIC_BITSET_TYPE_LIST(V)
267 272
268 #define BITSET_TYPE_LIST(V) \ 273 #define AST_BITSET_TYPE_LIST(V) \
269 MASK_BITSET_TYPE_LIST(V) \ 274 AST_MASK_BITSET_TYPE_LIST(V) \
270 REPRESENTATION_BITSET_TYPE_LIST(V) \ 275 AST_REPRESENTATION_BITSET_TYPE_LIST(V) \
271 INTERNAL_BITSET_TYPE_LIST(V) \ 276 AST_INTERNAL_BITSET_TYPE_LIST(V) \
272 SEMANTIC_BITSET_TYPE_LIST(V) 277 AST_SEMANTIC_BITSET_TYPE_LIST(V)
273 278
274 class Type; 279 class AstType;
275 280
276 // ----------------------------------------------------------------------------- 281 // -----------------------------------------------------------------------------
277 // Bitset types (internal). 282 // Bitset types (internal).
278 283
279 class BitsetType { 284 class AstBitsetType {
280 public: 285 public:
281 typedef uint32_t bitset; // Internal 286 typedef uint32_t bitset; // Internal
282 287
283 enum : uint32_t { 288 enum : uint32_t {
284 #define DECLARE_TYPE(type, value) k##type = (value), 289 #define DECLARE_TYPE(type, value) k##type = (value),
285 BITSET_TYPE_LIST(DECLARE_TYPE) 290 AST_BITSET_TYPE_LIST(DECLARE_TYPE)
286 #undef DECLARE_TYPE 291 #undef DECLARE_TYPE
287 kUnusedEOL = 0 292 kUnusedEOL = 0
288 }; 293 };
289 294
290 static bitset SignedSmall(); 295 static bitset SignedSmall();
291 static bitset UnsignedSmall(); 296 static bitset UnsignedSmall();
292 297
293 bitset Bitset() { 298 bitset Bitset() {
294 return static_cast<bitset>(reinterpret_cast<uintptr_t>(this) ^ 1u); 299 return static_cast<bitset>(reinterpret_cast<uintptr_t>(this) ^ 1u);
295 } 300 }
296 301
297 static bool IsInhabited(bitset bits) { 302 static bool IsInhabited(bitset bits) {
298 return SEMANTIC(bits) != kNone && REPRESENTATION(bits) != kNone; 303 return AST_SEMANTIC(bits) != kNone && AST_REPRESENTATION(bits) != kNone;
299 } 304 }
300 305
301 static bool SemanticIsInhabited(bitset bits) { 306 static bool SemanticIsInhabited(bitset bits) {
302 return SEMANTIC(bits) != kNone; 307 return AST_SEMANTIC(bits) != kNone;
303 } 308 }
304 309
305 static bool Is(bitset bits1, bitset bits2) { 310 static bool Is(bitset bits1, bitset bits2) {
306 return (bits1 | bits2) == bits2; 311 return (bits1 | bits2) == bits2;
307 } 312 }
308 313
309 static double Min(bitset); 314 static double Min(bitset);
310 static double Max(bitset); 315 static double Max(bitset);
311 316
312 static bitset Glb(Type* type); // greatest lower bound that's a bitset 317 static bitset Glb(AstType* type); // greatest lower bound that's a bitset
313 static bitset Glb(double min, double max); 318 static bitset Glb(double min, double max);
314 static bitset Lub(Type* type); // least upper bound that's a bitset 319 static bitset Lub(AstType* type); // least upper bound that's a bitset
315 static bitset Lub(i::Map* map); 320 static bitset Lub(i::Map* map);
316 static bitset Lub(i::Object* value); 321 static bitset Lub(i::Object* value);
317 static bitset Lub(double value); 322 static bitset Lub(double value);
318 static bitset Lub(double min, double max); 323 static bitset Lub(double min, double max);
319 static bitset ExpandInternals(bitset bits); 324 static bitset ExpandInternals(bitset bits);
320 325
321 static const char* Name(bitset); 326 static const char* Name(bitset);
322 static void Print(std::ostream& os, bitset); // NOLINT 327 static void Print(std::ostream& os, bitset); // NOLINT
323 #ifdef DEBUG 328 #ifdef DEBUG
324 static void Print(bitset); 329 static void Print(bitset);
325 #endif 330 #endif
326 331
327 static bitset NumberBits(bitset bits); 332 static bitset NumberBits(bitset bits);
328 333
329 static bool IsBitset(Type* type) { 334 static bool IsBitset(AstType* type) {
330 return reinterpret_cast<uintptr_t>(type) & 1; 335 return reinterpret_cast<uintptr_t>(type) & 1;
331 } 336 }
332 337
333 static Type* NewForTesting(bitset bits) { return New(bits); } 338 static AstType* NewForTesting(bitset bits) { return New(bits); }
334 339
335 private: 340 private:
336 friend class Type; 341 friend class AstType;
337 342
338 static Type* New(bitset bits) { 343 static AstType* New(bitset bits) {
339 return reinterpret_cast<Type*>(static_cast<uintptr_t>(bits | 1u)); 344 return reinterpret_cast<AstType*>(static_cast<uintptr_t>(bits | 1u));
340 } 345 }
341 346
342 struct Boundary { 347 struct Boundary {
343 bitset internal; 348 bitset internal;
344 bitset external; 349 bitset external;
345 double min; 350 double min;
346 }; 351 };
347 static const Boundary BoundariesArray[]; 352 static const Boundary BoundariesArray[];
348 static inline const Boundary* Boundaries(); 353 static inline const Boundary* Boundaries();
349 static inline size_t BoundariesSize(); 354 static inline size_t BoundariesSize();
350 }; 355 };
351 356
352 // ----------------------------------------------------------------------------- 357 // -----------------------------------------------------------------------------
353 // Superclass for non-bitset types (internal). 358 // Superclass for non-bitset types (internal).
354 class TypeBase { 359 class AstTypeBase {
355 protected: 360 protected:
356 friend class Type; 361 friend class AstType;
357 362
358 enum Kind { 363 enum Kind {
359 kClass, 364 kClass,
360 kConstant, 365 kConstant,
361 kContext, 366 kContext,
362 kArray, 367 kArray,
363 kFunction, 368 kFunction,
364 kTuple, 369 kTuple,
365 kUnion, 370 kUnion,
366 kRange 371 kRange
367 }; 372 };
368 373
369 Kind kind() const { return kind_; } 374 Kind kind() const { return kind_; }
370 explicit TypeBase(Kind kind) : kind_(kind) {} 375 explicit AstTypeBase(Kind kind) : kind_(kind) {}
371 376
372 static bool IsKind(Type* type, Kind kind) { 377 static bool IsKind(AstType* type, Kind kind) {
373 if (BitsetType::IsBitset(type)) return false; 378 if (AstBitsetType::IsBitset(type)) return false;
374 TypeBase* base = reinterpret_cast<TypeBase*>(type); 379 AstTypeBase* base = reinterpret_cast<AstTypeBase*>(type);
375 return base->kind() == kind; 380 return base->kind() == kind;
376 } 381 }
377 382
378 // The hacky conversion to/from Type*. 383 // The hacky conversion to/from AstType*.
379 static Type* AsType(TypeBase* type) { return reinterpret_cast<Type*>(type); } 384 static AstType* AsType(AstTypeBase* type) {
380 static TypeBase* FromType(Type* type) { 385 return reinterpret_cast<AstType*>(type);
381 return reinterpret_cast<TypeBase*>(type); 386 }
387 static AstTypeBase* FromType(AstType* type) {
388 return reinterpret_cast<AstTypeBase*>(type);
382 } 389 }
383 390
384 private: 391 private:
385 Kind kind_; 392 Kind kind_;
386 }; 393 };
387 394
388 // ----------------------------------------------------------------------------- 395 // -----------------------------------------------------------------------------
389 // Class types. 396 // Class types.
390 397
391 class ClassType : public TypeBase { 398 class AstClassType : public AstTypeBase {
392 public: 399 public:
393 i::Handle<i::Map> Map() { return map_; } 400 i::Handle<i::Map> Map() { return map_; }
394 401
395 private: 402 private:
396 friend class Type; 403 friend class AstType;
397 friend class BitsetType; 404 friend class AstBitsetType;
398 405
399 static Type* New(i::Handle<i::Map> map, Zone* zone) { 406 static AstType* New(i::Handle<i::Map> map, Zone* zone) {
400 return AsType(new (zone->New(sizeof(ClassType))) 407 return AsType(new (zone->New(sizeof(AstClassType)))
401 ClassType(BitsetType::Lub(*map), map)); 408 AstClassType(AstBitsetType::Lub(*map), map));
402 } 409 }
403 410
404 static ClassType* cast(Type* type) { 411 static AstClassType* cast(AstType* type) {
405 DCHECK(IsKind(type, kClass)); 412 DCHECK(IsKind(type, kClass));
406 return static_cast<ClassType*>(FromType(type)); 413 return static_cast<AstClassType*>(FromType(type));
407 } 414 }
408 415
409 ClassType(BitsetType::bitset bitset, i::Handle<i::Map> map) 416 AstClassType(AstBitsetType::bitset bitset, i::Handle<i::Map> map)
410 : TypeBase(kClass), bitset_(bitset), map_(map) {} 417 : AstTypeBase(kClass), bitset_(bitset), map_(map) {}
411 418
412 BitsetType::bitset Lub() { return bitset_; } 419 AstBitsetType::bitset Lub() { return bitset_; }
413 420
414 BitsetType::bitset bitset_; 421 AstBitsetType::bitset bitset_;
415 Handle<i::Map> map_; 422 Handle<i::Map> map_;
416 }; 423 };
417 424
418 // ----------------------------------------------------------------------------- 425 // -----------------------------------------------------------------------------
419 // Constant types. 426 // Constant types.
420 427
421 class ConstantType : public TypeBase { 428 class AstConstantType : public AstTypeBase {
422 public: 429 public:
423 i::Handle<i::Object> Value() { return object_; } 430 i::Handle<i::Object> Value() { return object_; }
424 431
425 private: 432 private:
426 friend class Type; 433 friend class AstType;
427 friend class BitsetType; 434 friend class AstBitsetType;
428 435
429 static Type* New(i::Handle<i::Object> value, Zone* zone) { 436 static AstType* New(i::Handle<i::Object> value, Zone* zone) {
430 BitsetType::bitset bitset = BitsetType::Lub(*value); 437 AstBitsetType::bitset bitset = AstBitsetType::Lub(*value);
431 return AsType(new (zone->New(sizeof(ConstantType))) 438 return AsType(new (zone->New(sizeof(AstConstantType)))
432 ConstantType(bitset, value)); 439 AstConstantType(bitset, value));
433 } 440 }
434 441
435 static ConstantType* cast(Type* type) { 442 static AstConstantType* cast(AstType* type) {
436 DCHECK(IsKind(type, kConstant)); 443 DCHECK(IsKind(type, kConstant));
437 return static_cast<ConstantType*>(FromType(type)); 444 return static_cast<AstConstantType*>(FromType(type));
438 } 445 }
439 446
440 ConstantType(BitsetType::bitset bitset, i::Handle<i::Object> object) 447 AstConstantType(AstBitsetType::bitset bitset, i::Handle<i::Object> object)
441 : TypeBase(kConstant), bitset_(bitset), object_(object) {} 448 : AstTypeBase(kConstant), bitset_(bitset), object_(object) {}
442 449
443 BitsetType::bitset Lub() { return bitset_; } 450 AstBitsetType::bitset Lub() { return bitset_; }
444 451
445 BitsetType::bitset bitset_; 452 AstBitsetType::bitset bitset_;
446 Handle<i::Object> object_; 453 Handle<i::Object> object_;
447 }; 454 };
448 // TODO(neis): Also cache value if numerical. 455 // TODO(neis): Also cache value if numerical.
449 // TODO(neis): Allow restricting the representation. 456 // TODO(neis): Allow restricting the representation.
450 457
451 // ----------------------------------------------------------------------------- 458 // -----------------------------------------------------------------------------
452 // Range types. 459 // Range types.
453 460
454 class RangeType : public TypeBase { 461 class AstRangeType : public AstTypeBase {
455 public: 462 public:
456 struct Limits { 463 struct Limits {
457 double min; 464 double min;
458 double max; 465 double max;
459 Limits(double min, double max) : min(min), max(max) {} 466 Limits(double min, double max) : min(min), max(max) {}
460 explicit Limits(RangeType* range) : min(range->Min()), max(range->Max()) {} 467 explicit Limits(AstRangeType* range)
468 : min(range->Min()), max(range->Max()) {}
461 bool IsEmpty(); 469 bool IsEmpty();
462 static Limits Empty() { return Limits(1, 0); } 470 static Limits Empty() { return Limits(1, 0); }
463 static Limits Intersect(Limits lhs, Limits rhs); 471 static Limits Intersect(Limits lhs, Limits rhs);
464 static Limits Union(Limits lhs, Limits rhs); 472 static Limits Union(Limits lhs, Limits rhs);
465 }; 473 };
466 474
467 double Min() { return limits_.min; } 475 double Min() { return limits_.min; }
468 double Max() { return limits_.max; } 476 double Max() { return limits_.max; }
469 477
470 private: 478 private:
471 friend class Type; 479 friend class AstType;
472 friend class BitsetType; 480 friend class AstBitsetType;
473 friend class UnionType; 481 friend class AstUnionType;
474 482
475 static Type* New(double min, double max, BitsetType::bitset representation, 483 static AstType* New(double min, double max,
476 Zone* zone) { 484 AstBitsetType::bitset representation, Zone* zone) {
477 return New(Limits(min, max), representation, zone); 485 return New(Limits(min, max), representation, zone);
478 } 486 }
479 487
480 static bool IsInteger(double x) { 488 static bool IsInteger(double x) {
481 return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities. 489 return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities.
482 } 490 }
483 491
484 static Type* New(Limits lim, BitsetType::bitset representation, Zone* zone) { 492 static AstType* New(Limits lim, AstBitsetType::bitset representation,
493 Zone* zone) {
485 DCHECK(IsInteger(lim.min) && IsInteger(lim.max)); 494 DCHECK(IsInteger(lim.min) && IsInteger(lim.max));
486 DCHECK(lim.min <= lim.max); 495 DCHECK(lim.min <= lim.max);
487 DCHECK(REPRESENTATION(representation) == representation); 496 DCHECK(AST_REPRESENTATION(representation) == representation);
488 BitsetType::bitset bits = 497 AstBitsetType::bitset bits =
489 SEMANTIC(BitsetType::Lub(lim.min, lim.max)) | representation; 498 AST_SEMANTIC(AstBitsetType::Lub(lim.min, lim.max)) | representation;
490 499
491 return AsType(new (zone->New(sizeof(RangeType))) RangeType(bits, lim)); 500 return AsType(new (zone->New(sizeof(AstRangeType)))
501 AstRangeType(bits, lim));
492 } 502 }
493 503
494 static RangeType* cast(Type* type) { 504 static AstRangeType* cast(AstType* type) {
495 DCHECK(IsKind(type, kRange)); 505 DCHECK(IsKind(type, kRange));
496 return static_cast<RangeType*>(FromType(type)); 506 return static_cast<AstRangeType*>(FromType(type));
497 } 507 }
498 508
499 RangeType(BitsetType::bitset bitset, Limits limits) 509 AstRangeType(AstBitsetType::bitset bitset, Limits limits)
500 : TypeBase(kRange), bitset_(bitset), limits_(limits) {} 510 : AstTypeBase(kRange), bitset_(bitset), limits_(limits) {}
501 511
502 BitsetType::bitset Lub() { return bitset_; } 512 AstBitsetType::bitset Lub() { return bitset_; }
503 513
504 BitsetType::bitset bitset_; 514 AstBitsetType::bitset bitset_;
505 Limits limits_; 515 Limits limits_;
506 }; 516 };
507 517
508 // ----------------------------------------------------------------------------- 518 // -----------------------------------------------------------------------------
509 // Context types. 519 // Context types.
510 520
511 class ContextType : public TypeBase { 521 class AstContextType : public AstTypeBase {
512 public: 522 public:
513 Type* Outer() { return outer_; } 523 AstType* Outer() { return outer_; }
514 524
515 private: 525 private:
516 friend class Type; 526 friend class AstType;
517 527
518 static Type* New(Type* outer, Zone* zone) { 528 static AstType* New(AstType* outer, Zone* zone) {
519 return AsType(new (zone->New(sizeof(ContextType))) ContextType(outer)); 529 return AsType(new (zone->New(sizeof(AstContextType)))
530 AstContextType(outer)); // NOLINT
520 } 531 }
521 532
522 static ContextType* cast(Type* type) { 533 static AstContextType* cast(AstType* type) {
523 DCHECK(IsKind(type, kContext)); 534 DCHECK(IsKind(type, kContext));
524 return static_cast<ContextType*>(FromType(type)); 535 return static_cast<AstContextType*>(FromType(type));
525 } 536 }
526 537
527 explicit ContextType(Type* outer) : TypeBase(kContext), outer_(outer) {} 538 explicit AstContextType(AstType* outer)
539 : AstTypeBase(kContext), outer_(outer) {}
528 540
529 Type* outer_; 541 AstType* outer_;
530 }; 542 };
531 543
532 // ----------------------------------------------------------------------------- 544 // -----------------------------------------------------------------------------
533 // Array types. 545 // Array types.
534 546
535 class ArrayType : public TypeBase { 547 class AstArrayType : public AstTypeBase {
536 public: 548 public:
537 Type* Element() { return element_; } 549 AstType* Element() { return element_; }
538 550
539 private: 551 private:
540 friend class Type; 552 friend class AstType;
541 553
542 explicit ArrayType(Type* element) : TypeBase(kArray), element_(element) {} 554 explicit AstArrayType(AstType* element)
555 : AstTypeBase(kArray), element_(element) {}
543 556
544 static Type* New(Type* element, Zone* zone) { 557 static AstType* New(AstType* element, Zone* zone) {
545 return AsType(new (zone->New(sizeof(ArrayType))) ArrayType(element)); 558 return AsType(new (zone->New(sizeof(AstArrayType))) AstArrayType(element));
546 } 559 }
547 560
548 static ArrayType* cast(Type* type) { 561 static AstArrayType* cast(AstType* type) {
549 DCHECK(IsKind(type, kArray)); 562 DCHECK(IsKind(type, kArray));
550 return static_cast<ArrayType*>(FromType(type)); 563 return static_cast<AstArrayType*>(FromType(type));
551 } 564 }
552 565
553 Type* element_; 566 AstType* element_;
554 }; 567 };
555 568
556 // ----------------------------------------------------------------------------- 569 // -----------------------------------------------------------------------------
557 // Superclass for types with variable number of type fields. 570 // Superclass for types with variable number of type fields.
558 class StructuralType : public TypeBase { 571 class AstStructuralType : public AstTypeBase {
559 public: 572 public:
560 int LengthForTesting() { return Length(); } 573 int LengthForTesting() { return Length(); }
561 574
562 protected: 575 protected:
563 friend class Type; 576 friend class AstType;
564 577
565 int Length() { return length_; } 578 int Length() { return length_; }
566 579
567 Type* Get(int i) { 580 AstType* Get(int i) {
568 DCHECK(0 <= i && i < this->Length()); 581 DCHECK(0 <= i && i < this->Length());
569 return elements_[i]; 582 return elements_[i];
570 } 583 }
571 584
572 void Set(int i, Type* type) { 585 void Set(int i, AstType* type) {
573 DCHECK(0 <= i && i < this->Length()); 586 DCHECK(0 <= i && i < this->Length());
574 elements_[i] = type; 587 elements_[i] = type;
575 } 588 }
576 589
577 void Shrink(int length) { 590 void Shrink(int length) {
578 DCHECK(2 <= length && length <= this->Length()); 591 DCHECK(2 <= length && length <= this->Length());
579 length_ = length; 592 length_ = length;
580 } 593 }
581 594
582 StructuralType(Kind kind, int length, i::Zone* zone) 595 AstStructuralType(Kind kind, int length, i::Zone* zone)
583 : TypeBase(kind), length_(length) { 596 : AstTypeBase(kind), length_(length) {
584 elements_ = reinterpret_cast<Type**>(zone->New(sizeof(Type*) * length)); 597 elements_ =
598 reinterpret_cast<AstType**>(zone->New(sizeof(AstType*) * length));
585 } 599 }
586 600
587 private: 601 private:
588 int length_; 602 int length_;
589 Type** elements_; 603 AstType** elements_;
590 }; 604 };
591 605
592 // ----------------------------------------------------------------------------- 606 // -----------------------------------------------------------------------------
593 // Function types. 607 // Function types.
594 608
595 class FunctionType : public StructuralType { 609 class AstFunctionType : public AstStructuralType {
596 public: 610 public:
597 int Arity() { return this->Length() - 2; } 611 int Arity() { return this->Length() - 2; }
598 Type* Result() { return this->Get(0); } 612 AstType* Result() { return this->Get(0); }
599 Type* Receiver() { return this->Get(1); } 613 AstType* Receiver() { return this->Get(1); }
600 Type* Parameter(int i) { return this->Get(2 + i); } 614 AstType* Parameter(int i) { return this->Get(2 + i); }
601 615
602 void InitParameter(int i, Type* type) { this->Set(2 + i, type); } 616 void InitParameter(int i, AstType* type) { this->Set(2 + i, type); }
603 617
604 private: 618 private:
605 friend class Type; 619 friend class AstType;
606 620
607 FunctionType(Type* result, Type* receiver, int arity, Zone* zone) 621 AstFunctionType(AstType* result, AstType* receiver, int arity, Zone* zone)
608 : StructuralType(kFunction, 2 + arity, zone) { 622 : AstStructuralType(kFunction, 2 + arity, zone) {
609 Set(0, result); 623 Set(0, result);
610 Set(1, receiver); 624 Set(1, receiver);
611 } 625 }
612 626
613 static Type* New(Type* result, Type* receiver, int arity, Zone* zone) { 627 static AstType* New(AstType* result, AstType* receiver, int arity,
614 return AsType(new (zone->New(sizeof(FunctionType))) 628 Zone* zone) {
615 FunctionType(result, receiver, arity, zone)); 629 return AsType(new (zone->New(sizeof(AstFunctionType)))
630 AstFunctionType(result, receiver, arity, zone));
616 } 631 }
617 632
618 static FunctionType* cast(Type* type) { 633 static AstFunctionType* cast(AstType* type) {
619 DCHECK(IsKind(type, kFunction)); 634 DCHECK(IsKind(type, kFunction));
620 return static_cast<FunctionType*>(FromType(type)); 635 return static_cast<AstFunctionType*>(FromType(type));
621 } 636 }
622 }; 637 };
623 638
624 // ----------------------------------------------------------------------------- 639 // -----------------------------------------------------------------------------
625 // Tuple types. 640 // Tuple types.
626 641
627 class TupleType : public StructuralType { 642 class AstTupleType : public AstStructuralType {
628 public: 643 public:
629 int Arity() { return this->Length(); } 644 int Arity() { return this->Length(); }
630 Type* Element(int i) { return this->Get(i); } 645 AstType* Element(int i) { return this->Get(i); }
631 646
632 void InitElement(int i, Type* type) { this->Set(i, type); } 647 void InitElement(int i, AstType* type) { this->Set(i, type); }
633 648
634 private: 649 private:
635 friend class Type; 650 friend class AstType;
636 651
637 TupleType(int length, Zone* zone) : StructuralType(kTuple, length, zone) {} 652 AstTupleType(int length, Zone* zone)
653 : AstStructuralType(kTuple, length, zone) {}
638 654
639 static Type* New(int length, Zone* zone) { 655 static AstType* New(int length, Zone* zone) {
640 return AsType(new (zone->New(sizeof(TupleType))) TupleType(length, zone)); 656 return AsType(new (zone->New(sizeof(AstTupleType)))
657 AstTupleType(length, zone));
641 } 658 }
642 659
643 static TupleType* cast(Type* type) { 660 static AstTupleType* cast(AstType* type) {
644 DCHECK(IsKind(type, kTuple)); 661 DCHECK(IsKind(type, kTuple));
645 return static_cast<TupleType*>(FromType(type)); 662 return static_cast<AstTupleType*>(FromType(type));
646 } 663 }
647 }; 664 };
648 665
649 // ----------------------------------------------------------------------------- 666 // -----------------------------------------------------------------------------
650 // Union types (internal). 667 // Union types (internal).
651 // A union is a structured type with the following invariants: 668 // A union is a structured type with the following invariants:
652 // - its length is at least 2 669 // - its length is at least 2
653 // - at most one field is a bitset, and it must go into index 0 670 // - at most one field is a bitset, and it must go into index 0
654 // - no field is a union 671 // - no field is a union
655 // - no field is a subtype of any other field 672 // - no field is a subtype of any other field
656 class UnionType : public StructuralType { 673 class AstUnionType : public AstStructuralType {
657 private: 674 private:
658 friend Type; 675 friend AstType;
659 friend BitsetType; 676 friend AstBitsetType;
660 677
661 UnionType(int length, Zone* zone) : StructuralType(kUnion, length, zone) {} 678 AstUnionType(int length, Zone* zone)
679 : AstStructuralType(kUnion, length, zone) {}
662 680
663 static Type* New(int length, Zone* zone) { 681 static AstType* New(int length, Zone* zone) {
664 return AsType(new (zone->New(sizeof(UnionType))) UnionType(length, zone)); 682 return AsType(new (zone->New(sizeof(AstUnionType)))
683 AstUnionType(length, zone));
665 } 684 }
666 685
667 static UnionType* cast(Type* type) { 686 static AstUnionType* cast(AstType* type) {
668 DCHECK(IsKind(type, kUnion)); 687 DCHECK(IsKind(type, kUnion));
669 return static_cast<UnionType*>(FromType(type)); 688 return static_cast<AstUnionType*>(FromType(type));
670 } 689 }
671 690
672 bool Wellformed(); 691 bool Wellformed();
673 }; 692 };
674 693
675 class Type { 694 class AstType {
676 public: 695 public:
677 typedef BitsetType::bitset bitset; // Internal 696 typedef AstBitsetType::bitset bitset; // Internal
678 697
679 // Constructors. 698 // Constructors.
680 #define DEFINE_TYPE_CONSTRUCTOR(type, value) \ 699 #define DEFINE_TYPE_CONSTRUCTOR(type, value) \
681 static Type* type() { return BitsetType::New(BitsetType::k##type); } 700 static AstType* type() { return AstBitsetType::New(AstBitsetType::k##type); }
682 PROPER_BITSET_TYPE_LIST(DEFINE_TYPE_CONSTRUCTOR) 701 AST_PROPER_BITSET_TYPE_LIST(DEFINE_TYPE_CONSTRUCTOR)
683 #undef DEFINE_TYPE_CONSTRUCTOR 702 #undef DEFINE_TYPE_CONSTRUCTOR
684 703
685 static Type* SignedSmall() { 704 static AstType* SignedSmall() {
686 return BitsetType::New(BitsetType::SignedSmall()); 705 return AstBitsetType::New(AstBitsetType::SignedSmall());
687 } 706 }
688 static Type* UnsignedSmall() { 707 static AstType* UnsignedSmall() {
689 return BitsetType::New(BitsetType::UnsignedSmall()); 708 return AstBitsetType::New(AstBitsetType::UnsignedSmall());
690 } 709 }
691 710
692 static Type* Class(i::Handle<i::Map> map, Zone* zone) { 711 static AstType* Class(i::Handle<i::Map> map, Zone* zone) {
693 return ClassType::New(map, zone); 712 return AstClassType::New(map, zone);
694 } 713 }
695 static Type* Constant(i::Handle<i::Object> value, Zone* zone) { 714 static AstType* Constant(i::Handle<i::Object> value, Zone* zone) {
696 return ConstantType::New(value, zone); 715 return AstConstantType::New(value, zone);
697 } 716 }
698 static Type* Range(double min, double max, Zone* zone) { 717 static AstType* Range(double min, double max, Zone* zone) {
699 return RangeType::New(min, max, REPRESENTATION(BitsetType::kTagged | 718 return AstRangeType::New(min, max,
700 BitsetType::kUntaggedNumber), 719 AST_REPRESENTATION(AstBitsetType::kTagged |
701 zone); 720 AstBitsetType::kUntaggedNumber),
721 zone);
702 } 722 }
703 static Type* Context(Type* outer, Zone* zone) { 723 static AstType* Context(AstType* outer, Zone* zone) {
704 return ContextType::New(outer, zone); 724 return AstContextType::New(outer, zone);
705 } 725 }
706 static Type* Array(Type* element, Zone* zone) { 726 static AstType* Array(AstType* element, Zone* zone) {
707 return ArrayType::New(element, zone); 727 return AstArrayType::New(element, zone);
708 } 728 }
709 static Type* Function(Type* result, Type* receiver, int arity, Zone* zone) { 729 static AstType* Function(AstType* result, AstType* receiver, int arity,
710 return FunctionType::New(result, receiver, arity, zone); 730 Zone* zone) {
731 return AstFunctionType::New(result, receiver, arity, zone);
711 } 732 }
712 static Type* Function(Type* result, Zone* zone) { 733 static AstType* Function(AstType* result, Zone* zone) {
713 return Function(result, Any(), 0, zone); 734 return Function(result, Any(), 0, zone);
714 } 735 }
715 static Type* Function(Type* result, Type* param0, Zone* zone) { 736 static AstType* Function(AstType* result, AstType* param0, Zone* zone) {
716 Type* function = Function(result, Any(), 1, zone); 737 AstType* function = Function(result, Any(), 1, zone);
717 function->AsFunction()->InitParameter(0, param0); 738 function->AsFunction()->InitParameter(0, param0);
718 return function; 739 return function;
719 } 740 }
720 static Type* Function(Type* result, Type* param0, Type* param1, Zone* zone) { 741 static AstType* Function(AstType* result, AstType* param0, AstType* param1,
721 Type* function = Function(result, Any(), 2, zone); 742 Zone* zone) {
743 AstType* function = Function(result, Any(), 2, zone);
722 function->AsFunction()->InitParameter(0, param0); 744 function->AsFunction()->InitParameter(0, param0);
723 function->AsFunction()->InitParameter(1, param1); 745 function->AsFunction()->InitParameter(1, param1);
724 return function; 746 return function;
725 } 747 }
726 static Type* Function(Type* result, Type* param0, Type* param1, Type* param2, 748 static AstType* Function(AstType* result, AstType* param0, AstType* param1,
727 Zone* zone) { 749 AstType* param2, Zone* zone) {
728 Type* function = Function(result, Any(), 3, zone); 750 AstType* function = Function(result, Any(), 3, zone);
729 function->AsFunction()->InitParameter(0, param0); 751 function->AsFunction()->InitParameter(0, param0);
730 function->AsFunction()->InitParameter(1, param1); 752 function->AsFunction()->InitParameter(1, param1);
731 function->AsFunction()->InitParameter(2, param2); 753 function->AsFunction()->InitParameter(2, param2);
732 return function; 754 return function;
733 } 755 }
734 static Type* Function(Type* result, int arity, Type** params, Zone* zone) { 756 static AstType* Function(AstType* result, int arity, AstType** params,
735 Type* function = Function(result, Any(), arity, zone); 757 Zone* zone) {
758 AstType* function = Function(result, Any(), arity, zone);
736 for (int i = 0; i < arity; ++i) { 759 for (int i = 0; i < arity; ++i) {
737 function->AsFunction()->InitParameter(i, params[i]); 760 function->AsFunction()->InitParameter(i, params[i]);
738 } 761 }
739 return function; 762 return function;
740 } 763 }
741 static Type* Tuple(Type* first, Type* second, Type* third, Zone* zone) { 764 static AstType* Tuple(AstType* first, AstType* second, AstType* third,
742 Type* tuple = TupleType::New(3, zone); 765 Zone* zone) {
766 AstType* tuple = AstTupleType::New(3, zone);
743 tuple->AsTuple()->InitElement(0, first); 767 tuple->AsTuple()->InitElement(0, first);
744 tuple->AsTuple()->InitElement(1, second); 768 tuple->AsTuple()->InitElement(1, second);
745 tuple->AsTuple()->InitElement(2, third); 769 tuple->AsTuple()->InitElement(2, third);
746 return tuple; 770 return tuple;
747 } 771 }
748 772
749 #define CONSTRUCT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \ 773 #define CONSTRUCT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \
750 static Type* Name(Isolate* isolate, Zone* zone); 774 static AstType* Name(Isolate* isolate, Zone* zone);
751 SIMD128_TYPES(CONSTRUCT_SIMD_TYPE) 775 SIMD128_TYPES(CONSTRUCT_SIMD_TYPE)
752 #undef CONSTRUCT_SIMD_TYPE 776 #undef CONSTRUCT_SIMD_TYPE
753 777
754 static Type* Union(Type* type1, Type* type2, Zone* zone); 778 static AstType* Union(AstType* type1, AstType* type2, Zone* zone);
755 static Type* Intersect(Type* type1, Type* type2, Zone* zone); 779 static AstType* Intersect(AstType* type1, AstType* type2, Zone* zone);
756 780
757 static Type* Of(double value, Zone* zone) { 781 static AstType* Of(double value, Zone* zone) {
758 return BitsetType::New(BitsetType::ExpandInternals(BitsetType::Lub(value))); 782 return AstBitsetType::New(
783 AstBitsetType::ExpandInternals(AstBitsetType::Lub(value)));
759 } 784 }
760 static Type* Of(i::Object* value, Zone* zone) { 785 static AstType* Of(i::Object* value, Zone* zone) {
761 return BitsetType::New(BitsetType::ExpandInternals(BitsetType::Lub(value))); 786 return AstBitsetType::New(
787 AstBitsetType::ExpandInternals(AstBitsetType::Lub(value)));
762 } 788 }
763 static Type* Of(i::Handle<i::Object> value, Zone* zone) { 789 static AstType* Of(i::Handle<i::Object> value, Zone* zone) {
764 return Of(*value, zone); 790 return Of(*value, zone);
765 } 791 }
766 792
767 static Type* For(i::Map* map) { 793 static AstType* For(i::Map* map) {
768 return BitsetType::New(BitsetType::ExpandInternals(BitsetType::Lub(map))); 794 return AstBitsetType::New(
795 AstBitsetType::ExpandInternals(AstBitsetType::Lub(map)));
769 } 796 }
770 static Type* For(i::Handle<i::Map> map) { return For(*map); } 797 static AstType* For(i::Handle<i::Map> map) { return For(*map); }
771 798
772 // Extraction of components. 799 // Extraction of components.
773 static Type* Representation(Type* t, Zone* zone); 800 static AstType* Representation(AstType* t, Zone* zone);
774 static Type* Semantic(Type* t, Zone* zone); 801 static AstType* Semantic(AstType* t, Zone* zone);
775 802
776 // Predicates. 803 // Predicates.
777 bool IsInhabited() { return BitsetType::IsInhabited(this->BitsetLub()); } 804 bool IsInhabited() { return AstBitsetType::IsInhabited(this->BitsetLub()); }
778 805
779 bool Is(Type* that) { return this == that || this->SlowIs(that); } 806 bool Is(AstType* that) { return this == that || this->SlowIs(that); }
780 bool Maybe(Type* that); 807 bool Maybe(AstType* that);
781 bool Equals(Type* that) { return this->Is(that) && that->Is(this); } 808 bool Equals(AstType* that) { return this->Is(that) && that->Is(this); }
782 809
783 // Equivalent to Constant(val)->Is(this), but avoiding allocation. 810 // Equivalent to Constant(val)->Is(this), but avoiding allocation.
784 bool Contains(i::Object* val); 811 bool Contains(i::Object* val);
785 bool Contains(i::Handle<i::Object> val) { return this->Contains(*val); } 812 bool Contains(i::Handle<i::Object> val) { return this->Contains(*val); }
786 813
787 // State-dependent versions of the above that consider subtyping between 814 // State-dependent versions of the above that consider subtyping between
788 // a constant and its map class. 815 // a constant and its map class.
789 static Type* NowOf(i::Object* value, Zone* zone); 816 static AstType* NowOf(i::Object* value, Zone* zone);
790 static Type* NowOf(i::Handle<i::Object> value, Zone* zone) { 817 static AstType* NowOf(i::Handle<i::Object> value, Zone* zone) {
791 return NowOf(*value, zone); 818 return NowOf(*value, zone);
792 } 819 }
793 bool NowIs(Type* that); 820 bool NowIs(AstType* that);
794 bool NowContains(i::Object* val); 821 bool NowContains(i::Object* val);
795 bool NowContains(i::Handle<i::Object> val) { return this->NowContains(*val); } 822 bool NowContains(i::Handle<i::Object> val) { return this->NowContains(*val); }
796 823
797 bool NowStable(); 824 bool NowStable();
798 825
799 // Inspection. 826 // Inspection.
800 bool IsRange() { return IsKind(TypeBase::kRange); } 827 bool IsRange() { return IsKind(AstTypeBase::kRange); }
801 bool IsClass() { return IsKind(TypeBase::kClass); } 828 bool IsClass() { return IsKind(AstTypeBase::kClass); }
802 bool IsConstant() { return IsKind(TypeBase::kConstant); } 829 bool IsConstant() { return IsKind(AstTypeBase::kConstant); }
803 bool IsContext() { return IsKind(TypeBase::kContext); } 830 bool IsContext() { return IsKind(AstTypeBase::kContext); }
804 bool IsArray() { return IsKind(TypeBase::kArray); } 831 bool IsArray() { return IsKind(AstTypeBase::kArray); }
805 bool IsFunction() { return IsKind(TypeBase::kFunction); } 832 bool IsFunction() { return IsKind(AstTypeBase::kFunction); }
806 bool IsTuple() { return IsKind(TypeBase::kTuple); } 833 bool IsTuple() { return IsKind(AstTypeBase::kTuple); }
807 834
808 ClassType* AsClass() { return ClassType::cast(this); } 835 AstClassType* AsClass() { return AstClassType::cast(this); }
809 ConstantType* AsConstant() { return ConstantType::cast(this); } 836 AstConstantType* AsConstant() { return AstConstantType::cast(this); }
810 RangeType* AsRange() { return RangeType::cast(this); } 837 AstRangeType* AsRange() { return AstRangeType::cast(this); }
811 ContextType* AsContext() { return ContextType::cast(this); } 838 AstContextType* AsContext() { return AstContextType::cast(this); }
812 ArrayType* AsArray() { return ArrayType::cast(this); } 839 AstArrayType* AsArray() { return AstArrayType::cast(this); }
813 FunctionType* AsFunction() { return FunctionType::cast(this); } 840 AstFunctionType* AsFunction() { return AstFunctionType::cast(this); }
814 TupleType* AsTuple() { return TupleType::cast(this); } 841 AstTupleType* AsTuple() { return AstTupleType::cast(this); }
815 842
816 // Minimum and maximum of a numeric type. 843 // Minimum and maximum of a numeric type.
817 // These functions do not distinguish between -0 and +0. If the type equals 844 // These functions do not distinguish between -0 and +0. If the type equals
818 // kNaN, they return NaN; otherwise kNaN is ignored. Only call these 845 // kNaN, they return NaN; otherwise kNaN is ignored. Only call these
819 // functions on subtypes of Number. 846 // functions on subtypes of Number.
820 double Min(); 847 double Min();
821 double Max(); 848 double Max();
822 849
823 // Extracts a range from the type: if the type is a range or a union 850 // Extracts a range from the type: if the type is a range or a union
824 // containing a range, that range is returned; otherwise, NULL is returned. 851 // containing a range, that range is returned; otherwise, NULL is returned.
825 Type* GetRange(); 852 AstType* GetRange();
826 853
827 static bool IsInteger(i::Object* x); 854 static bool IsInteger(i::Object* x);
828 static bool IsInteger(double x) { 855 static bool IsInteger(double x) {
829 return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities. 856 return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities.
830 } 857 }
831 858
832 int NumClasses(); 859 int NumClasses();
833 int NumConstants(); 860 int NumConstants();
834 861
835 template <class T> 862 template <class T>
836 class Iterator { 863 class Iterator {
837 public: 864 public:
838 bool Done() const { return index_ < 0; } 865 bool Done() const { return index_ < 0; }
839 i::Handle<T> Current(); 866 i::Handle<T> Current();
840 void Advance(); 867 void Advance();
841 868
842 private: 869 private:
843 friend class Type; 870 friend class AstType;
844 871
845 Iterator() : index_(-1) {} 872 Iterator() : index_(-1) {}
846 explicit Iterator(Type* type) : type_(type), index_(-1) { Advance(); } 873 explicit Iterator(AstType* type) : type_(type), index_(-1) { Advance(); }
847 874
848 inline bool matches(Type* type); 875 inline bool matches(AstType* type);
849 inline Type* get_type(); 876 inline AstType* get_type();
850 877
851 Type* type_; 878 AstType* type_;
852 int index_; 879 int index_;
853 }; 880 };
854 881
855 Iterator<i::Map> Classes() { 882 Iterator<i::Map> Classes() {
856 if (this->IsBitset()) return Iterator<i::Map>(); 883 if (this->IsBitset()) return Iterator<i::Map>();
857 return Iterator<i::Map>(this); 884 return Iterator<i::Map>(this);
858 } 885 }
859 Iterator<i::Object> Constants() { 886 Iterator<i::Object> Constants() {
860 if (this->IsBitset()) return Iterator<i::Object>(); 887 if (this->IsBitset()) return Iterator<i::Object>();
861 return Iterator<i::Object>(this); 888 return Iterator<i::Object>(this);
862 } 889 }
863 890
864 // Printing. 891 // Printing.
865 892
866 enum PrintDimension { BOTH_DIMS, SEMANTIC_DIM, REPRESENTATION_DIM }; 893 enum PrintDimension { BOTH_DIMS, SEMANTIC_DIM, REPRESENTATION_DIM };
867 894
868 void PrintTo(std::ostream& os, PrintDimension dim = BOTH_DIMS); // NOLINT 895 void PrintTo(std::ostream& os, PrintDimension dim = BOTH_DIMS); // NOLINT
869 896
870 #ifdef DEBUG 897 #ifdef DEBUG
871 void Print(); 898 void Print();
872 #endif 899 #endif
873 900
874 // Helpers for testing. 901 // Helpers for testing.
875 bool IsBitsetForTesting() { return IsBitset(); } 902 bool IsBitsetForTesting() { return IsBitset(); }
876 bool IsUnionForTesting() { return IsUnion(); } 903 bool IsUnionForTesting() { return IsUnion(); }
877 bitset AsBitsetForTesting() { return AsBitset(); } 904 bitset AsBitsetForTesting() { return AsBitset(); }
878 UnionType* AsUnionForTesting() { return AsUnion(); } 905 AstUnionType* AsUnionForTesting() { return AsUnion(); }
879 906
880 private: 907 private:
881 // Friends. 908 // Friends.
882 template <class> 909 template <class>
883 friend class Iterator; 910 friend class Iterator;
884 friend BitsetType; 911 friend AstBitsetType;
885 friend UnionType; 912 friend AstUnionType;
886 913
887 // Internal inspection. 914 // Internal inspection.
888 bool IsKind(TypeBase::Kind kind) { return TypeBase::IsKind(this, kind); } 915 bool IsKind(AstTypeBase::Kind kind) {
916 return AstTypeBase::IsKind(this, kind);
917 }
889 918
890 bool IsNone() { return this == None(); } 919 bool IsNone() { return this == None(); }
891 bool IsAny() { return this == Any(); } 920 bool IsAny() { return this == Any(); }
892 bool IsBitset() { return BitsetType::IsBitset(this); } 921 bool IsBitset() { return AstBitsetType::IsBitset(this); }
893 bool IsUnion() { return IsKind(TypeBase::kUnion); } 922 bool IsUnion() { return IsKind(AstTypeBase::kUnion); }
894 923
895 bitset AsBitset() { 924 bitset AsBitset() {
896 DCHECK(this->IsBitset()); 925 DCHECK(this->IsBitset());
897 return reinterpret_cast<BitsetType*>(this)->Bitset(); 926 return reinterpret_cast<AstBitsetType*>(this)->Bitset();
898 } 927 }
899 UnionType* AsUnion() { return UnionType::cast(this); } 928 AstUnionType* AsUnion() { return AstUnionType::cast(this); }
900 929
901 bitset Representation(); 930 bitset Representation();
902 931
903 // Auxiliary functions. 932 // Auxiliary functions.
904 bool SemanticMaybe(Type* that); 933 bool SemanticMaybe(AstType* that);
905 934
906 bitset BitsetGlb() { return BitsetType::Glb(this); } 935 bitset BitsetGlb() { return AstBitsetType::Glb(this); }
907 bitset BitsetLub() { return BitsetType::Lub(this); } 936 bitset BitsetLub() { return AstBitsetType::Lub(this); }
908 937
909 bool SlowIs(Type* that); 938 bool SlowIs(AstType* that);
910 bool SemanticIs(Type* that); 939 bool SemanticIs(AstType* that);
911 940
912 static bool Overlap(RangeType* lhs, RangeType* rhs); 941 static bool Overlap(AstRangeType* lhs, AstRangeType* rhs);
913 static bool Contains(RangeType* lhs, RangeType* rhs); 942 static bool Contains(AstRangeType* lhs, AstRangeType* rhs);
914 static bool Contains(RangeType* range, ConstantType* constant); 943 static bool Contains(AstRangeType* range, AstConstantType* constant);
915 static bool Contains(RangeType* range, i::Object* val); 944 static bool Contains(AstRangeType* range, i::Object* val);
916 945
917 static int UpdateRange(Type* type, UnionType* result, int size, Zone* zone); 946 static int UpdateRange(AstType* type, AstUnionType* result, int size,
947 Zone* zone);
918 948
919 static RangeType::Limits IntersectRangeAndBitset(Type* range, Type* bits, 949 static AstRangeType::Limits IntersectRangeAndBitset(AstType* range,
920 Zone* zone); 950 AstType* bits,
921 static RangeType::Limits ToLimits(bitset bits, Zone* zone); 951 Zone* zone);
952 static AstRangeType::Limits ToLimits(bitset bits, Zone* zone);
922 953
923 bool SimplyEquals(Type* that); 954 bool SimplyEquals(AstType* that);
924 955
925 static int AddToUnion(Type* type, UnionType* result, int size, Zone* zone); 956 static int AddToUnion(AstType* type, AstUnionType* result, int size,
926 static int IntersectAux(Type* type, Type* other, UnionType* result, int size, 957 Zone* zone);
927 RangeType::Limits* limits, Zone* zone); 958 static int IntersectAux(AstType* type, AstType* other, AstUnionType* result,
928 static Type* NormalizeUnion(Type* unioned, int size, Zone* zone); 959 int size, AstRangeType::Limits* limits, Zone* zone);
929 static Type* NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone); 960 static AstType* NormalizeUnion(AstType* unioned, int size, Zone* zone);
961 static AstType* NormalizeRangeAndBitset(AstType* range, bitset* bits,
962 Zone* zone);
930 }; 963 };
931 964
932 // ----------------------------------------------------------------------------- 965 // -----------------------------------------------------------------------------
933 // Type bounds. A simple struct to represent a pair of lower/upper types. 966 // Type bounds. A simple struct to represent a pair of lower/upper types.
934 967
935 struct Bounds { 968 struct AstBounds {
936 Type* lower; 969 AstType* lower;
937 Type* upper; 970 AstType* upper;
938 971
939 Bounds() 972 AstBounds()
940 : // Make sure accessing uninitialized bounds crashes big-time. 973 : // Make sure accessing uninitialized bounds crashes big-time.
941 lower(nullptr), 974 lower(nullptr),
942 upper(nullptr) {} 975 upper(nullptr) {}
943 explicit Bounds(Type* t) : lower(t), upper(t) {} 976 explicit AstBounds(AstType* t) : lower(t), upper(t) {}
944 Bounds(Type* l, Type* u) : lower(l), upper(u) { DCHECK(lower->Is(upper)); } 977 AstBounds(AstType* l, AstType* u) : lower(l), upper(u) {
978 DCHECK(lower->Is(upper));
979 }
945 980
946 // Unrestricted bounds. 981 // Unrestricted bounds.
947 static Bounds Unbounded() { return Bounds(Type::None(), Type::Any()); } 982 static AstBounds Unbounded() {
983 return AstBounds(AstType::None(), AstType::Any());
984 }
948 985
949 // Meet: both b1 and b2 are known to hold. 986 // Meet: both b1 and b2 are known to hold.
950 static Bounds Both(Bounds b1, Bounds b2, Zone* zone) { 987 static AstBounds Both(AstBounds b1, AstBounds b2, Zone* zone) {
951 Type* lower = Type::Union(b1.lower, b2.lower, zone); 988 AstType* lower = AstType::Union(b1.lower, b2.lower, zone);
952 Type* upper = Type::Intersect(b1.upper, b2.upper, zone); 989 AstType* upper = AstType::Intersect(b1.upper, b2.upper, zone);
953 // Lower bounds are considered approximate, correct as necessary. 990 // Lower bounds are considered approximate, correct as necessary.
954 if (!lower->Is(upper)) lower = upper; 991 if (!lower->Is(upper)) lower = upper;
955 return Bounds(lower, upper); 992 return AstBounds(lower, upper);
956 } 993 }
957 994
958 // Join: either b1 or b2 is known to hold. 995 // Join: either b1 or b2 is known to hold.
959 static Bounds Either(Bounds b1, Bounds b2, Zone* zone) { 996 static AstBounds Either(AstBounds b1, AstBounds b2, Zone* zone) {
960 Type* lower = Type::Intersect(b1.lower, b2.lower, zone); 997 AstType* lower = AstType::Intersect(b1.lower, b2.lower, zone);
961 Type* upper = Type::Union(b1.upper, b2.upper, zone); 998 AstType* upper = AstType::Union(b1.upper, b2.upper, zone);
962 return Bounds(lower, upper); 999 return AstBounds(lower, upper);
963 } 1000 }
964 1001
965 static Bounds NarrowLower(Bounds b, Type* t, Zone* zone) { 1002 static AstBounds NarrowLower(AstBounds b, AstType* t, Zone* zone) {
966 Type* lower = Type::Union(b.lower, t, zone); 1003 AstType* lower = AstType::Union(b.lower, t, zone);
967 // Lower bounds are considered approximate, correct as necessary. 1004 // Lower bounds are considered approximate, correct as necessary.
968 if (!lower->Is(b.upper)) lower = b.upper; 1005 if (!lower->Is(b.upper)) lower = b.upper;
969 return Bounds(lower, b.upper); 1006 return AstBounds(lower, b.upper);
970 } 1007 }
971 static Bounds NarrowUpper(Bounds b, Type* t, Zone* zone) { 1008 static AstBounds NarrowUpper(AstBounds b, AstType* t, Zone* zone) {
972 Type* lower = b.lower; 1009 AstType* lower = b.lower;
973 Type* upper = Type::Intersect(b.upper, t, zone); 1010 AstType* upper = AstType::Intersect(b.upper, t, zone);
974 // Lower bounds are considered approximate, correct as necessary. 1011 // Lower bounds are considered approximate, correct as necessary.
975 if (!lower->Is(upper)) lower = upper; 1012 if (!lower->Is(upper)) lower = upper;
976 return Bounds(lower, upper); 1013 return AstBounds(lower, upper);
977 } 1014 }
978 1015
979 bool Narrows(Bounds that) { 1016 bool Narrows(AstBounds that) {
980 return that.lower->Is(this->lower) && this->upper->Is(that.upper); 1017 return that.lower->Is(this->lower) && this->upper->Is(that.upper);
981 } 1018 }
982 }; 1019 };
983 1020
984 } // namespace internal 1021 } // namespace internal
985 } // namespace v8 1022 } // namespace v8
986 1023
987 #endif // V8_TYPES_H_ 1024 #endif // V8_AST_AST_TYPES_H_
OLDNEW
« no previous file with comments | « src/ast/ast-type-bounds.h ('k') | src/ast/ast-types.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698