Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index 5a502e5cd116e2d54f8510d12f92d17158e021f3..f61c6bf5dfb802caab80f5096cd7543c8bb562f2 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -1757,19 +1757,19 @@ class HCheckFunction: public HUnaryOperation { |
| class HCheckInstanceType: public HUnaryOperation { |
| public: |
| - // Check that the instance type is in the range [first, last] where |
| - // both first and last are included. |
| - HCheckInstanceType(HValue* value, InstanceType first, InstanceType last) |
| - : HUnaryOperation(value), first_(first), last_(last) { |
| - ASSERT(first <= last); |
| - set_representation(Representation::Tagged()); |
| - SetFlag(kUseGVN); |
| - if ((FIRST_STRING_TYPE < first && last <= LAST_STRING_TYPE) || |
| - (FIRST_STRING_TYPE <= first && last < LAST_STRING_TYPE)) { |
| - // A particular string instance type can change because of GC or |
| - // externalization, but the value still remains a string. |
| - SetFlag(kDependsOnMaps); |
| - } |
| + static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value); |
| + static HCheckInstanceType* NewIsJSArray(HValue* value) { |
| + return new HCheckInstanceType(value, JS_ARRAY_TYPE, JS_ARRAY_TYPE, 0, 0); |
| + } |
| + static HCheckInstanceType* NewIsString(HValue* value) { |
| + return new HCheckInstanceType(value, |
| + FIRST_TYPE, FIRST_TYPE, |
| + kIsNotStringMask, kStringTag); |
| + } |
| + static HCheckInstanceType* NewIsSymbol(HValue* value) { |
| + return new HCheckInstanceType(value, |
| + FIRST_TYPE, FIRST_TYPE, |
| + kIsSymbolMask, kSymbolTag); |
| } |
| virtual bool IsCheckInstruction() const { return true; } |
| @@ -1785,17 +1785,35 @@ class HCheckInstanceType: public HUnaryOperation { |
| virtual HValue* Canonicalize() { |
| if (!value()->type().IsUninitialized() && |
| value()->type().IsString() && |
| - first() == FIRST_STRING_TYPE && |
| - last() == LAST_STRING_TYPE) { |
| + !is_range() && |
| + mask() == kIsNotStringMask && |
| + tag() == kStringTag) { |
| return NULL; |
| } |
| return this; |
| } |
| - static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value); |
| + bool is_range() const { return mask_ == 0; } |
| + |
| + InstanceType first() const { |
| + ASSERT(is_range()); |
| + return first_; |
| + } |
| + |
| + InstanceType last() { |
| + ASSERT(is_range()); |
| + return last_; |
| + } |
| + |
| + uint8_t mask() const { |
| + ASSERT(!is_range()); |
| + return mask_; |
| + } |
| - InstanceType first() const { return first_; } |
| - InstanceType last() const { return last_; } |
| + uint8_t tag() const { |
| + ASSERT(!is_range()); |
| + return tag_; |
| + } |
| DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) |
| @@ -1805,12 +1823,33 @@ class HCheckInstanceType: public HUnaryOperation { |
| // with a larger range. |
| virtual bool DataEquals(HValue* other) { |
| HCheckInstanceType* b = HCheckInstanceType::cast(other); |
| - return (first_ == b->first()) && (last_ == b->last()); |
| + return first_ == b->first_ && last_ == b->last_ && |
| + mask_ == b->mask_ && tag_ == b->tag_; |
| } |
| private: |
| + // Check that the instance type is in the range [first, last] where |
|
Mads Ager (chromium)
2011/05/09 16:57:51
Comment needs updating.
|
| + // both first and last are included. |
| + HCheckInstanceType(HValue* value, |
| + InstanceType first, InstanceType last, |
| + uint8_t mask, uint8_t tag) |
| + : HUnaryOperation(value), |
| + first_(first), last_(last), |
| + mask_(mask), tag_(tag) { |
| + ASSERT(first <= last); |
| + set_representation(Representation::Tagged()); |
| + SetFlag(kUseGVN); |
| + if (is_range() && first_ < FIRST_NONSTRING_TYPE) { |
| + // A particular string instance type can change because of GC or |
| + // externalization, but the value still remains a string. |
| + SetFlag(kDependsOnMaps); |
| + } |
| + } |
| + |
| InstanceType first_; |
| InstanceType last_; |
| + uint8_t mask_; |
|
Mads Ager (chromium)
2011/05/09 16:57:51
I don't like this much. Create two types of instru
|
| + uint8_t tag_; |
| }; |