Chromium Code Reviews| Index: src/types.cc |
| diff --git a/src/types.cc b/src/types.cc |
| index 3840e6fd223f72c0210b49a386e3ca4462ef4a0b..b770d9c7a254f667aaa31ff93aa3e3d395fdd1b0 100644 |
| --- a/src/types.cc |
| +++ b/src/types.cc |
| @@ -150,14 +150,14 @@ int TypeImpl<Config>::LubBitset() { |
| template<class Config> |
| int TypeImpl<Config>::LubBitset(i::Object* value) { |
| - if (value->IsSmi()) return kSmi; |
| + if (value->IsSmi()) return kSignedSmall & kTaggedInt; |
| i::Map* map = i::HeapObject::cast(value)->map(); |
| if (map->instance_type() == HEAP_NUMBER_TYPE) { |
| int32_t i; |
| uint32_t u; |
| - if (value->ToInt32(&i)) return Smi::IsValid(i) ? kSmi : kOtherSigned32; |
| - if (value->ToUint32(&u)) return kUnsigned32; |
| - return kDouble; |
| + return kTaggedPtr & ( |
|
Michael Starzinger
2014/03/04 11:59:58
High-level comment: This assumes HeapNumber object
rossberg
2014/03/04 13:53:11
Good point. As discussed off-line, I think we shou
|
| + value->ToInt32(&i) ? (Smi::IsValid(i) ? kSignedSmall : kOtherSigned32) : |
| + value->ToUint32(&u) ? kUnsigned32 : kFloat); |
| } |
| if (map->instance_type() == ODDBALL_TYPE) { |
| if (value->IsUndefined()) return kUndefined; |
| @@ -202,7 +202,7 @@ int TypeImpl<Config>::LubBitset(i::Map* map) { |
| case ODDBALL_TYPE: |
| return kOddball; |
| case HEAP_NUMBER_TYPE: |
| - return kDouble; |
| + return kFloat & kTaggedPtr; |
| case JS_VALUE_TYPE: |
| case JS_DATE_TYPE: |
| case JS_OBJECT_TYPE: |
| @@ -245,7 +245,7 @@ int TypeImpl<Config>::LubBitset(i::Map* map) { |
| case EXECUTABLE_ACCESSOR_INFO_TYPE: |
| case ACCESSOR_PAIR_TYPE: |
| case FIXED_ARRAY_TYPE: |
| - return kInternal; |
| + return kInternal & kTaggedPtr; |
| default: |
| UNREACHABLE(); |
| return kNone; |
| @@ -271,7 +271,7 @@ int TypeImpl<Config>::GlbBitset() { |
| template<class Config> |
| typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::OfCurrently( |
| i::Handle<i::Object> value, Region* region) { |
| - if (value->IsSmi()) return Smi(region); |
| + if (value->IsSmi()) return SignedSmall(region); |
|
Michael Starzinger
2014/03/04 11:59:58
Shouldn't this be tagged?
rossberg
2014/03/04 13:53:11
Good catch.
|
| i::Map* map = i::HeapObject::cast(*value)->map(); |
| if (map->instance_type() == HEAP_NUMBER_TYPE || |
| map->instance_type() == ODDBALL_TYPE) { |
| @@ -338,10 +338,10 @@ template<class Config> |
| bool TypeImpl<Config>::Maybe(TypeImpl* that) { |
| // Fast path for bitsets. |
| if (this->IsBitset()) { |
| - return (this->AsBitset() & that->LubBitset()) != 0; |
| + return IsInhabited(this->AsBitset() & that->LubBitset()); |
| } |
| if (that->IsBitset()) { |
| - return (this->LubBitset() & that->AsBitset()) != 0; |
| + return IsInhabited(this->LubBitset() & that->AsBitset()); |
| } |
| // (T1 \/ ... \/ Tn) overlaps T <=> (T1 overlaps T) \/ ... \/ (Tn overlaps T) |
| @@ -568,7 +568,7 @@ typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Convert( |
| // TODO(rossberg): this does not belong here. |
| Representation Representation::FromType(Type* type) { |
| if (type->Is(Type::None())) return Representation::None(); |
| - if (type->Is(Type::Smi())) return Representation::Smi(); |
| + if (type->Is(Type::SignedSmall())) return Representation::Smi(); |
| if (type->Is(Type::Signed32())) return Representation::Integer32(); |
| if (type->Is(Type::Number())) return Representation::Double(); |
| return Representation::Tagged(); |
| @@ -577,8 +577,8 @@ Representation Representation::FromType(Type* type) { |
| #ifdef OBJECT_PRINT |
| template<class Config> |
| -void TypeImpl<Config>::TypePrint() { |
| - TypePrint(stdout); |
| +void TypeImpl<Config>::TypePrint(PrintDim dim) { |
| + TypePrint(stdout, dim); |
| PrintF(stdout, "\n"); |
| Flush(stdout); |
| } |
| @@ -587,9 +587,16 @@ void TypeImpl<Config>::TypePrint() { |
| template<class Config> |
| const char* TypeImpl<Config>::bitset_name(int bitset) { |
| switch (bitset) { |
| - #define PRINT_COMPOSED_TYPE(type, value) case k##type: return #type; |
| - BITSET_TYPE_LIST(PRINT_COMPOSED_TYPE) |
| + #define PRINT_COMPOSED_TYPE(type, value) \ |
| + case k##type & kSemantic: return #type; |
| + SEMANTIC_BITSET_TYPE_LIST(PRINT_COMPOSED_TYPE) |
| #undef PRINT_COMPOSED_TYPE |
| + |
| + #define PRINT_COMPOSED_TYPE(type, value) \ |
| + case k##type & kRepresentation: return #type; |
| + REPRESENTATION_BITSET_TYPE_LIST(PRINT_COMPOSED_TYPE) |
| + #undef PRINT_COMPOSED_TYPE |
| + |
| default: |
| return NULL; |
| } |
| @@ -597,23 +604,54 @@ const char* TypeImpl<Config>::bitset_name(int bitset) { |
| template<class Config> |
| -void TypeImpl<Config>::TypePrint(FILE* out) { |
| +void TypeImpl<Config>::BitsetTypePrint(FILE* out, int bitset) { |
| + const char* name = bitset_name(bitset); |
| + if (name != NULL) { |
| + PrintF(out, "%s", name); |
| + } else { |
| + static const int named_bitsets[] = { |
| + #define BITSET_CONSTANT(type, value) k##type & kSemantic, |
| + SEMANTIC_BITSET_TYPE_LIST(BITSET_CONSTANT) |
| + #undef BITSET_CONSTANT |
| + |
| + #define BITSET_CONSTANT(type, value) k##type & kRepresentation, |
| + REPRESENTATION_BITSET_TYPE_LIST(BITSET_CONSTANT) |
| + #undef BITSET_CONSTANT |
| + }; |
| + |
| + bool is_first = true; |
| + PrintF(out, "("); |
| + for (int i(ARRAY_SIZE(named_bitsets) - 1); bitset != 0 && i >= 0; --i) { |
| + int subset = named_bitsets[i]; |
| + if ((bitset & subset) == subset) { |
| + if (!is_first) PrintF(out, " | "); |
| + is_first = false; |
| + PrintF(out, "%s", bitset_name(subset)); |
| + bitset -= subset; |
| + } |
| + } |
| + ASSERT(bitset == 0); |
| + PrintF(out, ")"); |
| + } |
| +} |
| + |
| + |
| +template<class Config> |
| +void TypeImpl<Config>::TypePrint(FILE* out, PrintDim dim) { |
| if (this->IsBitset()) { |
| int bitset = this->AsBitset(); |
| - const char* name = bitset_name(bitset); |
| - if (name != NULL) { |
| - PrintF(out, "%s", name); |
| - } else { |
| - bool is_first = true; |
| - PrintF(out, "("); |
| - for (int mask = 1; mask != 0; mask = mask << 1) { |
| - if ((bitset & mask) != 0) { |
| - if (!is_first) PrintF(out, " | "); |
| - is_first = false; |
| - PrintF(out, "%s", bitset_name(mask)); |
| - } |
| - } |
| - PrintF(out, ")"); |
| + switch (dim) { |
| + case BOTH_DIMS: |
| + BitsetTypePrint(out, bitset & kSemantic); |
| + PrintF("/"); |
| + BitsetTypePrint(out, bitset & kRepresentation); |
| + break; |
| + case SEMANTIC_DIM: |
| + BitsetTypePrint(out, bitset & kSemantic); |
| + break; |
| + case REPRESENTATION_DIM: |
| + BitsetTypePrint(out, bitset & kRepresentation); |
| + break; |
| } |
| } else if (this->IsConstant()) { |
| PrintF(out, "Constant(%p : ", static_cast<void*>(*this->AsConstant())); |