Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_TYPES_H_ | 5 #ifndef V8_TYPES_H_ |
| 6 #define V8_TYPES_H_ | 6 #define V8_TYPES_H_ |
| 7 | 7 |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/factory.h" | 9 #include "src/factory.h" |
| 10 #include "src/handles.h" | 10 #include "src/handles.h" |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 V(TaggedInt, 1u << 30 | kSemantic) \ | 172 V(TaggedInt, 1u << 30 | kSemantic) \ |
| 173 V(TaggedPtr, 1u << 31 | kSemantic) \ | 173 V(TaggedPtr, 1u << 31 | kSemantic) \ |
| 174 \ | 174 \ |
| 175 V(UntaggedInt, kUntaggedInt1 | kUntaggedInt8 | \ | 175 V(UntaggedInt, kUntaggedInt1 | kUntaggedInt8 | \ |
| 176 kUntaggedInt16 | kUntaggedInt32) \ | 176 kUntaggedInt16 | kUntaggedInt32) \ |
| 177 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \ | 177 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \ |
| 178 V(UntaggedNumber, kUntaggedInt | kUntaggedFloat) \ | 178 V(UntaggedNumber, kUntaggedInt | kUntaggedFloat) \ |
| 179 V(Untagged, kUntaggedNumber | kUntaggedPtr) \ | 179 V(Untagged, kUntaggedNumber | kUntaggedPtr) \ |
| 180 V(Tagged, kTaggedInt | kTaggedPtr) | 180 V(Tagged, kTaggedInt | kTaggedPtr) |
| 181 | 181 |
| 182 #define SEMANTIC_BITSET_TYPE_LIST(V) \ | 182 #define INTERNAL_BITSET_TYPE_LIST(V) \ |
|
rossberg
2014/12/03 14:07:01
How about moving OtherString and OtherNumber to th
| |
| 183 V(Null, 1u << 1 | REPRESENTATION(kTaggedPtr)) \ | 183 V(OtherUnsigned31, 1u << 1 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 184 V(Undefined, 1u << 2 | REPRESENTATION(kTaggedPtr)) \ | 184 V(OtherUnsigned32, 1u << 2 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 185 V(Boolean, 1u << 3 | REPRESENTATION(kTaggedPtr)) \ | 185 V(OtherSigned32, 1u << 3 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 186 V(UnsignedSmall, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 186 V(OtherNumber, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) |
| 187 V(OtherSignedSmall, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 187 |
| 188 V(OtherUnsigned31, 1u << 6 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 188 #define SEMANTIC_BITSET_TYPE_LIST(V) \ |
| 189 V(OtherUnsigned32, 1u << 7 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 189 V(NegativeSignedSmall, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 190 V(OtherSigned32, 1u << 8 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 190 V(Null, 1u << 6 | REPRESENTATION(kTaggedPtr)) \ |
| 191 V(MinusZero, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 191 V(Undefined, 1u << 7 | REPRESENTATION(kTaggedPtr)) \ |
| 192 V(NaN, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 192 V(Boolean, 1u << 8 | REPRESENTATION(kTaggedPtr)) \ |
| 193 V(OtherNumber, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 193 V(UnsignedSmall, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 194 V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPtr)) \ | 194 V(MinusZero, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 195 V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPtr)) \ | 195 V(NaN, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 196 V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPtr)) \ | 196 V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPtr)) \ |
| 197 V(Undetectable, 1u << 15 | REPRESENTATION(kTaggedPtr)) \ | 197 V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPtr)) \ |
| 198 V(Array, 1u << 16 | REPRESENTATION(kTaggedPtr)) \ | 198 V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPtr)) \ |
| 199 V(Buffer, 1u << 17 | REPRESENTATION(kTaggedPtr)) \ | 199 V(Undetectable, 1u << 15 | REPRESENTATION(kTaggedPtr)) \ |
| 200 V(Function, 1u << 18 | REPRESENTATION(kTaggedPtr)) \ | 200 V(Array, 1u << 16 | REPRESENTATION(kTaggedPtr)) \ |
| 201 V(RegExp, 1u << 19 | REPRESENTATION(kTaggedPtr)) \ | 201 V(Buffer, 1u << 17 | REPRESENTATION(kTaggedPtr)) \ |
| 202 V(OtherObject, 1u << 20 | REPRESENTATION(kTaggedPtr)) \ | 202 V(Function, 1u << 18 | REPRESENTATION(kTaggedPtr)) \ |
| 203 V(Proxy, 1u << 21 | REPRESENTATION(kTaggedPtr)) \ | 203 V(RegExp, 1u << 19 | REPRESENTATION(kTaggedPtr)) \ |
| 204 V(Internal, 1u << 22 | REPRESENTATION(kTagged | kUntagged)) \ | 204 V(OtherObject, 1u << 20 | REPRESENTATION(kTaggedPtr)) \ |
| 205 \ | 205 V(Proxy, 1u << 21 | REPRESENTATION(kTaggedPtr)) \ |
| 206 V(SignedSmall, kUnsignedSmall | kOtherSignedSmall) \ | 206 V(Internal, 1u << 22 | REPRESENTATION(kTagged | kUntagged)) \ |
| 207 V(Signed32, kSignedSmall | kOtherUnsigned31 | kOtherSigned32) \ | 207 \ |
| 208 V(Unsigned32, kUnsignedSmall | kOtherUnsigned31 | kOtherUnsigned32) \ | 208 V(SignedSmall, kUnsignedSmall | kNegativeSignedSmall) \ |
| 209 V(Integral32, kSigned32 | kUnsigned32) \ | 209 V(Signed32, kSignedSmall | kOtherUnsigned31 | kOtherSigned32) \ |
| 210 V(OrderedNumber, kIntegral32 | kMinusZero | kOtherNumber) \ | 210 V(NegativeSigned32, kNegativeSignedSmall | kOtherSigned32) \ |
| 211 V(Number, kOrderedNumber | kNaN) \ | 211 V(NonNegativeSigned32, kUnsignedSmall | kOtherUnsigned31) \ |
| 212 V(String, kInternalizedString | kOtherString) \ | 212 V(Unsigned32, kNonNegativeSigned32 | kOtherUnsigned32) \ |
| 213 V(UniqueName, kSymbol | kInternalizedString) \ | 213 V(Integral32, kSigned32 | kUnsigned32) \ |
| 214 V(Name, kSymbol | kString) \ | 214 V(PlainNumber, kIntegral32 | kOtherNumber) \ |
| 215 V(NumberOrString, kNumber | kString) \ | 215 V(OrderedNumber, kPlainNumber | kMinusZero) \ |
| 216 V(Primitive, kNumber | kName | kBoolean | kNull | kUndefined) \ | 216 V(Number, kOrderedNumber | kNaN) \ |
| 217 V(DetectableObject, kArray | kFunction | kRegExp | kOtherObject) \ | 217 V(String, kInternalizedString | kOtherString) \ |
| 218 V(DetectableReceiver, kDetectableObject | kProxy) \ | 218 V(UniqueName, kSymbol | kInternalizedString) \ |
| 219 V(Detectable, kDetectableReceiver | kNumber | kName) \ | 219 V(Name, kSymbol | kString) \ |
| 220 V(Object, kDetectableObject | kUndetectable) \ | 220 V(NumberOrString, kNumber | kString) \ |
| 221 V(Receiver, kObject | kProxy) \ | 221 V(Primitive, kNumber | kName | kBoolean | kNull | kUndefined) \ |
| 222 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \ | 222 V(DetectableObject, kArray | kFunction | kRegExp | kOtherObject) \ |
| 223 kReceiver) \ | 223 V(DetectableReceiver, kDetectableObject | kProxy) \ |
| 224 V(NonNumber, kUnique | kString | kInternal) \ | 224 V(Detectable, kDetectableReceiver | kNumber | kName) \ |
| 225 V(Any, 0xfffffffeu) | 225 V(Object, kDetectableObject | kUndetectable) \ |
| 226 V(Receiver, kObject | kProxy) \ | |
| 227 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \ | |
| 228 kReceiver) \ | |
| 229 V(NonNumber, kUnique | kString | kInternal) \ | |
| 230 V(Any, 0xfffffffeu) | |
| 226 | 231 |
| 227 /* | 232 /* |
| 228 * The following diagrams show how integers (in the mathematical sense) are | 233 * The following diagrams show how integers (in the mathematical sense) are |
| 229 * divided among the different atomic numerical types. | 234 * divided among the different atomic numerical types. |
| 230 * | 235 * |
| 231 * If SmiValuesAre31Bits(): | 236 * If SmiValuesAre31Bits(): |
| 232 * | 237 * |
| 233 * ON OS32 OSS US OU31 OU32 ON | 238 * ON OS32 OSS US OU31 OU32 ON |
| 234 * ______[_______[_______[_______[_______[_______[_______ | 239 * ______[_______[_______[_______[_______[_______[_______ |
| 235 * -2^31 -2^30 0 2^30 2^31 2^32 | 240 * -2^31 -2^30 0 2^30 2^31 2^32 |
| 236 * | 241 * |
| 237 * Otherwise: | 242 * Otherwise: |
| 238 * | 243 * |
| 239 * ON OSS US OU32 ON | 244 * ON OSS US OU32 ON |
| 240 * ______[_______________[_______________[_______[_______ | 245 * ______[_______________[_______________[_______[_______ |
| 241 * -2^31 0 2^31 2^32 | 246 * -2^31 0 2^31 2^32 |
| 242 * | 247 * |
| 243 * | 248 * |
| 244 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. | 249 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. |
| 245 * | 250 * |
| 246 * NOTE: OtherSigned32 (OS32) and OU31 (OtherUnsigned31) are empty if Smis are | 251 * NOTE: OtherSigned32 (OS32) and OU31 (OtherUnsigned31) are empty if Smis are |
| 247 * 32-bit wide. They should thus never be used directly, only indirectly | 252 * 32-bit wide. They should thus never be used directly, only indirectly |
| 248 * via e.g. Number. | 253 * via e.g. Number. |
| 249 */ | 254 */ |
| 250 | 255 |
| 251 #define PROPER_BITSET_TYPE_LIST(V) \ | 256 #define PROPER_BITSET_TYPE_LIST(V) \ |
| 252 REPRESENTATION_BITSET_TYPE_LIST(V) \ | 257 REPRESENTATION_BITSET_TYPE_LIST(V) \ |
| 253 SEMANTIC_BITSET_TYPE_LIST(V) | 258 SEMANTIC_BITSET_TYPE_LIST(V) |
| 254 | 259 |
| 255 #define BITSET_TYPE_LIST(V) \ | 260 #define BITSET_TYPE_LIST(V) \ |
| 256 MASK_BITSET_TYPE_LIST(V) \ | 261 MASK_BITSET_TYPE_LIST(V) \ |
| 257 PROPER_BITSET_TYPE_LIST(V) | 262 REPRESENTATION_BITSET_TYPE_LIST(V) \ |
| 263 INTERNAL_BITSET_TYPE_LIST(V) \ | |
| 264 SEMANTIC_BITSET_TYPE_LIST(V) | |
| 258 | 265 |
| 259 | 266 |
| 260 // ----------------------------------------------------------------------------- | 267 // ----------------------------------------------------------------------------- |
| 261 // The abstract Type class, parameterized over the low-level representation. | 268 // The abstract Type class, parameterized over the low-level representation. |
| 262 | 269 |
| 263 // struct Config { | 270 // struct Config { |
| 264 // typedef TypeImpl<Config> Type; | 271 // typedef TypeImpl<Config> Type; |
| 265 // typedef Base; | 272 // typedef Base; |
| 266 // typedef Struct; | 273 // typedef Struct; |
| 267 // typedef Region; | 274 // typedef Region; |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 584 #define DECLARE_TYPE(type, value) k##type = (value), | 591 #define DECLARE_TYPE(type, value) k##type = (value), |
| 585 BITSET_TYPE_LIST(DECLARE_TYPE) | 592 BITSET_TYPE_LIST(DECLARE_TYPE) |
| 586 #undef DECLARE_TYPE | 593 #undef DECLARE_TYPE |
| 587 kUnusedEOL = 0 | 594 kUnusedEOL = 0 |
| 588 }; | 595 }; |
| 589 | 596 |
| 590 bitset Bitset() { return Config::as_bitset(this); } | 597 bitset Bitset() { return Config::as_bitset(this); } |
| 591 | 598 |
| 592 static TypeImpl* New(bitset bits) { | 599 static TypeImpl* New(bitset bits) { |
| 593 DCHECK(bits == kNone || IsInhabited(bits)); | 600 DCHECK(bits == kNone || IsInhabited(bits)); |
| 601 | |
| 602 if (FLAG_enable_slow_asserts) { | |
| 603 // Check that the bitset does not contain any holes in number ranges. | |
| 604 bitset mask = kSemantic; | |
| 605 if (!i::SmiValuesAre31Bits()) { | |
| 606 mask &= ~(kOtherUnsigned31 | kOtherSigned32); | |
| 607 } | |
| 608 bitset number_bits = bits & kPlainNumber & mask; | |
| 609 if (number_bits != 0) { | |
| 610 bitset lub = Lub(Min(number_bits), Max(number_bits)) & mask; | |
| 611 CHECK(lub == number_bits); | |
| 612 } | |
| 613 } | |
| 614 | |
| 594 return Config::from_bitset(bits); | 615 return Config::from_bitset(bits); |
| 595 } | 616 } |
| 596 static TypeHandle New(bitset bits, Region* region) { | 617 static TypeHandle New(bitset bits, Region* region) { |
| 597 DCHECK(bits == kNone || IsInhabited(bits)); | 618 DCHECK(bits == kNone || IsInhabited(bits)); |
| 598 return Config::from_bitset(bits, region); | 619 return Config::from_bitset(bits, region); |
| 599 } | 620 } |
| 600 // TODO(neis): Eventually allow again for types with empty semantics | 621 // TODO(neis): Eventually allow again for types with empty semantics |
| 601 // part and modify intersection and possibly subtyping accordingly. | 622 // part and modify intersection and possibly subtyping accordingly. |
| 602 | 623 |
| 603 static bool IsInhabited(bitset bits) { | 624 static bool IsInhabited(bitset bits) { |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1063 bool Narrows(BoundsImpl that) { | 1084 bool Narrows(BoundsImpl that) { |
| 1064 return that.lower->Is(this->lower) && this->upper->Is(that.upper); | 1085 return that.lower->Is(this->lower) && this->upper->Is(that.upper); |
| 1065 } | 1086 } |
| 1066 }; | 1087 }; |
| 1067 | 1088 |
| 1068 typedef BoundsImpl<ZoneTypeConfig> Bounds; | 1089 typedef BoundsImpl<ZoneTypeConfig> Bounds; |
| 1069 | 1090 |
| 1070 } } // namespace v8::internal | 1091 } } // namespace v8::internal |
| 1071 | 1092 |
| 1072 #endif // V8_TYPES_H_ | 1093 #endif // V8_TYPES_H_ |
| OLD | NEW |