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 #include <iomanip> | 5 #include <iomanip> |
6 | 6 |
7 #include "src/types.h" | 7 #include "src/ast/ast-types.h" |
8 | 8 |
9 #include "src/handles-inl.h" | 9 #include "src/handles-inl.h" |
10 #include "src/ostreams.h" | 10 #include "src/ostreams.h" |
11 | 11 |
12 namespace v8 { | 12 namespace v8 { |
13 namespace internal { | 13 namespace internal { |
14 | 14 |
15 | |
16 // NOTE: If code is marked as being a "shortcut", this means that removing | 15 // NOTE: If code is marked as being a "shortcut", this means that removing |
17 // the code won't affect the semantics of the surrounding function definition. | 16 // the code won't affect the semantics of the surrounding function definition. |
18 | 17 |
19 // static | 18 // static |
20 bool Type::IsInteger(i::Object* x) { | 19 bool AstType::IsInteger(i::Object* x) { |
21 return x->IsNumber() && Type::IsInteger(x->Number()); | 20 return x->IsNumber() && AstType::IsInteger(x->Number()); |
22 } | 21 } |
23 | 22 |
24 // ----------------------------------------------------------------------------- | 23 // ----------------------------------------------------------------------------- |
25 // Range-related helper functions. | 24 // Range-related helper functions. |
26 | 25 |
27 bool RangeType::Limits::IsEmpty() { return this->min > this->max; } | 26 bool AstRangeType::Limits::IsEmpty() { return this->min > this->max; } |
28 | 27 |
29 RangeType::Limits RangeType::Limits::Intersect(Limits lhs, Limits rhs) { | 28 AstRangeType::Limits AstRangeType::Limits::Intersect(Limits lhs, Limits rhs) { |
30 DisallowHeapAllocation no_allocation; | 29 DisallowHeapAllocation no_allocation; |
31 Limits result(lhs); | 30 Limits result(lhs); |
32 if (lhs.min < rhs.min) result.min = rhs.min; | 31 if (lhs.min < rhs.min) result.min = rhs.min; |
33 if (lhs.max > rhs.max) result.max = rhs.max; | 32 if (lhs.max > rhs.max) result.max = rhs.max; |
34 return result; | 33 return result; |
35 } | 34 } |
36 | 35 |
37 RangeType::Limits RangeType::Limits::Union(Limits lhs, Limits rhs) { | 36 AstRangeType::Limits AstRangeType::Limits::Union(Limits lhs, Limits rhs) { |
38 DisallowHeapAllocation no_allocation; | 37 DisallowHeapAllocation no_allocation; |
39 if (lhs.IsEmpty()) return rhs; | 38 if (lhs.IsEmpty()) return rhs; |
40 if (rhs.IsEmpty()) return lhs; | 39 if (rhs.IsEmpty()) return lhs; |
41 Limits result(lhs); | 40 Limits result(lhs); |
42 if (lhs.min > rhs.min) result.min = rhs.min; | 41 if (lhs.min > rhs.min) result.min = rhs.min; |
43 if (lhs.max < rhs.max) result.max = rhs.max; | 42 if (lhs.max < rhs.max) result.max = rhs.max; |
44 return result; | 43 return result; |
45 } | 44 } |
46 | 45 |
47 bool Type::Overlap(RangeType* lhs, RangeType* rhs) { | 46 bool AstType::Overlap(AstRangeType* lhs, AstRangeType* rhs) { |
48 DisallowHeapAllocation no_allocation; | 47 DisallowHeapAllocation no_allocation; |
49 return !RangeType::Limits::Intersect(RangeType::Limits(lhs), | 48 return !AstRangeType::Limits::Intersect(AstRangeType::Limits(lhs), |
50 RangeType::Limits(rhs)) | 49 AstRangeType::Limits(rhs)) |
51 .IsEmpty(); | 50 .IsEmpty(); |
52 } | 51 } |
53 | 52 |
54 bool Type::Contains(RangeType* lhs, RangeType* rhs) { | 53 bool AstType::Contains(AstRangeType* lhs, AstRangeType* rhs) { |
55 DisallowHeapAllocation no_allocation; | 54 DisallowHeapAllocation no_allocation; |
56 return lhs->Min() <= rhs->Min() && rhs->Max() <= lhs->Max(); | 55 return lhs->Min() <= rhs->Min() && rhs->Max() <= lhs->Max(); |
57 } | 56 } |
58 | 57 |
59 bool Type::Contains(RangeType* lhs, ConstantType* rhs) { | 58 bool AstType::Contains(AstRangeType* lhs, AstConstantType* rhs) { |
60 DisallowHeapAllocation no_allocation; | 59 DisallowHeapAllocation no_allocation; |
61 return IsInteger(*rhs->Value()) && | 60 return IsInteger(*rhs->Value()) && lhs->Min() <= rhs->Value()->Number() && |
62 lhs->Min() <= rhs->Value()->Number() && | |
63 rhs->Value()->Number() <= lhs->Max(); | 61 rhs->Value()->Number() <= lhs->Max(); |
64 } | 62 } |
65 | 63 |
66 bool Type::Contains(RangeType* range, i::Object* val) { | 64 bool AstType::Contains(AstRangeType* range, i::Object* val) { |
67 DisallowHeapAllocation no_allocation; | 65 DisallowHeapAllocation no_allocation; |
68 return IsInteger(val) && | 66 return IsInteger(val) && range->Min() <= val->Number() && |
69 range->Min() <= val->Number() && val->Number() <= range->Max(); | 67 val->Number() <= range->Max(); |
70 } | 68 } |
71 | 69 |
72 | |
73 // ----------------------------------------------------------------------------- | 70 // ----------------------------------------------------------------------------- |
74 // Min and Max computation. | 71 // Min and Max computation. |
75 | 72 |
76 double Type::Min() { | 73 double AstType::Min() { |
77 DCHECK(this->SemanticIs(Number())); | 74 DCHECK(this->SemanticIs(Number())); |
78 if (this->IsBitset()) return BitsetType::Min(this->AsBitset()); | 75 if (this->IsBitset()) return AstBitsetType::Min(this->AsBitset()); |
79 if (this->IsUnion()) { | 76 if (this->IsUnion()) { |
80 double min = +V8_INFINITY; | 77 double min = +V8_INFINITY; |
81 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 78 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
82 min = std::min(min, this->AsUnion()->Get(i)->Min()); | 79 min = std::min(min, this->AsUnion()->Get(i)->Min()); |
83 } | 80 } |
84 return min; | 81 return min; |
85 } | 82 } |
86 if (this->IsRange()) return this->AsRange()->Min(); | 83 if (this->IsRange()) return this->AsRange()->Min(); |
87 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); | 84 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
88 UNREACHABLE(); | 85 UNREACHABLE(); |
89 return 0; | 86 return 0; |
90 } | 87 } |
91 | 88 |
92 double Type::Max() { | 89 double AstType::Max() { |
93 DCHECK(this->SemanticIs(Number())); | 90 DCHECK(this->SemanticIs(Number())); |
94 if (this->IsBitset()) return BitsetType::Max(this->AsBitset()); | 91 if (this->IsBitset()) return AstBitsetType::Max(this->AsBitset()); |
95 if (this->IsUnion()) { | 92 if (this->IsUnion()) { |
96 double max = -V8_INFINITY; | 93 double max = -V8_INFINITY; |
97 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 94 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
98 max = std::max(max, this->AsUnion()->Get(i)->Max()); | 95 max = std::max(max, this->AsUnion()->Get(i)->Max()); |
99 } | 96 } |
100 return max; | 97 return max; |
101 } | 98 } |
102 if (this->IsRange()) return this->AsRange()->Max(); | 99 if (this->IsRange()) return this->AsRange()->Max(); |
103 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); | 100 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
104 UNREACHABLE(); | 101 UNREACHABLE(); |
105 return 0; | 102 return 0; |
106 } | 103 } |
107 | 104 |
108 | |
109 // ----------------------------------------------------------------------------- | 105 // ----------------------------------------------------------------------------- |
110 // Glb and lub computation. | 106 // Glb and lub computation. |
111 | 107 |
112 | |
113 // The largest bitset subsumed by this type. | 108 // The largest bitset subsumed by this type. |
114 Type::bitset BitsetType::Glb(Type* type) { | 109 AstType::bitset AstBitsetType::Glb(AstType* type) { |
115 DisallowHeapAllocation no_allocation; | 110 DisallowHeapAllocation no_allocation; |
116 // Fast case. | 111 // Fast case. |
117 if (IsBitset(type)) { | 112 if (IsBitset(type)) { |
118 return type->AsBitset(); | 113 return type->AsBitset(); |
119 } else if (type->IsUnion()) { | 114 } else if (type->IsUnion()) { |
120 SLOW_DCHECK(type->AsUnion()->Wellformed()); | 115 SLOW_DCHECK(type->AsUnion()->Wellformed()); |
121 return type->AsUnion()->Get(0)->BitsetGlb() | | 116 return type->AsUnion()->Get(0)->BitsetGlb() | |
122 SEMANTIC(type->AsUnion()->Get(1)->BitsetGlb()); // Shortcut. | 117 AST_SEMANTIC(type->AsUnion()->Get(1)->BitsetGlb()); // Shortcut. |
123 } else if (type->IsRange()) { | 118 } else if (type->IsRange()) { |
124 bitset glb = SEMANTIC( | 119 bitset glb = AST_SEMANTIC( |
125 BitsetType::Glb(type->AsRange()->Min(), type->AsRange()->Max())); | 120 AstBitsetType::Glb(type->AsRange()->Min(), type->AsRange()->Max())); |
126 return glb | REPRESENTATION(type->BitsetLub()); | 121 return glb | AST_REPRESENTATION(type->BitsetLub()); |
127 } else { | 122 } else { |
128 return type->Representation(); | 123 return type->Representation(); |
129 } | 124 } |
130 } | 125 } |
131 | 126 |
132 | |
133 // The smallest bitset subsuming this type, possibly not a proper one. | 127 // The smallest bitset subsuming this type, possibly not a proper one. |
134 Type::bitset BitsetType::Lub(Type* type) { | 128 AstType::bitset AstBitsetType::Lub(AstType* type) { |
135 DisallowHeapAllocation no_allocation; | 129 DisallowHeapAllocation no_allocation; |
136 if (IsBitset(type)) return type->AsBitset(); | 130 if (IsBitset(type)) return type->AsBitset(); |
137 if (type->IsUnion()) { | 131 if (type->IsUnion()) { |
138 // Take the representation from the first element, which is always | 132 // Take the representation from the first element, which is always |
139 // a bitset. | 133 // a bitset. |
140 int bitset = type->AsUnion()->Get(0)->BitsetLub(); | 134 int bitset = type->AsUnion()->Get(0)->BitsetLub(); |
141 for (int i = 0, n = type->AsUnion()->Length(); i < n; ++i) { | 135 for (int i = 0, n = type->AsUnion()->Length(); i < n; ++i) { |
142 // Other elements only contribute their semantic part. | 136 // Other elements only contribute their semantic part. |
143 bitset |= SEMANTIC(type->AsUnion()->Get(i)->BitsetLub()); | 137 bitset |= AST_SEMANTIC(type->AsUnion()->Get(i)->BitsetLub()); |
144 } | 138 } |
145 return bitset; | 139 return bitset; |
146 } | 140 } |
147 if (type->IsClass()) return type->AsClass()->Lub(); | 141 if (type->IsClass()) return type->AsClass()->Lub(); |
148 if (type->IsConstant()) return type->AsConstant()->Lub(); | 142 if (type->IsConstant()) return type->AsConstant()->Lub(); |
149 if (type->IsRange()) return type->AsRange()->Lub(); | 143 if (type->IsRange()) return type->AsRange()->Lub(); |
150 if (type->IsContext()) return kOtherInternal & kTaggedPointer; | 144 if (type->IsContext()) return kOtherInternal & kTaggedPointer; |
151 if (type->IsArray()) return kOtherObject; | 145 if (type->IsArray()) return kOtherObject; |
152 if (type->IsFunction()) return kFunction; | 146 if (type->IsFunction()) return kFunction; |
153 if (type->IsTuple()) return kOtherInternal; | 147 if (type->IsTuple()) return kOtherInternal; |
154 UNREACHABLE(); | 148 UNREACHABLE(); |
155 return kNone; | 149 return kNone; |
156 } | 150 } |
157 | 151 |
158 Type::bitset BitsetType::Lub(i::Map* map) { | 152 AstType::bitset AstBitsetType::Lub(i::Map* map) { |
159 DisallowHeapAllocation no_allocation; | 153 DisallowHeapAllocation no_allocation; |
160 switch (map->instance_type()) { | 154 switch (map->instance_type()) { |
161 case STRING_TYPE: | 155 case STRING_TYPE: |
162 case ONE_BYTE_STRING_TYPE: | 156 case ONE_BYTE_STRING_TYPE: |
163 case CONS_STRING_TYPE: | 157 case CONS_STRING_TYPE: |
164 case CONS_ONE_BYTE_STRING_TYPE: | 158 case CONS_ONE_BYTE_STRING_TYPE: |
165 case SLICED_STRING_TYPE: | 159 case SLICED_STRING_TYPE: |
166 case SLICED_ONE_BYTE_STRING_TYPE: | 160 case SLICED_ONE_BYTE_STRING_TYPE: |
167 case EXTERNAL_STRING_TYPE: | 161 case EXTERNAL_STRING_TYPE: |
168 case EXTERNAL_ONE_BYTE_STRING_TYPE: | 162 case EXTERNAL_ONE_BYTE_STRING_TYPE: |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 case WEAK_CELL_TYPE: | 273 case WEAK_CELL_TYPE: |
280 case PROTOTYPE_INFO_TYPE: | 274 case PROTOTYPE_INFO_TYPE: |
281 case CONTEXT_EXTENSION_TYPE: | 275 case CONTEXT_EXTENSION_TYPE: |
282 UNREACHABLE(); | 276 UNREACHABLE(); |
283 return kNone; | 277 return kNone; |
284 } | 278 } |
285 UNREACHABLE(); | 279 UNREACHABLE(); |
286 return kNone; | 280 return kNone; |
287 } | 281 } |
288 | 282 |
289 Type::bitset BitsetType::Lub(i::Object* value) { | 283 AstType::bitset AstBitsetType::Lub(i::Object* value) { |
290 DisallowHeapAllocation no_allocation; | 284 DisallowHeapAllocation no_allocation; |
291 if (value->IsNumber()) { | 285 if (value->IsNumber()) { |
292 return Lub(value->Number()) & | 286 return Lub(value->Number()) & |
293 (value->IsSmi() ? kTaggedSigned : kTaggedPointer); | 287 (value->IsSmi() ? kTaggedSigned : kTaggedPointer); |
294 } | 288 } |
295 return Lub(i::HeapObject::cast(value)->map()); | 289 return Lub(i::HeapObject::cast(value)->map()); |
296 } | 290 } |
297 | 291 |
298 Type::bitset BitsetType::Lub(double value) { | 292 AstType::bitset AstBitsetType::Lub(double value) { |
299 DisallowHeapAllocation no_allocation; | 293 DisallowHeapAllocation no_allocation; |
300 if (i::IsMinusZero(value)) return kMinusZero; | 294 if (i::IsMinusZero(value)) return kMinusZero; |
301 if (std::isnan(value)) return kNaN; | 295 if (std::isnan(value)) return kNaN; |
302 if (IsUint32Double(value) || IsInt32Double(value)) return Lub(value, value); | 296 if (IsUint32Double(value) || IsInt32Double(value)) return Lub(value, value); |
303 return kOtherNumber; | 297 return kOtherNumber; |
304 } | 298 } |
305 | 299 |
306 | |
307 // Minimum values of plain numeric bitsets. | 300 // Minimum values of plain numeric bitsets. |
308 const BitsetType::Boundary BitsetType::BoundariesArray[] = { | 301 const AstBitsetType::Boundary AstBitsetType::BoundariesArray[] = { |
309 {kOtherNumber, kPlainNumber, -V8_INFINITY}, | 302 {kOtherNumber, kPlainNumber, -V8_INFINITY}, |
310 {kOtherSigned32, kNegative32, kMinInt}, | 303 {kOtherSigned32, kNegative32, kMinInt}, |
311 {kNegative31, kNegative31, -0x40000000}, | 304 {kNegative31, kNegative31, -0x40000000}, |
312 {kUnsigned30, kUnsigned30, 0}, | 305 {kUnsigned30, kUnsigned30, 0}, |
313 {kOtherUnsigned31, kUnsigned31, 0x40000000}, | 306 {kOtherUnsigned31, kUnsigned31, 0x40000000}, |
314 {kOtherUnsigned32, kUnsigned32, 0x80000000}, | 307 {kOtherUnsigned32, kUnsigned32, 0x80000000}, |
315 {kOtherNumber, kPlainNumber, static_cast<double>(kMaxUInt32) + 1}}; | 308 {kOtherNumber, kPlainNumber, static_cast<double>(kMaxUInt32) + 1}}; |
316 | 309 |
317 const BitsetType::Boundary* BitsetType::Boundaries() { return BoundariesArray; } | 310 const AstBitsetType::Boundary* AstBitsetType::Boundaries() { |
| 311 return BoundariesArray; |
| 312 } |
318 | 313 |
319 size_t BitsetType::BoundariesSize() { | 314 size_t AstBitsetType::BoundariesSize() { |
320 // Windows doesn't like arraysize here. | 315 // Windows doesn't like arraysize here. |
321 // return arraysize(BoundariesArray); | 316 // return arraysize(BoundariesArray); |
322 return 7; | 317 return 7; |
323 } | 318 } |
324 | 319 |
325 Type::bitset BitsetType::ExpandInternals(Type::bitset bits) { | 320 AstType::bitset AstBitsetType::ExpandInternals(AstType::bitset bits) { |
326 DisallowHeapAllocation no_allocation; | 321 DisallowHeapAllocation no_allocation; |
327 if (!(bits & SEMANTIC(kPlainNumber))) return bits; // Shortcut. | 322 if (!(bits & AST_SEMANTIC(kPlainNumber))) return bits; // Shortcut. |
328 const Boundary* boundaries = Boundaries(); | 323 const Boundary* boundaries = Boundaries(); |
329 for (size_t i = 0; i < BoundariesSize(); ++i) { | 324 for (size_t i = 0; i < BoundariesSize(); ++i) { |
330 DCHECK(BitsetType::Is(boundaries[i].internal, boundaries[i].external)); | 325 DCHECK(AstBitsetType::Is(boundaries[i].internal, boundaries[i].external)); |
331 if (bits & SEMANTIC(boundaries[i].internal)) | 326 if (bits & AST_SEMANTIC(boundaries[i].internal)) |
332 bits |= SEMANTIC(boundaries[i].external); | 327 bits |= AST_SEMANTIC(boundaries[i].external); |
333 } | 328 } |
334 return bits; | 329 return bits; |
335 } | 330 } |
336 | 331 |
337 Type::bitset BitsetType::Lub(double min, double max) { | 332 AstType::bitset AstBitsetType::Lub(double min, double max) { |
338 DisallowHeapAllocation no_allocation; | 333 DisallowHeapAllocation no_allocation; |
339 int lub = kNone; | 334 int lub = kNone; |
340 const Boundary* mins = Boundaries(); | 335 const Boundary* mins = Boundaries(); |
341 | 336 |
342 for (size_t i = 1; i < BoundariesSize(); ++i) { | 337 for (size_t i = 1; i < BoundariesSize(); ++i) { |
343 if (min < mins[i].min) { | 338 if (min < mins[i].min) { |
344 lub |= mins[i-1].internal; | 339 lub |= mins[i - 1].internal; |
345 if (max < mins[i].min) return lub; | 340 if (max < mins[i].min) return lub; |
346 } | 341 } |
347 } | 342 } |
348 return lub | mins[BoundariesSize() - 1].internal; | 343 return lub | mins[BoundariesSize() - 1].internal; |
349 } | 344 } |
350 | 345 |
351 Type::bitset BitsetType::NumberBits(bitset bits) { | 346 AstType::bitset AstBitsetType::NumberBits(bitset bits) { |
352 return SEMANTIC(bits & kPlainNumber); | 347 return AST_SEMANTIC(bits & kPlainNumber); |
353 } | 348 } |
354 | 349 |
355 Type::bitset BitsetType::Glb(double min, double max) { | 350 AstType::bitset AstBitsetType::Glb(double min, double max) { |
356 DisallowHeapAllocation no_allocation; | 351 DisallowHeapAllocation no_allocation; |
357 int glb = kNone; | 352 int glb = kNone; |
358 const Boundary* mins = Boundaries(); | 353 const Boundary* mins = Boundaries(); |
359 | 354 |
360 // If the range does not touch 0, the bound is empty. | 355 // If the range does not touch 0, the bound is empty. |
361 if (max < -1 || min > 0) return glb; | 356 if (max < -1 || min > 0) return glb; |
362 | 357 |
363 for (size_t i = 1; i + 1 < BoundariesSize(); ++i) { | 358 for (size_t i = 1; i + 1 < BoundariesSize(); ++i) { |
364 if (min <= mins[i].min) { | 359 if (min <= mins[i].min) { |
365 if (max + 1 < mins[i + 1].min) break; | 360 if (max + 1 < mins[i + 1].min) break; |
366 glb |= mins[i].external; | 361 glb |= mins[i].external; |
367 } | 362 } |
368 } | 363 } |
369 // OtherNumber also contains float numbers, so it can never be | 364 // OtherNumber also contains float numbers, so it can never be |
370 // in the greatest lower bound. | 365 // in the greatest lower bound. |
371 return glb & ~(SEMANTIC(kOtherNumber)); | 366 return glb & ~(AST_SEMANTIC(kOtherNumber)); |
372 } | 367 } |
373 | 368 |
374 double BitsetType::Min(bitset bits) { | 369 double AstBitsetType::Min(bitset bits) { |
375 DisallowHeapAllocation no_allocation; | 370 DisallowHeapAllocation no_allocation; |
376 DCHECK(Is(SEMANTIC(bits), kNumber)); | 371 DCHECK(Is(AST_SEMANTIC(bits), kNumber)); |
377 const Boundary* mins = Boundaries(); | 372 const Boundary* mins = Boundaries(); |
378 bool mz = SEMANTIC(bits & kMinusZero); | 373 bool mz = AST_SEMANTIC(bits & kMinusZero); |
379 for (size_t i = 0; i < BoundariesSize(); ++i) { | 374 for (size_t i = 0; i < BoundariesSize(); ++i) { |
380 if (Is(SEMANTIC(mins[i].internal), bits)) { | 375 if (Is(AST_SEMANTIC(mins[i].internal), bits)) { |
381 return mz ? std::min(0.0, mins[i].min) : mins[i].min; | 376 return mz ? std::min(0.0, mins[i].min) : mins[i].min; |
382 } | 377 } |
383 } | 378 } |
384 if (mz) return 0; | 379 if (mz) return 0; |
385 return std::numeric_limits<double>::quiet_NaN(); | 380 return std::numeric_limits<double>::quiet_NaN(); |
386 } | 381 } |
387 | 382 |
388 double BitsetType::Max(bitset bits) { | 383 double AstBitsetType::Max(bitset bits) { |
389 DisallowHeapAllocation no_allocation; | 384 DisallowHeapAllocation no_allocation; |
390 DCHECK(Is(SEMANTIC(bits), kNumber)); | 385 DCHECK(Is(AST_SEMANTIC(bits), kNumber)); |
391 const Boundary* mins = Boundaries(); | 386 const Boundary* mins = Boundaries(); |
392 bool mz = SEMANTIC(bits & kMinusZero); | 387 bool mz = AST_SEMANTIC(bits & kMinusZero); |
393 if (BitsetType::Is(SEMANTIC(mins[BoundariesSize() - 1].internal), bits)) { | 388 if (AstBitsetType::Is(AST_SEMANTIC(mins[BoundariesSize() - 1].internal), |
| 389 bits)) { |
394 return +V8_INFINITY; | 390 return +V8_INFINITY; |
395 } | 391 } |
396 for (size_t i = BoundariesSize() - 1; i-- > 0;) { | 392 for (size_t i = BoundariesSize() - 1; i-- > 0;) { |
397 if (Is(SEMANTIC(mins[i].internal), bits)) { | 393 if (Is(AST_SEMANTIC(mins[i].internal), bits)) { |
398 return mz ? | 394 return mz ? std::max(0.0, mins[i + 1].min - 1) : mins[i + 1].min - 1; |
399 std::max(0.0, mins[i+1].min - 1) : mins[i+1].min - 1; | |
400 } | 395 } |
401 } | 396 } |
402 if (mz) return 0; | 397 if (mz) return 0; |
403 return std::numeric_limits<double>::quiet_NaN(); | 398 return std::numeric_limits<double>::quiet_NaN(); |
404 } | 399 } |
405 | 400 |
406 | |
407 // ----------------------------------------------------------------------------- | 401 // ----------------------------------------------------------------------------- |
408 // Predicates. | 402 // Predicates. |
409 | 403 |
410 bool Type::SimplyEquals(Type* that) { | 404 bool AstType::SimplyEquals(AstType* that) { |
411 DisallowHeapAllocation no_allocation; | 405 DisallowHeapAllocation no_allocation; |
412 if (this->IsClass()) { | 406 if (this->IsClass()) { |
413 return that->IsClass() | 407 return that->IsClass() && |
414 && *this->AsClass()->Map() == *that->AsClass()->Map(); | 408 *this->AsClass()->Map() == *that->AsClass()->Map(); |
415 } | 409 } |
416 if (this->IsConstant()) { | 410 if (this->IsConstant()) { |
417 return that->IsConstant() | 411 return that->IsConstant() && |
418 && *this->AsConstant()->Value() == *that->AsConstant()->Value(); | 412 *this->AsConstant()->Value() == *that->AsConstant()->Value(); |
419 } | 413 } |
420 if (this->IsContext()) { | 414 if (this->IsContext()) { |
421 return that->IsContext() | 415 return that->IsContext() && |
422 && this->AsContext()->Outer()->Equals(that->AsContext()->Outer()); | 416 this->AsContext()->Outer()->Equals(that->AsContext()->Outer()); |
423 } | 417 } |
424 if (this->IsArray()) { | 418 if (this->IsArray()) { |
425 return that->IsArray() | 419 return that->IsArray() && |
426 && this->AsArray()->Element()->Equals(that->AsArray()->Element()); | 420 this->AsArray()->Element()->Equals(that->AsArray()->Element()); |
427 } | 421 } |
428 if (this->IsFunction()) { | 422 if (this->IsFunction()) { |
429 if (!that->IsFunction()) return false; | 423 if (!that->IsFunction()) return false; |
430 FunctionType* this_fun = this->AsFunction(); | 424 AstFunctionType* this_fun = this->AsFunction(); |
431 FunctionType* that_fun = that->AsFunction(); | 425 AstFunctionType* that_fun = that->AsFunction(); |
432 if (this_fun->Arity() != that_fun->Arity() || | 426 if (this_fun->Arity() != that_fun->Arity() || |
433 !this_fun->Result()->Equals(that_fun->Result()) || | 427 !this_fun->Result()->Equals(that_fun->Result()) || |
434 !this_fun->Receiver()->Equals(that_fun->Receiver())) { | 428 !this_fun->Receiver()->Equals(that_fun->Receiver())) { |
435 return false; | 429 return false; |
436 } | 430 } |
437 for (int i = 0, n = this_fun->Arity(); i < n; ++i) { | 431 for (int i = 0, n = this_fun->Arity(); i < n; ++i) { |
438 if (!this_fun->Parameter(i)->Equals(that_fun->Parameter(i))) return false; | 432 if (!this_fun->Parameter(i)->Equals(that_fun->Parameter(i))) return false; |
439 } | 433 } |
440 return true; | 434 return true; |
441 } | 435 } |
442 if (this->IsTuple()) { | 436 if (this->IsTuple()) { |
443 if (!that->IsTuple()) return false; | 437 if (!that->IsTuple()) return false; |
444 TupleType* this_tuple = this->AsTuple(); | 438 AstTupleType* this_tuple = this->AsTuple(); |
445 TupleType* that_tuple = that->AsTuple(); | 439 AstTupleType* that_tuple = that->AsTuple(); |
446 if (this_tuple->Arity() != that_tuple->Arity()) { | 440 if (this_tuple->Arity() != that_tuple->Arity()) { |
447 return false; | 441 return false; |
448 } | 442 } |
449 for (int i = 0, n = this_tuple->Arity(); i < n; ++i) { | 443 for (int i = 0, n = this_tuple->Arity(); i < n; ++i) { |
450 if (!this_tuple->Element(i)->Equals(that_tuple->Element(i))) return false; | 444 if (!this_tuple->Element(i)->Equals(that_tuple->Element(i))) return false; |
451 } | 445 } |
452 return true; | 446 return true; |
453 } | 447 } |
454 UNREACHABLE(); | 448 UNREACHABLE(); |
455 return false; | 449 return false; |
456 } | 450 } |
457 | 451 |
458 Type::bitset Type::Representation() { | 452 AstType::bitset AstType::Representation() { |
459 return REPRESENTATION(this->BitsetLub()); | 453 return AST_REPRESENTATION(this->BitsetLub()); |
460 } | 454 } |
461 | 455 |
462 | |
463 // Check if [this] <= [that]. | 456 // Check if [this] <= [that]. |
464 bool Type::SlowIs(Type* that) { | 457 bool AstType::SlowIs(AstType* that) { |
465 DisallowHeapAllocation no_allocation; | 458 DisallowHeapAllocation no_allocation; |
466 | 459 |
467 // Fast bitset cases | 460 // Fast bitset cases |
468 if (that->IsBitset()) { | 461 if (that->IsBitset()) { |
469 return BitsetType::Is(this->BitsetLub(), that->AsBitset()); | 462 return AstBitsetType::Is(this->BitsetLub(), that->AsBitset()); |
470 } | 463 } |
471 | 464 |
472 if (this->IsBitset()) { | 465 if (this->IsBitset()) { |
473 return BitsetType::Is(this->AsBitset(), that->BitsetGlb()); | 466 return AstBitsetType::Is(this->AsBitset(), that->BitsetGlb()); |
474 } | 467 } |
475 | 468 |
476 // Check the representations. | 469 // Check the representations. |
477 if (!BitsetType::Is(Representation(), that->Representation())) { | 470 if (!AstBitsetType::Is(Representation(), that->Representation())) { |
478 return false; | 471 return false; |
479 } | 472 } |
480 | 473 |
481 // Check the semantic part. | 474 // Check the semantic part. |
482 return SemanticIs(that); | 475 return SemanticIs(that); |
483 } | 476 } |
484 | 477 |
485 | 478 // Check if AST_SEMANTIC([this]) <= AST_SEMANTIC([that]). The result of the |
486 // Check if SEMANTIC([this]) <= SEMANTIC([that]). The result of the method | 479 // method |
487 // should be independent of the representation axis of the types. | 480 // should be independent of the representation axis of the types. |
488 bool Type::SemanticIs(Type* that) { | 481 bool AstType::SemanticIs(AstType* that) { |
489 DisallowHeapAllocation no_allocation; | 482 DisallowHeapAllocation no_allocation; |
490 | 483 |
491 if (this == that) return true; | 484 if (this == that) return true; |
492 | 485 |
493 if (that->IsBitset()) { | 486 if (that->IsBitset()) { |
494 return BitsetType::Is(SEMANTIC(this->BitsetLub()), that->AsBitset()); | 487 return AstBitsetType::Is(AST_SEMANTIC(this->BitsetLub()), that->AsBitset()); |
495 } | 488 } |
496 if (this->IsBitset()) { | 489 if (this->IsBitset()) { |
497 return BitsetType::Is(SEMANTIC(this->AsBitset()), that->BitsetGlb()); | 490 return AstBitsetType::Is(AST_SEMANTIC(this->AsBitset()), that->BitsetGlb()); |
498 } | 491 } |
499 | 492 |
500 // (T1 \/ ... \/ Tn) <= T if (T1 <= T) /\ ... /\ (Tn <= T) | 493 // (T1 \/ ... \/ Tn) <= T if (T1 <= T) /\ ... /\ (Tn <= T) |
501 if (this->IsUnion()) { | 494 if (this->IsUnion()) { |
502 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 495 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
503 if (!this->AsUnion()->Get(i)->SemanticIs(that)) return false; | 496 if (!this->AsUnion()->Get(i)->SemanticIs(that)) return false; |
504 } | 497 } |
505 return true; | 498 return true; |
506 } | 499 } |
507 | 500 |
(...skipping 10 matching lines...) Expand all Loading... |
518 return (this->IsRange() && Contains(that->AsRange(), this->AsRange())) || | 511 return (this->IsRange() && Contains(that->AsRange(), this->AsRange())) || |
519 (this->IsConstant() && | 512 (this->IsConstant() && |
520 Contains(that->AsRange(), this->AsConstant())); | 513 Contains(that->AsRange(), this->AsConstant())); |
521 } | 514 } |
522 if (this->IsRange()) return false; | 515 if (this->IsRange()) return false; |
523 | 516 |
524 return this->SimplyEquals(that); | 517 return this->SimplyEquals(that); |
525 } | 518 } |
526 | 519 |
527 // Most precise _current_ type of a value (usually its class). | 520 // Most precise _current_ type of a value (usually its class). |
528 Type* Type::NowOf(i::Object* value, Zone* zone) { | 521 AstType* AstType::NowOf(i::Object* value, Zone* zone) { |
529 if (value->IsSmi() || | 522 if (value->IsSmi() || |
530 i::HeapObject::cast(value)->map()->instance_type() == HEAP_NUMBER_TYPE) { | 523 i::HeapObject::cast(value)->map()->instance_type() == HEAP_NUMBER_TYPE) { |
531 return Of(value, zone); | 524 return Of(value, zone); |
532 } | 525 } |
533 return Class(i::handle(i::HeapObject::cast(value)->map()), zone); | 526 return Class(i::handle(i::HeapObject::cast(value)->map()), zone); |
534 } | 527 } |
535 | 528 |
536 bool Type::NowContains(i::Object* value) { | 529 bool AstType::NowContains(i::Object* value) { |
537 DisallowHeapAllocation no_allocation; | 530 DisallowHeapAllocation no_allocation; |
538 if (this->IsAny()) return true; | 531 if (this->IsAny()) return true; |
539 if (value->IsHeapObject()) { | 532 if (value->IsHeapObject()) { |
540 i::Map* map = i::HeapObject::cast(value)->map(); | 533 i::Map* map = i::HeapObject::cast(value)->map(); |
541 for (Iterator<i::Map> it = this->Classes(); !it.Done(); it.Advance()) { | 534 for (Iterator<i::Map> it = this->Classes(); !it.Done(); it.Advance()) { |
542 if (*it.Current() == map) return true; | 535 if (*it.Current() == map) return true; |
543 } | 536 } |
544 } | 537 } |
545 return this->Contains(value); | 538 return this->Contains(value); |
546 } | 539 } |
547 | 540 |
548 bool Type::NowIs(Type* that) { | 541 bool AstType::NowIs(AstType* that) { |
549 DisallowHeapAllocation no_allocation; | 542 DisallowHeapAllocation no_allocation; |
550 | 543 |
551 // TODO(rossberg): this is incorrect for | 544 // TODO(rossberg): this is incorrect for |
552 // Union(Constant(V), T)->NowIs(Class(M)) | 545 // Union(Constant(V), T)->NowIs(Class(M)) |
553 // but fuzzing does not cover that! | 546 // but fuzzing does not cover that! |
554 if (this->IsConstant()) { | 547 if (this->IsConstant()) { |
555 i::Object* object = *this->AsConstant()->Value(); | 548 i::Object* object = *this->AsConstant()->Value(); |
556 if (object->IsHeapObject()) { | 549 if (object->IsHeapObject()) { |
557 i::Map* map = i::HeapObject::cast(object)->map(); | 550 i::Map* map = i::HeapObject::cast(object)->map(); |
558 for (Iterator<i::Map> it = that->Classes(); !it.Done(); it.Advance()) { | 551 for (Iterator<i::Map> it = that->Classes(); !it.Done(); it.Advance()) { |
559 if (*it.Current() == map) return true; | 552 if (*it.Current() == map) return true; |
560 } | 553 } |
561 } | 554 } |
562 } | 555 } |
563 return this->Is(that); | 556 return this->Is(that); |
564 } | 557 } |
565 | 558 |
566 | |
567 // Check if [this] contains only (currently) stable classes. | 559 // Check if [this] contains only (currently) stable classes. |
568 bool Type::NowStable() { | 560 bool AstType::NowStable() { |
569 DisallowHeapAllocation no_allocation; | 561 DisallowHeapAllocation no_allocation; |
570 return !this->IsClass() || this->AsClass()->Map()->is_stable(); | 562 return !this->IsClass() || this->AsClass()->Map()->is_stable(); |
571 } | 563 } |
572 | 564 |
573 | |
574 // Check if [this] and [that] overlap. | 565 // Check if [this] and [that] overlap. |
575 bool Type::Maybe(Type* that) { | 566 bool AstType::Maybe(AstType* that) { |
576 DisallowHeapAllocation no_allocation; | 567 DisallowHeapAllocation no_allocation; |
577 | 568 |
578 // Take care of the representation part (and also approximate | 569 // Take care of the representation part (and also approximate |
579 // the semantic part). | 570 // the semantic part). |
580 if (!BitsetType::IsInhabited(this->BitsetLub() & that->BitsetLub())) | 571 if (!AstBitsetType::IsInhabited(this->BitsetLub() & that->BitsetLub())) |
581 return false; | 572 return false; |
582 | 573 |
583 return SemanticMaybe(that); | 574 return SemanticMaybe(that); |
584 } | 575 } |
585 | 576 |
586 bool Type::SemanticMaybe(Type* that) { | 577 bool AstType::SemanticMaybe(AstType* that) { |
587 DisallowHeapAllocation no_allocation; | 578 DisallowHeapAllocation no_allocation; |
588 | 579 |
589 // (T1 \/ ... \/ Tn) overlaps T if (T1 overlaps T) \/ ... \/ (Tn overlaps T) | 580 // (T1 \/ ... \/ Tn) overlaps T if (T1 overlaps T) \/ ... \/ (Tn overlaps T) |
590 if (this->IsUnion()) { | 581 if (this->IsUnion()) { |
591 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 582 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
592 if (this->AsUnion()->Get(i)->SemanticMaybe(that)) return true; | 583 if (this->AsUnion()->Get(i)->SemanticMaybe(that)) return true; |
593 } | 584 } |
594 return false; | 585 return false; |
595 } | 586 } |
596 | 587 |
597 // T overlaps (T1 \/ ... \/ Tn) if (T overlaps T1) \/ ... \/ (T overlaps Tn) | 588 // T overlaps (T1 \/ ... \/ Tn) if (T overlaps T1) \/ ... \/ (T overlaps Tn) |
598 if (that->IsUnion()) { | 589 if (that->IsUnion()) { |
599 for (int i = 0, n = that->AsUnion()->Length(); i < n; ++i) { | 590 for (int i = 0, n = that->AsUnion()->Length(); i < n; ++i) { |
600 if (this->SemanticMaybe(that->AsUnion()->Get(i))) return true; | 591 if (this->SemanticMaybe(that->AsUnion()->Get(i))) return true; |
601 } | 592 } |
602 return false; | 593 return false; |
603 } | 594 } |
604 | 595 |
605 if (!BitsetType::SemanticIsInhabited(this->BitsetLub() & that->BitsetLub())) | 596 if (!AstBitsetType::SemanticIsInhabited(this->BitsetLub() & |
| 597 that->BitsetLub())) |
606 return false; | 598 return false; |
607 | 599 |
608 if (this->IsBitset() && that->IsBitset()) return true; | 600 if (this->IsBitset() && that->IsBitset()) return true; |
609 | 601 |
610 if (this->IsClass() != that->IsClass()) return true; | 602 if (this->IsClass() != that->IsClass()) return true; |
611 | 603 |
612 if (this->IsRange()) { | 604 if (this->IsRange()) { |
613 if (that->IsConstant()) { | 605 if (that->IsConstant()) { |
614 return Contains(this->AsRange(), that->AsConstant()); | 606 return Contains(this->AsRange(), that->AsConstant()); |
615 } | 607 } |
616 if (that->IsRange()) { | 608 if (that->IsRange()) { |
617 return Overlap(this->AsRange(), that->AsRange()); | 609 return Overlap(this->AsRange(), that->AsRange()); |
618 } | 610 } |
619 if (that->IsBitset()) { | 611 if (that->IsBitset()) { |
620 bitset number_bits = BitsetType::NumberBits(that->AsBitset()); | 612 bitset number_bits = AstBitsetType::NumberBits(that->AsBitset()); |
621 if (number_bits == BitsetType::kNone) { | 613 if (number_bits == AstBitsetType::kNone) { |
622 return false; | 614 return false; |
623 } | 615 } |
624 double min = std::max(BitsetType::Min(number_bits), this->Min()); | 616 double min = std::max(AstBitsetType::Min(number_bits), this->Min()); |
625 double max = std::min(BitsetType::Max(number_bits), this->Max()); | 617 double max = std::min(AstBitsetType::Max(number_bits), this->Max()); |
626 return min <= max; | 618 return min <= max; |
627 } | 619 } |
628 } | 620 } |
629 if (that->IsRange()) { | 621 if (that->IsRange()) { |
630 return that->SemanticMaybe(this); // This case is handled above. | 622 return that->SemanticMaybe(this); // This case is handled above. |
631 } | 623 } |
632 | 624 |
633 if (this->IsBitset() || that->IsBitset()) return true; | 625 if (this->IsBitset() || that->IsBitset()) return true; |
634 | 626 |
635 return this->SimplyEquals(that); | 627 return this->SimplyEquals(that); |
636 } | 628 } |
637 | 629 |
638 | |
639 // Return the range in [this], or [NULL]. | 630 // Return the range in [this], or [NULL]. |
640 Type* Type::GetRange() { | 631 AstType* AstType::GetRange() { |
641 DisallowHeapAllocation no_allocation; | 632 DisallowHeapAllocation no_allocation; |
642 if (this->IsRange()) return this; | 633 if (this->IsRange()) return this; |
643 if (this->IsUnion() && this->AsUnion()->Get(1)->IsRange()) { | 634 if (this->IsUnion() && this->AsUnion()->Get(1)->IsRange()) { |
644 return this->AsUnion()->Get(1); | 635 return this->AsUnion()->Get(1); |
645 } | 636 } |
646 return NULL; | 637 return NULL; |
647 } | 638 } |
648 | 639 |
649 bool Type::Contains(i::Object* value) { | 640 bool AstType::Contains(i::Object* value) { |
650 DisallowHeapAllocation no_allocation; | 641 DisallowHeapAllocation no_allocation; |
651 for (Iterator<i::Object> it = this->Constants(); !it.Done(); it.Advance()) { | 642 for (Iterator<i::Object> it = this->Constants(); !it.Done(); it.Advance()) { |
652 if (*it.Current() == value) return true; | 643 if (*it.Current() == value) return true; |
653 } | 644 } |
654 if (IsInteger(value)) { | 645 if (IsInteger(value)) { |
655 Type* range = this->GetRange(); | 646 AstType* range = this->GetRange(); |
656 if (range != NULL && Contains(range->AsRange(), value)) return true; | 647 if (range != NULL && Contains(range->AsRange(), value)) return true; |
657 } | 648 } |
658 return BitsetType::New(BitsetType::Lub(value))->Is(this); | 649 return AstBitsetType::New(AstBitsetType::Lub(value))->Is(this); |
659 } | 650 } |
660 | 651 |
661 bool UnionType::Wellformed() { | 652 bool AstUnionType::Wellformed() { |
662 DisallowHeapAllocation no_allocation; | 653 DisallowHeapAllocation no_allocation; |
663 // This checks the invariants of the union representation: | 654 // This checks the invariants of the union representation: |
664 // 1. There are at least two elements. | 655 // 1. There are at least two elements. |
665 // 2. The first element is a bitset, no other element is a bitset. | 656 // 2. The first element is a bitset, no other element is a bitset. |
666 // 3. At most one element is a range, and it must be the second one. | 657 // 3. At most one element is a range, and it must be the second one. |
667 // 4. No element is itself a union. | 658 // 4. No element is itself a union. |
668 // 5. No element (except the bitset) is a subtype of any other. | 659 // 5. No element (except the bitset) is a subtype of any other. |
669 // 6. If there is a range, then the bitset type does not contain | 660 // 6. If there is a range, then the bitset type does not contain |
670 // plain number bits. | 661 // plain number bits. |
671 DCHECK(this->Length() >= 2); // (1) | 662 DCHECK(this->Length() >= 2); // (1) |
672 DCHECK(this->Get(0)->IsBitset()); // (2a) | 663 DCHECK(this->Get(0)->IsBitset()); // (2a) |
673 | 664 |
674 for (int i = 0; i < this->Length(); ++i) { | 665 for (int i = 0; i < this->Length(); ++i) { |
675 if (i != 0) DCHECK(!this->Get(i)->IsBitset()); // (2b) | 666 if (i != 0) DCHECK(!this->Get(i)->IsBitset()); // (2b) |
676 if (i != 1) DCHECK(!this->Get(i)->IsRange()); // (3) | 667 if (i != 1) DCHECK(!this->Get(i)->IsRange()); // (3) |
677 DCHECK(!this->Get(i)->IsUnion()); // (4) | 668 DCHECK(!this->Get(i)->IsUnion()); // (4) |
678 for (int j = 0; j < this->Length(); ++j) { | 669 for (int j = 0; j < this->Length(); ++j) { |
679 if (i != j && i != 0) | 670 if (i != j && i != 0) |
680 DCHECK(!this->Get(i)->SemanticIs(this->Get(j))); // (5) | 671 DCHECK(!this->Get(i)->SemanticIs(this->Get(j))); // (5) |
681 } | 672 } |
682 } | 673 } |
683 DCHECK(!this->Get(1)->IsRange() || | 674 DCHECK(!this->Get(1)->IsRange() || |
684 (BitsetType::NumberBits(this->Get(0)->AsBitset()) == | 675 (AstBitsetType::NumberBits(this->Get(0)->AsBitset()) == |
685 BitsetType::kNone)); // (6) | 676 AstBitsetType::kNone)); // (6) |
686 return true; | 677 return true; |
687 } | 678 } |
688 | 679 |
689 | |
690 // ----------------------------------------------------------------------------- | 680 // ----------------------------------------------------------------------------- |
691 // Union and intersection | 681 // Union and intersection |
692 | 682 |
693 | |
694 static bool AddIsSafe(int x, int y) { | 683 static bool AddIsSafe(int x, int y) { |
695 return x >= 0 ? | 684 return x >= 0 ? y <= std::numeric_limits<int>::max() - x |
696 y <= std::numeric_limits<int>::max() - x : | 685 : y >= std::numeric_limits<int>::min() - x; |
697 y >= std::numeric_limits<int>::min() - x; | |
698 } | 686 } |
699 | 687 |
700 Type* Type::Intersect(Type* type1, Type* type2, Zone* zone) { | 688 AstType* AstType::Intersect(AstType* type1, AstType* type2, Zone* zone) { |
701 // Fast case: bit sets. | 689 // Fast case: bit sets. |
702 if (type1->IsBitset() && type2->IsBitset()) { | 690 if (type1->IsBitset() && type2->IsBitset()) { |
703 return BitsetType::New(type1->AsBitset() & type2->AsBitset()); | 691 return AstBitsetType::New(type1->AsBitset() & type2->AsBitset()); |
704 } | 692 } |
705 | 693 |
706 // Fast case: top or bottom types. | 694 // Fast case: top or bottom types. |
707 if (type1->IsNone() || type2->IsAny()) return type1; // Shortcut. | 695 if (type1->IsNone() || type2->IsAny()) return type1; // Shortcut. |
708 if (type2->IsNone() || type1->IsAny()) return type2; // Shortcut. | 696 if (type2->IsNone() || type1->IsAny()) return type2; // Shortcut. |
709 | 697 |
710 // Semi-fast case. | 698 // Semi-fast case. |
711 if (type1->Is(type2)) return type1; | 699 if (type1->Is(type2)) return type1; |
712 if (type2->Is(type1)) return type2; | 700 if (type2->Is(type1)) return type2; |
713 | 701 |
(...skipping 10 matching lines...) Expand all Loading... |
724 // semi-fast case above - we should behave the same way regardless of | 712 // semi-fast case above - we should behave the same way regardless of |
725 // representations. Intersection with a universal bitset should only update | 713 // representations. Intersection with a universal bitset should only update |
726 // the representations. | 714 // the representations. |
727 if (type1->SemanticIs(type2)) { | 715 if (type1->SemanticIs(type2)) { |
728 type2 = Any(); | 716 type2 = Any(); |
729 } else if (type2->SemanticIs(type1)) { | 717 } else if (type2->SemanticIs(type1)) { |
730 type1 = Any(); | 718 type1 = Any(); |
731 } | 719 } |
732 | 720 |
733 bitset bits = | 721 bitset bits = |
734 SEMANTIC(type1->BitsetGlb() & type2->BitsetGlb()) | representation; | 722 AST_SEMANTIC(type1->BitsetGlb() & type2->BitsetGlb()) | representation; |
735 int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; | 723 int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; |
736 int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; | 724 int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; |
737 if (!AddIsSafe(size1, size2)) return Any(); | 725 if (!AddIsSafe(size1, size2)) return Any(); |
738 int size = size1 + size2; | 726 int size = size1 + size2; |
739 if (!AddIsSafe(size, 2)) return Any(); | 727 if (!AddIsSafe(size, 2)) return Any(); |
740 size += 2; | 728 size += 2; |
741 Type* result_type = UnionType::New(size, zone); | 729 AstType* result_type = AstUnionType::New(size, zone); |
742 UnionType* result = result_type->AsUnion(); | 730 AstUnionType* result = result_type->AsUnion(); |
743 size = 0; | 731 size = 0; |
744 | 732 |
745 // Deal with bitsets. | 733 // Deal with bitsets. |
746 result->Set(size++, BitsetType::New(bits)); | 734 result->Set(size++, AstBitsetType::New(bits)); |
747 | 735 |
748 RangeType::Limits lims = RangeType::Limits::Empty(); | 736 AstRangeType::Limits lims = AstRangeType::Limits::Empty(); |
749 size = IntersectAux(type1, type2, result, size, &lims, zone); | 737 size = IntersectAux(type1, type2, result, size, &lims, zone); |
750 | 738 |
751 // If the range is not empty, then insert it into the union and | 739 // If the range is not empty, then insert it into the union and |
752 // remove the number bits from the bitset. | 740 // remove the number bits from the bitset. |
753 if (!lims.IsEmpty()) { | 741 if (!lims.IsEmpty()) { |
754 size = UpdateRange(RangeType::New(lims, representation, zone), result, size, | 742 size = UpdateRange(AstRangeType::New(lims, representation, zone), result, |
755 zone); | 743 size, zone); |
756 | 744 |
757 // Remove the number bits. | 745 // Remove the number bits. |
758 bitset number_bits = BitsetType::NumberBits(bits); | 746 bitset number_bits = AstBitsetType::NumberBits(bits); |
759 bits &= ~number_bits; | 747 bits &= ~number_bits; |
760 result->Set(0, BitsetType::New(bits)); | 748 result->Set(0, AstBitsetType::New(bits)); |
761 } | 749 } |
762 return NormalizeUnion(result_type, size, zone); | 750 return NormalizeUnion(result_type, size, zone); |
763 } | 751 } |
764 | 752 |
765 int Type::UpdateRange(Type* range, UnionType* result, int size, Zone* zone) { | 753 int AstType::UpdateRange(AstType* range, AstUnionType* result, int size, |
| 754 Zone* zone) { |
766 if (size == 1) { | 755 if (size == 1) { |
767 result->Set(size++, range); | 756 result->Set(size++, range); |
768 } else { | 757 } else { |
769 // Make space for the range. | 758 // Make space for the range. |
770 result->Set(size++, result->Get(1)); | 759 result->Set(size++, result->Get(1)); |
771 result->Set(1, range); | 760 result->Set(1, range); |
772 } | 761 } |
773 | 762 |
774 // Remove any components that just got subsumed. | 763 // Remove any components that just got subsumed. |
775 for (int i = 2; i < size; ) { | 764 for (int i = 2; i < size;) { |
776 if (result->Get(i)->SemanticIs(range)) { | 765 if (result->Get(i)->SemanticIs(range)) { |
777 result->Set(i, result->Get(--size)); | 766 result->Set(i, result->Get(--size)); |
778 } else { | 767 } else { |
779 ++i; | 768 ++i; |
780 } | 769 } |
781 } | 770 } |
782 return size; | 771 return size; |
783 } | 772 } |
784 | 773 |
785 RangeType::Limits Type::ToLimits(bitset bits, Zone* zone) { | 774 AstRangeType::Limits AstType::ToLimits(bitset bits, Zone* zone) { |
786 bitset number_bits = BitsetType::NumberBits(bits); | 775 bitset number_bits = AstBitsetType::NumberBits(bits); |
787 | 776 |
788 if (number_bits == BitsetType::kNone) { | 777 if (number_bits == AstBitsetType::kNone) { |
789 return RangeType::Limits::Empty(); | 778 return AstRangeType::Limits::Empty(); |
790 } | 779 } |
791 | 780 |
792 return RangeType::Limits(BitsetType::Min(number_bits), | 781 return AstRangeType::Limits(AstBitsetType::Min(number_bits), |
793 BitsetType::Max(number_bits)); | 782 AstBitsetType::Max(number_bits)); |
794 } | 783 } |
795 | 784 |
796 RangeType::Limits Type::IntersectRangeAndBitset(Type* range, Type* bitset, | 785 AstRangeType::Limits AstType::IntersectRangeAndBitset(AstType* range, |
797 Zone* zone) { | 786 AstType* bitset, |
798 RangeType::Limits range_lims(range->AsRange()); | 787 Zone* zone) { |
799 RangeType::Limits bitset_lims = ToLimits(bitset->AsBitset(), zone); | 788 AstRangeType::Limits range_lims(range->AsRange()); |
800 return RangeType::Limits::Intersect(range_lims, bitset_lims); | 789 AstRangeType::Limits bitset_lims = ToLimits(bitset->AsBitset(), zone); |
| 790 return AstRangeType::Limits::Intersect(range_lims, bitset_lims); |
801 } | 791 } |
802 | 792 |
803 int Type::IntersectAux(Type* lhs, Type* rhs, UnionType* result, int size, | 793 int AstType::IntersectAux(AstType* lhs, AstType* rhs, AstUnionType* result, |
804 RangeType::Limits* lims, Zone* zone) { | 794 int size, AstRangeType::Limits* lims, Zone* zone) { |
805 if (lhs->IsUnion()) { | 795 if (lhs->IsUnion()) { |
806 for (int i = 0, n = lhs->AsUnion()->Length(); i < n; ++i) { | 796 for (int i = 0, n = lhs->AsUnion()->Length(); i < n; ++i) { |
807 size = | 797 size = |
808 IntersectAux(lhs->AsUnion()->Get(i), rhs, result, size, lims, zone); | 798 IntersectAux(lhs->AsUnion()->Get(i), rhs, result, size, lims, zone); |
809 } | 799 } |
810 return size; | 800 return size; |
811 } | 801 } |
812 if (rhs->IsUnion()) { | 802 if (rhs->IsUnion()) { |
813 for (int i = 0, n = rhs->AsUnion()->Length(); i < n; ++i) { | 803 for (int i = 0, n = rhs->AsUnion()->Length(); i < n; ++i) { |
814 size = | 804 size = |
815 IntersectAux(lhs, rhs->AsUnion()->Get(i), result, size, lims, zone); | 805 IntersectAux(lhs, rhs->AsUnion()->Get(i), result, size, lims, zone); |
816 } | 806 } |
817 return size; | 807 return size; |
818 } | 808 } |
819 | 809 |
820 if (!BitsetType::SemanticIsInhabited(lhs->BitsetLub() & rhs->BitsetLub())) { | 810 if (!AstBitsetType::SemanticIsInhabited(lhs->BitsetLub() & |
| 811 rhs->BitsetLub())) { |
821 return size; | 812 return size; |
822 } | 813 } |
823 | 814 |
824 if (lhs->IsRange()) { | 815 if (lhs->IsRange()) { |
825 if (rhs->IsBitset()) { | 816 if (rhs->IsBitset()) { |
826 RangeType::Limits lim = IntersectRangeAndBitset(lhs, rhs, zone); | 817 AstRangeType::Limits lim = IntersectRangeAndBitset(lhs, rhs, zone); |
827 | 818 |
828 if (!lim.IsEmpty()) { | 819 if (!lim.IsEmpty()) { |
829 *lims = RangeType::Limits::Union(lim, *lims); | 820 *lims = AstRangeType::Limits::Union(lim, *lims); |
830 } | 821 } |
831 return size; | 822 return size; |
832 } | 823 } |
833 if (rhs->IsClass()) { | 824 if (rhs->IsClass()) { |
834 *lims = | 825 *lims = AstRangeType::Limits::Union(AstRangeType::Limits(lhs->AsRange()), |
835 RangeType::Limits::Union(RangeType::Limits(lhs->AsRange()), *lims); | 826 *lims); |
836 } | 827 } |
837 if (rhs->IsConstant() && Contains(lhs->AsRange(), rhs->AsConstant())) { | 828 if (rhs->IsConstant() && Contains(lhs->AsRange(), rhs->AsConstant())) { |
838 return AddToUnion(rhs, result, size, zone); | 829 return AddToUnion(rhs, result, size, zone); |
839 } | 830 } |
840 if (rhs->IsRange()) { | 831 if (rhs->IsRange()) { |
841 RangeType::Limits lim = RangeType::Limits::Intersect( | 832 AstRangeType::Limits lim = |
842 RangeType::Limits(lhs->AsRange()), RangeType::Limits(rhs->AsRange())); | 833 AstRangeType::Limits::Intersect(AstRangeType::Limits(lhs->AsRange()), |
| 834 AstRangeType::Limits(rhs->AsRange())); |
843 if (!lim.IsEmpty()) { | 835 if (!lim.IsEmpty()) { |
844 *lims = RangeType::Limits::Union(lim, *lims); | 836 *lims = AstRangeType::Limits::Union(lim, *lims); |
845 } | 837 } |
846 } | 838 } |
847 return size; | 839 return size; |
848 } | 840 } |
849 if (rhs->IsRange()) { | 841 if (rhs->IsRange()) { |
850 // This case is handled symmetrically above. | 842 // This case is handled symmetrically above. |
851 return IntersectAux(rhs, lhs, result, size, lims, zone); | 843 return IntersectAux(rhs, lhs, result, size, lims, zone); |
852 } | 844 } |
853 if (lhs->IsBitset() || rhs->IsBitset()) { | 845 if (lhs->IsBitset() || rhs->IsBitset()) { |
854 return AddToUnion(lhs->IsBitset() ? rhs : lhs, result, size, zone); | 846 return AddToUnion(lhs->IsBitset() ? rhs : lhs, result, size, zone); |
855 } | 847 } |
856 if (lhs->IsClass() != rhs->IsClass()) { | 848 if (lhs->IsClass() != rhs->IsClass()) { |
857 return AddToUnion(lhs->IsClass() ? rhs : lhs, result, size, zone); | 849 return AddToUnion(lhs->IsClass() ? rhs : lhs, result, size, zone); |
858 } | 850 } |
859 if (lhs->SimplyEquals(rhs)) { | 851 if (lhs->SimplyEquals(rhs)) { |
860 return AddToUnion(lhs, result, size, zone); | 852 return AddToUnion(lhs, result, size, zone); |
861 } | 853 } |
862 return size; | 854 return size; |
863 } | 855 } |
864 | 856 |
865 | |
866 // Make sure that we produce a well-formed range and bitset: | 857 // Make sure that we produce a well-formed range and bitset: |
867 // If the range is non-empty, the number bits in the bitset should be | 858 // If the range is non-empty, the number bits in the bitset should be |
868 // clear. Moreover, if we have a canonical range (such as Signed32), | 859 // clear. Moreover, if we have a canonical range (such as Signed32), |
869 // we want to produce a bitset rather than a range. | 860 // we want to produce a bitset rather than a range. |
870 Type* Type::NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone) { | 861 AstType* AstType::NormalizeRangeAndBitset(AstType* range, bitset* bits, |
| 862 Zone* zone) { |
871 // Fast path: If the bitset does not mention numbers, we can just keep the | 863 // Fast path: If the bitset does not mention numbers, we can just keep the |
872 // range. | 864 // range. |
873 bitset number_bits = BitsetType::NumberBits(*bits); | 865 bitset number_bits = AstBitsetType::NumberBits(*bits); |
874 if (number_bits == 0) { | 866 if (number_bits == 0) { |
875 return range; | 867 return range; |
876 } | 868 } |
877 | 869 |
878 // If the range is semantically contained within the bitset, return None and | 870 // If the range is semantically contained within the bitset, return None and |
879 // leave the bitset untouched. | 871 // leave the bitset untouched. |
880 bitset range_lub = SEMANTIC(range->BitsetLub()); | 872 bitset range_lub = AST_SEMANTIC(range->BitsetLub()); |
881 if (BitsetType::Is(range_lub, *bits)) { | 873 if (AstBitsetType::Is(range_lub, *bits)) { |
882 return None(); | 874 return None(); |
883 } | 875 } |
884 | 876 |
885 // Slow path: reconcile the bitset range and the range. | 877 // Slow path: reconcile the bitset range and the range. |
886 double bitset_min = BitsetType::Min(number_bits); | 878 double bitset_min = AstBitsetType::Min(number_bits); |
887 double bitset_max = BitsetType::Max(number_bits); | 879 double bitset_max = AstBitsetType::Max(number_bits); |
888 | 880 |
889 double range_min = range->Min(); | 881 double range_min = range->Min(); |
890 double range_max = range->Max(); | 882 double range_max = range->Max(); |
891 | 883 |
892 // Remove the number bits from the bitset, they would just confuse us now. | 884 // Remove the number bits from the bitset, they would just confuse us now. |
893 // NOTE: bits contains OtherNumber iff bits contains PlainNumber, in which | 885 // NOTE: bits contains OtherNumber iff bits contains PlainNumber, in which |
894 // case we already returned after the subtype check above. | 886 // case we already returned after the subtype check above. |
895 *bits &= ~number_bits; | 887 *bits &= ~number_bits; |
896 | 888 |
897 if (range_min <= bitset_min && range_max >= bitset_max) { | 889 if (range_min <= bitset_min && range_max >= bitset_max) { |
898 // Bitset is contained within the range, just return the range. | 890 // Bitset is contained within the range, just return the range. |
899 return range; | 891 return range; |
900 } | 892 } |
901 | 893 |
902 if (bitset_min < range_min) { | 894 if (bitset_min < range_min) { |
903 range_min = bitset_min; | 895 range_min = bitset_min; |
904 } | 896 } |
905 if (bitset_max > range_max) { | 897 if (bitset_max > range_max) { |
906 range_max = bitset_max; | 898 range_max = bitset_max; |
907 } | 899 } |
908 return RangeType::New(range_min, range_max, BitsetType::kNone, zone); | 900 return AstRangeType::New(range_min, range_max, AstBitsetType::kNone, zone); |
909 } | 901 } |
910 | 902 |
911 Type* Type::Union(Type* type1, Type* type2, Zone* zone) { | 903 AstType* AstType::Union(AstType* type1, AstType* type2, Zone* zone) { |
912 // Fast case: bit sets. | 904 // Fast case: bit sets. |
913 if (type1->IsBitset() && type2->IsBitset()) { | 905 if (type1->IsBitset() && type2->IsBitset()) { |
914 return BitsetType::New(type1->AsBitset() | type2->AsBitset()); | 906 return AstBitsetType::New(type1->AsBitset() | type2->AsBitset()); |
915 } | 907 } |
916 | 908 |
917 // Fast case: top or bottom types. | 909 // Fast case: top or bottom types. |
918 if (type1->IsAny() || type2->IsNone()) return type1; | 910 if (type1->IsAny() || type2->IsNone()) return type1; |
919 if (type2->IsAny() || type1->IsNone()) return type2; | 911 if (type2->IsAny() || type1->IsNone()) return type2; |
920 | 912 |
921 // Semi-fast case. | 913 // Semi-fast case. |
922 if (type1->Is(type2)) return type2; | 914 if (type1->Is(type2)) return type2; |
923 if (type2->Is(type1)) return type1; | 915 if (type2->Is(type1)) return type1; |
924 | 916 |
925 // Figure out the representation of the result. | 917 // Figure out the representation of the result. |
926 // The rest of the method should not change this representation and | 918 // The rest of the method should not change this representation and |
927 // it should not make any decisions based on representations (i.e., | 919 // it should not make any decisions based on representations (i.e., |
928 // it should only use the semantic part of types). | 920 // it should only use the semantic part of types). |
929 const bitset representation = | 921 const bitset representation = |
930 type1->Representation() | type2->Representation(); | 922 type1->Representation() | type2->Representation(); |
931 | 923 |
932 // Slow case: create union. | 924 // Slow case: create union. |
933 int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; | 925 int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; |
934 int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; | 926 int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; |
935 if (!AddIsSafe(size1, size2)) return Any(); | 927 if (!AddIsSafe(size1, size2)) return Any(); |
936 int size = size1 + size2; | 928 int size = size1 + size2; |
937 if (!AddIsSafe(size, 2)) return Any(); | 929 if (!AddIsSafe(size, 2)) return Any(); |
938 size += 2; | 930 size += 2; |
939 Type* result_type = UnionType::New(size, zone); | 931 AstType* result_type = AstUnionType::New(size, zone); |
940 UnionType* result = result_type->AsUnion(); | 932 AstUnionType* result = result_type->AsUnion(); |
941 size = 0; | 933 size = 0; |
942 | 934 |
943 // Compute the new bitset. | 935 // Compute the new bitset. |
944 bitset new_bitset = SEMANTIC(type1->BitsetGlb() | type2->BitsetGlb()); | 936 bitset new_bitset = AST_SEMANTIC(type1->BitsetGlb() | type2->BitsetGlb()); |
945 | 937 |
946 // Deal with ranges. | 938 // Deal with ranges. |
947 Type* range = None(); | 939 AstType* range = None(); |
948 Type* range1 = type1->GetRange(); | 940 AstType* range1 = type1->GetRange(); |
949 Type* range2 = type2->GetRange(); | 941 AstType* range2 = type2->GetRange(); |
950 if (range1 != NULL && range2 != NULL) { | 942 if (range1 != NULL && range2 != NULL) { |
951 RangeType::Limits lims = | 943 AstRangeType::Limits lims = |
952 RangeType::Limits::Union(RangeType::Limits(range1->AsRange()), | 944 AstRangeType::Limits::Union(AstRangeType::Limits(range1->AsRange()), |
953 RangeType::Limits(range2->AsRange())); | 945 AstRangeType::Limits(range2->AsRange())); |
954 Type* union_range = RangeType::New(lims, representation, zone); | 946 AstType* union_range = AstRangeType::New(lims, representation, zone); |
955 range = NormalizeRangeAndBitset(union_range, &new_bitset, zone); | 947 range = NormalizeRangeAndBitset(union_range, &new_bitset, zone); |
956 } else if (range1 != NULL) { | 948 } else if (range1 != NULL) { |
957 range = NormalizeRangeAndBitset(range1, &new_bitset, zone); | 949 range = NormalizeRangeAndBitset(range1, &new_bitset, zone); |
958 } else if (range2 != NULL) { | 950 } else if (range2 != NULL) { |
959 range = NormalizeRangeAndBitset(range2, &new_bitset, zone); | 951 range = NormalizeRangeAndBitset(range2, &new_bitset, zone); |
960 } | 952 } |
961 new_bitset = SEMANTIC(new_bitset) | representation; | 953 new_bitset = AST_SEMANTIC(new_bitset) | representation; |
962 Type* bits = BitsetType::New(new_bitset); | 954 AstType* bits = AstBitsetType::New(new_bitset); |
963 result->Set(size++, bits); | 955 result->Set(size++, bits); |
964 if (!range->IsNone()) result->Set(size++, range); | 956 if (!range->IsNone()) result->Set(size++, range); |
965 | 957 |
966 size = AddToUnion(type1, result, size, zone); | 958 size = AddToUnion(type1, result, size, zone); |
967 size = AddToUnion(type2, result, size, zone); | 959 size = AddToUnion(type2, result, size, zone); |
968 return NormalizeUnion(result_type, size, zone); | 960 return NormalizeUnion(result_type, size, zone); |
969 } | 961 } |
970 | 962 |
971 | |
972 // Add [type] to [result] unless [type] is bitset, range, or already subsumed. | 963 // Add [type] to [result] unless [type] is bitset, range, or already subsumed. |
973 // Return new size of [result]. | 964 // Return new size of [result]. |
974 int Type::AddToUnion(Type* type, UnionType* result, int size, Zone* zone) { | 965 int AstType::AddToUnion(AstType* type, AstUnionType* result, int size, |
| 966 Zone* zone) { |
975 if (type->IsBitset() || type->IsRange()) return size; | 967 if (type->IsBitset() || type->IsRange()) return size; |
976 if (type->IsUnion()) { | 968 if (type->IsUnion()) { |
977 for (int i = 0, n = type->AsUnion()->Length(); i < n; ++i) { | 969 for (int i = 0, n = type->AsUnion()->Length(); i < n; ++i) { |
978 size = AddToUnion(type->AsUnion()->Get(i), result, size, zone); | 970 size = AddToUnion(type->AsUnion()->Get(i), result, size, zone); |
979 } | 971 } |
980 return size; | 972 return size; |
981 } | 973 } |
982 for (int i = 0; i < size; ++i) { | 974 for (int i = 0; i < size; ++i) { |
983 if (type->SemanticIs(result->Get(i))) return size; | 975 if (type->SemanticIs(result->Get(i))) return size; |
984 } | 976 } |
985 result->Set(size++, type); | 977 result->Set(size++, type); |
986 return size; | 978 return size; |
987 } | 979 } |
988 | 980 |
989 Type* Type::NormalizeUnion(Type* union_type, int size, Zone* zone) { | 981 AstType* AstType::NormalizeUnion(AstType* union_type, int size, Zone* zone) { |
990 UnionType* unioned = union_type->AsUnion(); | 982 AstUnionType* unioned = union_type->AsUnion(); |
991 DCHECK(size >= 1); | 983 DCHECK(size >= 1); |
992 DCHECK(unioned->Get(0)->IsBitset()); | 984 DCHECK(unioned->Get(0)->IsBitset()); |
993 // If the union has just one element, return it. | 985 // If the union has just one element, return it. |
994 if (size == 1) { | 986 if (size == 1) { |
995 return unioned->Get(0); | 987 return unioned->Get(0); |
996 } | 988 } |
997 bitset bits = unioned->Get(0)->AsBitset(); | 989 bitset bits = unioned->Get(0)->AsBitset(); |
998 // If the union only consists of a range, we can get rid of the union. | 990 // If the union only consists of a range, we can get rid of the union. |
999 if (size == 2 && SEMANTIC(bits) == BitsetType::kNone) { | 991 if (size == 2 && AST_SEMANTIC(bits) == AstBitsetType::kNone) { |
1000 bitset representation = REPRESENTATION(bits); | 992 bitset representation = AST_REPRESENTATION(bits); |
1001 if (representation == unioned->Get(1)->Representation()) { | 993 if (representation == unioned->Get(1)->Representation()) { |
1002 return unioned->Get(1); | 994 return unioned->Get(1); |
1003 } | 995 } |
1004 if (unioned->Get(1)->IsRange()) { | 996 if (unioned->Get(1)->IsRange()) { |
1005 return RangeType::New(unioned->Get(1)->AsRange()->Min(), | 997 return AstRangeType::New(unioned->Get(1)->AsRange()->Min(), |
1006 unioned->Get(1)->AsRange()->Max(), | 998 unioned->Get(1)->AsRange()->Max(), |
1007 unioned->Get(0)->AsBitset(), zone); | 999 unioned->Get(0)->AsBitset(), zone); |
1008 } | 1000 } |
1009 } | 1001 } |
1010 unioned->Shrink(size); | 1002 unioned->Shrink(size); |
1011 SLOW_DCHECK(unioned->Wellformed()); | 1003 SLOW_DCHECK(unioned->Wellformed()); |
1012 return union_type; | 1004 return union_type; |
1013 } | 1005 } |
1014 | 1006 |
1015 | |
1016 // ----------------------------------------------------------------------------- | 1007 // ----------------------------------------------------------------------------- |
1017 // Component extraction | 1008 // Component extraction |
1018 | 1009 |
1019 // static | 1010 // static |
1020 Type* Type::Representation(Type* t, Zone* zone) { | 1011 AstType* AstType::Representation(AstType* t, Zone* zone) { |
1021 return BitsetType::New(t->Representation()); | 1012 return AstBitsetType::New(t->Representation()); |
1022 } | 1013 } |
1023 | 1014 |
1024 | |
1025 // static | 1015 // static |
1026 Type* Type::Semantic(Type* t, Zone* zone) { | 1016 AstType* AstType::Semantic(AstType* t, Zone* zone) { |
1027 return Intersect(t, BitsetType::New(BitsetType::kSemantic), zone); | 1017 return Intersect(t, AstBitsetType::New(AstBitsetType::kSemantic), zone); |
1028 } | 1018 } |
1029 | 1019 |
1030 | |
1031 // ----------------------------------------------------------------------------- | 1020 // ----------------------------------------------------------------------------- |
1032 // Iteration. | 1021 // Iteration. |
1033 | 1022 |
1034 int Type::NumClasses() { | 1023 int AstType::NumClasses() { |
1035 DisallowHeapAllocation no_allocation; | 1024 DisallowHeapAllocation no_allocation; |
1036 if (this->IsClass()) { | 1025 if (this->IsClass()) { |
1037 return 1; | 1026 return 1; |
1038 } else if (this->IsUnion()) { | 1027 } else if (this->IsUnion()) { |
1039 int result = 0; | 1028 int result = 0; |
1040 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 1029 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
1041 if (this->AsUnion()->Get(i)->IsClass()) ++result; | 1030 if (this->AsUnion()->Get(i)->IsClass()) ++result; |
1042 } | 1031 } |
1043 return result; | 1032 return result; |
1044 } else { | 1033 } else { |
1045 return 0; | 1034 return 0; |
1046 } | 1035 } |
1047 } | 1036 } |
1048 | 1037 |
1049 int Type::NumConstants() { | 1038 int AstType::NumConstants() { |
1050 DisallowHeapAllocation no_allocation; | 1039 DisallowHeapAllocation no_allocation; |
1051 if (this->IsConstant()) { | 1040 if (this->IsConstant()) { |
1052 return 1; | 1041 return 1; |
1053 } else if (this->IsUnion()) { | 1042 } else if (this->IsUnion()) { |
1054 int result = 0; | 1043 int result = 0; |
1055 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 1044 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
1056 if (this->AsUnion()->Get(i)->IsConstant()) ++result; | 1045 if (this->AsUnion()->Get(i)->IsConstant()) ++result; |
1057 } | 1046 } |
1058 return result; | 1047 return result; |
1059 } else { | 1048 } else { |
1060 return 0; | 1049 return 0; |
1061 } | 1050 } |
1062 } | 1051 } |
1063 | 1052 |
1064 template <class T> | 1053 template <class T> |
1065 Type* Type::Iterator<T>::get_type() { | 1054 AstType* AstType::Iterator<T>::get_type() { |
1066 DCHECK(!Done()); | 1055 DCHECK(!Done()); |
1067 return type_->IsUnion() ? type_->AsUnion()->Get(index_) : type_; | 1056 return type_->IsUnion() ? type_->AsUnion()->Get(index_) : type_; |
1068 } | 1057 } |
1069 | 1058 |
1070 | |
1071 // C++ cannot specialise nested templates, so we have to go through this | 1059 // C++ cannot specialise nested templates, so we have to go through this |
1072 // contortion with an auxiliary template to simulate it. | 1060 // contortion with an auxiliary template to simulate it. |
1073 template <class T> | 1061 template <class T> |
1074 struct TypeImplIteratorAux { | 1062 struct TypeImplIteratorAux { |
1075 static bool matches(Type* type); | 1063 static bool matches(AstType* type); |
1076 static i::Handle<T> current(Type* type); | 1064 static i::Handle<T> current(AstType* type); |
1077 }; | 1065 }; |
1078 | 1066 |
1079 template <> | 1067 template <> |
1080 struct TypeImplIteratorAux<i::Map> { | 1068 struct TypeImplIteratorAux<i::Map> { |
1081 static bool matches(Type* type) { return type->IsClass(); } | 1069 static bool matches(AstType* type) { return type->IsClass(); } |
1082 static i::Handle<i::Map> current(Type* type) { | 1070 static i::Handle<i::Map> current(AstType* type) { |
1083 return type->AsClass()->Map(); | 1071 return type->AsClass()->Map(); |
1084 } | 1072 } |
1085 }; | 1073 }; |
1086 | 1074 |
1087 template <> | 1075 template <> |
1088 struct TypeImplIteratorAux<i::Object> { | 1076 struct TypeImplIteratorAux<i::Object> { |
1089 static bool matches(Type* type) { return type->IsConstant(); } | 1077 static bool matches(AstType* type) { return type->IsConstant(); } |
1090 static i::Handle<i::Object> current(Type* type) { | 1078 static i::Handle<i::Object> current(AstType* type) { |
1091 return type->AsConstant()->Value(); | 1079 return type->AsConstant()->Value(); |
1092 } | 1080 } |
1093 }; | 1081 }; |
1094 | 1082 |
1095 template <class T> | 1083 template <class T> |
1096 bool Type::Iterator<T>::matches(Type* type) { | 1084 bool AstType::Iterator<T>::matches(AstType* type) { |
1097 return TypeImplIteratorAux<T>::matches(type); | 1085 return TypeImplIteratorAux<T>::matches(type); |
1098 } | 1086 } |
1099 | 1087 |
1100 template <class T> | 1088 template <class T> |
1101 i::Handle<T> Type::Iterator<T>::Current() { | 1089 i::Handle<T> AstType::Iterator<T>::Current() { |
1102 return TypeImplIteratorAux<T>::current(get_type()); | 1090 return TypeImplIteratorAux<T>::current(get_type()); |
1103 } | 1091 } |
1104 | 1092 |
1105 template <class T> | 1093 template <class T> |
1106 void Type::Iterator<T>::Advance() { | 1094 void AstType::Iterator<T>::Advance() { |
1107 DisallowHeapAllocation no_allocation; | 1095 DisallowHeapAllocation no_allocation; |
1108 ++index_; | 1096 ++index_; |
1109 if (type_->IsUnion()) { | 1097 if (type_->IsUnion()) { |
1110 for (int n = type_->AsUnion()->Length(); index_ < n; ++index_) { | 1098 for (int n = type_->AsUnion()->Length(); index_ < n; ++index_) { |
1111 if (matches(type_->AsUnion()->Get(index_))) return; | 1099 if (matches(type_->AsUnion()->Get(index_))) return; |
1112 } | 1100 } |
1113 } else if (index_ == 0 && matches(type_)) { | 1101 } else if (index_ == 0 && matches(type_)) { |
1114 return; | 1102 return; |
1115 } | 1103 } |
1116 index_ = -1; | 1104 index_ = -1; |
1117 } | 1105 } |
1118 | 1106 |
1119 | |
1120 // ----------------------------------------------------------------------------- | 1107 // ----------------------------------------------------------------------------- |
1121 // Printing. | 1108 // Printing. |
1122 | 1109 |
1123 const char* BitsetType::Name(bitset bits) { | 1110 const char* AstBitsetType::Name(bitset bits) { |
1124 switch (bits) { | 1111 switch (bits) { |
1125 case REPRESENTATION(kAny): return "Any"; | 1112 case AST_REPRESENTATION(kAny): |
1126 #define RETURN_NAMED_REPRESENTATION_TYPE(type, value) \ | 1113 return "Any"; |
1127 case REPRESENTATION(k##type): return #type; | 1114 #define RETURN_NAMED_REPRESENTATION_TYPE(type, value) \ |
1128 REPRESENTATION_BITSET_TYPE_LIST(RETURN_NAMED_REPRESENTATION_TYPE) | 1115 case AST_REPRESENTATION(k##type): \ |
1129 #undef RETURN_NAMED_REPRESENTATION_TYPE | 1116 return #type; |
| 1117 AST_REPRESENTATION_BITSET_TYPE_LIST(RETURN_NAMED_REPRESENTATION_TYPE) |
| 1118 #undef RETURN_NAMED_REPRESENTATION_TYPE |
1130 | 1119 |
1131 #define RETURN_NAMED_SEMANTIC_TYPE(type, value) \ | 1120 #define RETURN_NAMED_SEMANTIC_TYPE(type, value) \ |
1132 case SEMANTIC(k##type): return #type; | 1121 case AST_SEMANTIC(k##type): \ |
1133 SEMANTIC_BITSET_TYPE_LIST(RETURN_NAMED_SEMANTIC_TYPE) | 1122 return #type; |
1134 INTERNAL_BITSET_TYPE_LIST(RETURN_NAMED_SEMANTIC_TYPE) | 1123 AST_SEMANTIC_BITSET_TYPE_LIST(RETURN_NAMED_SEMANTIC_TYPE) |
1135 #undef RETURN_NAMED_SEMANTIC_TYPE | 1124 AST_INTERNAL_BITSET_TYPE_LIST(RETURN_NAMED_SEMANTIC_TYPE) |
| 1125 #undef RETURN_NAMED_SEMANTIC_TYPE |
1136 | 1126 |
1137 default: | 1127 default: |
1138 return NULL; | 1128 return NULL; |
1139 } | 1129 } |
1140 } | 1130 } |
1141 | 1131 |
1142 void BitsetType::Print(std::ostream& os, // NOLINT | 1132 void AstBitsetType::Print(std::ostream& os, // NOLINT |
1143 bitset bits) { | 1133 bitset bits) { |
1144 DisallowHeapAllocation no_allocation; | 1134 DisallowHeapAllocation no_allocation; |
1145 const char* name = Name(bits); | 1135 const char* name = Name(bits); |
1146 if (name != NULL) { | 1136 if (name != NULL) { |
1147 os << name; | 1137 os << name; |
1148 return; | 1138 return; |
1149 } | 1139 } |
1150 | 1140 |
1151 // clang-format off | 1141 // clang-format off |
1152 static const bitset named_bitsets[] = { | 1142 static const bitset named_bitsets[] = { |
1153 #define BITSET_CONSTANT(type, value) REPRESENTATION(k##type), | 1143 #define BITSET_CONSTANT(type, value) AST_REPRESENTATION(k##type), |
1154 REPRESENTATION_BITSET_TYPE_LIST(BITSET_CONSTANT) | 1144 AST_REPRESENTATION_BITSET_TYPE_LIST(BITSET_CONSTANT) |
1155 #undef BITSET_CONSTANT | 1145 #undef BITSET_CONSTANT |
1156 | 1146 |
1157 #define BITSET_CONSTANT(type, value) SEMANTIC(k##type), | 1147 #define BITSET_CONSTANT(type, value) AST_SEMANTIC(k##type), |
1158 INTERNAL_BITSET_TYPE_LIST(BITSET_CONSTANT) | 1148 AST_INTERNAL_BITSET_TYPE_LIST(BITSET_CONSTANT) |
1159 SEMANTIC_BITSET_TYPE_LIST(BITSET_CONSTANT) | 1149 AST_SEMANTIC_BITSET_TYPE_LIST(BITSET_CONSTANT) |
1160 #undef BITSET_CONSTANT | 1150 #undef BITSET_CONSTANT |
1161 }; | 1151 }; |
1162 // clang-format on | 1152 // clang-format on |
1163 | 1153 |
1164 bool is_first = true; | 1154 bool is_first = true; |
1165 os << "("; | 1155 os << "("; |
1166 for (int i(arraysize(named_bitsets) - 1); bits != 0 && i >= 0; --i) { | 1156 for (int i(arraysize(named_bitsets) - 1); bits != 0 && i >= 0; --i) { |
1167 bitset subset = named_bitsets[i]; | 1157 bitset subset = named_bitsets[i]; |
1168 if ((bits & subset) == subset) { | 1158 if ((bits & subset) == subset) { |
1169 if (!is_first) os << " | "; | 1159 if (!is_first) os << " | "; |
1170 is_first = false; | 1160 is_first = false; |
1171 os << Name(subset); | 1161 os << Name(subset); |
1172 bits -= subset; | 1162 bits -= subset; |
1173 } | 1163 } |
1174 } | 1164 } |
1175 DCHECK(bits == 0); | 1165 DCHECK(bits == 0); |
1176 os << ")"; | 1166 os << ")"; |
1177 } | 1167 } |
1178 | 1168 |
1179 void Type::PrintTo(std::ostream& os, PrintDimension dim) { | 1169 void AstType::PrintTo(std::ostream& os, PrintDimension dim) { |
1180 DisallowHeapAllocation no_allocation; | 1170 DisallowHeapAllocation no_allocation; |
1181 if (dim != REPRESENTATION_DIM) { | 1171 if (dim != REPRESENTATION_DIM) { |
1182 if (this->IsBitset()) { | 1172 if (this->IsBitset()) { |
1183 BitsetType::Print(os, SEMANTIC(this->AsBitset())); | 1173 AstBitsetType::Print(os, AST_SEMANTIC(this->AsBitset())); |
1184 } else if (this->IsClass()) { | 1174 } else if (this->IsClass()) { |
1185 os << "Class(" << static_cast<void*>(*this->AsClass()->Map()) << " < "; | 1175 os << "Class(" << static_cast<void*>(*this->AsClass()->Map()) << " < "; |
1186 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); | 1176 AstBitsetType::New(AstBitsetType::Lub(this))->PrintTo(os, dim); |
1187 os << ")"; | 1177 os << ")"; |
1188 } else if (this->IsConstant()) { | 1178 } else if (this->IsConstant()) { |
1189 os << "Constant(" << Brief(*this->AsConstant()->Value()) << ")"; | 1179 os << "Constant(" << Brief(*this->AsConstant()->Value()) << ")"; |
1190 } else if (this->IsRange()) { | 1180 } else if (this->IsRange()) { |
1191 std::ostream::fmtflags saved_flags = os.setf(std::ios::fixed); | 1181 std::ostream::fmtflags saved_flags = os.setf(std::ios::fixed); |
1192 std::streamsize saved_precision = os.precision(0); | 1182 std::streamsize saved_precision = os.precision(0); |
1193 os << "Range(" << this->AsRange()->Min() << ", " << this->AsRange()->Max() | 1183 os << "Range(" << this->AsRange()->Min() << ", " << this->AsRange()->Max() |
1194 << ")"; | 1184 << ")"; |
1195 os.flags(saved_flags); | 1185 os.flags(saved_flags); |
1196 os.precision(saved_precision); | 1186 os.precision(saved_precision); |
1197 } else if (this->IsContext()) { | 1187 } else if (this->IsContext()) { |
1198 os << "Context("; | 1188 os << "Context("; |
1199 this->AsContext()->Outer()->PrintTo(os, dim); | 1189 this->AsContext()->Outer()->PrintTo(os, dim); |
1200 os << ")"; | 1190 os << ")"; |
1201 } else if (this->IsUnion()) { | 1191 } else if (this->IsUnion()) { |
1202 os << "("; | 1192 os << "("; |
1203 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 1193 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
1204 Type* type_i = this->AsUnion()->Get(i); | 1194 AstType* type_i = this->AsUnion()->Get(i); |
1205 if (i > 0) os << " | "; | 1195 if (i > 0) os << " | "; |
1206 type_i->PrintTo(os, dim); | 1196 type_i->PrintTo(os, dim); |
1207 } | 1197 } |
1208 os << ")"; | 1198 os << ")"; |
1209 } else if (this->IsArray()) { | 1199 } else if (this->IsArray()) { |
1210 os << "Array("; | 1200 os << "Array("; |
1211 AsArray()->Element()->PrintTo(os, dim); | 1201 AsArray()->Element()->PrintTo(os, dim); |
1212 os << ")"; | 1202 os << ")"; |
1213 } else if (this->IsFunction()) { | 1203 } else if (this->IsFunction()) { |
1214 if (!this->AsFunction()->Receiver()->IsAny()) { | 1204 if (!this->AsFunction()->Receiver()->IsAny()) { |
1215 this->AsFunction()->Receiver()->PrintTo(os, dim); | 1205 this->AsFunction()->Receiver()->PrintTo(os, dim); |
1216 os << "."; | 1206 os << "."; |
1217 } | 1207 } |
1218 os << "("; | 1208 os << "("; |
1219 for (int i = 0; i < this->AsFunction()->Arity(); ++i) { | 1209 for (int i = 0; i < this->AsFunction()->Arity(); ++i) { |
1220 if (i > 0) os << ", "; | 1210 if (i > 0) os << ", "; |
1221 this->AsFunction()->Parameter(i)->PrintTo(os, dim); | 1211 this->AsFunction()->Parameter(i)->PrintTo(os, dim); |
1222 } | 1212 } |
1223 os << ")->"; | 1213 os << ")->"; |
1224 this->AsFunction()->Result()->PrintTo(os, dim); | 1214 this->AsFunction()->Result()->PrintTo(os, dim); |
1225 } else if (this->IsTuple()) { | 1215 } else if (this->IsTuple()) { |
1226 os << "<"; | 1216 os << "<"; |
1227 for (int i = 0, n = this->AsTuple()->Arity(); i < n; ++i) { | 1217 for (int i = 0, n = this->AsTuple()->Arity(); i < n; ++i) { |
1228 Type* type_i = this->AsTuple()->Element(i); | 1218 AstType* type_i = this->AsTuple()->Element(i); |
1229 if (i > 0) os << ", "; | 1219 if (i > 0) os << ", "; |
1230 type_i->PrintTo(os, dim); | 1220 type_i->PrintTo(os, dim); |
1231 } | 1221 } |
1232 os << ">"; | 1222 os << ">"; |
1233 } else { | 1223 } else { |
1234 UNREACHABLE(); | 1224 UNREACHABLE(); |
1235 } | 1225 } |
1236 } | 1226 } |
1237 if (dim == BOTH_DIMS) os << "/"; | 1227 if (dim == BOTH_DIMS) os << "/"; |
1238 if (dim != SEMANTIC_DIM) { | 1228 if (dim != SEMANTIC_DIM) { |
1239 BitsetType::Print(os, REPRESENTATION(this->BitsetLub())); | 1229 AstBitsetType::Print(os, AST_REPRESENTATION(this->BitsetLub())); |
1240 } | 1230 } |
1241 } | 1231 } |
1242 | 1232 |
1243 | |
1244 #ifdef DEBUG | 1233 #ifdef DEBUG |
1245 void Type::Print() { | 1234 void AstType::Print() { |
1246 OFStream os(stdout); | 1235 OFStream os(stdout); |
1247 PrintTo(os); | 1236 PrintTo(os); |
1248 os << std::endl; | 1237 os << std::endl; |
1249 } | 1238 } |
1250 void BitsetType::Print(bitset bits) { | 1239 void AstBitsetType::Print(bitset bits) { |
1251 OFStream os(stdout); | 1240 OFStream os(stdout); |
1252 Print(os, bits); | 1241 Print(os, bits); |
1253 os << std::endl; | 1242 os << std::endl; |
1254 } | 1243 } |
1255 #endif | 1244 #endif |
1256 | 1245 |
1257 BitsetType::bitset BitsetType::SignedSmall() { | 1246 AstBitsetType::bitset AstBitsetType::SignedSmall() { |
1258 return i::SmiValuesAre31Bits() ? kSigned31 : kSigned32; | 1247 return i::SmiValuesAre31Bits() ? kSigned31 : kSigned32; |
1259 } | 1248 } |
1260 | 1249 |
1261 BitsetType::bitset BitsetType::UnsignedSmall() { | 1250 AstBitsetType::bitset AstBitsetType::UnsignedSmall() { |
1262 return i::SmiValuesAre31Bits() ? kUnsigned30 : kUnsigned31; | 1251 return i::SmiValuesAre31Bits() ? kUnsigned30 : kUnsigned31; |
1263 } | 1252 } |
1264 | 1253 |
1265 #define CONSTRUCT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \ | 1254 #define CONSTRUCT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \ |
1266 Type* Type::Name(Isolate* isolate, Zone* zone) { \ | 1255 AstType* AstType::Name(Isolate* isolate, Zone* zone) { \ |
1267 return Class(i::handle(isolate->heap()->name##_map()), zone); \ | 1256 return Class(i::handle(isolate->heap()->name##_map()), zone); \ |
1268 } | 1257 } |
1269 SIMD128_TYPES(CONSTRUCT_SIMD_TYPE) | 1258 SIMD128_TYPES(CONSTRUCT_SIMD_TYPE) |
1270 #undef CONSTRUCT_SIMD_TYPE | 1259 #undef CONSTRUCT_SIMD_TYPE |
1271 | 1260 |
1272 // ----------------------------------------------------------------------------- | 1261 // ----------------------------------------------------------------------------- |
1273 // Instantiations. | 1262 // Instantiations. |
1274 | 1263 |
1275 template class Type::Iterator<i::Map>; | 1264 template class AstType::Iterator<i::Map>; |
1276 template class Type::Iterator<i::Object>; | 1265 template class AstType::Iterator<i::Object>; |
1277 | 1266 |
1278 } // namespace internal | 1267 } // namespace internal |
1279 } // namespace v8 | 1268 } // namespace v8 |
OLD | NEW |