Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 36ef717c5dfd0d019450d4748d4e2654fa267b63..e8ae22d4b34467f52a74cb11fb31a9e2cc2ee368 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -3451,8 +3451,8 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
bool is_not_in_new_space, |
HInstruction* instruction) { |
return instruction->Prepend(new(zone) HConstant( |
- unique, Representation::Tagged(), HType::Tagged(), false, |
- is_not_in_new_space, false, false)); |
+ unique, Representation::Tagged(), HType::Tagged(), |
+ is_not_in_new_space, false, false, kUnknownInstanceType)); |
} |
Handle<Object> handle(Isolate* isolate) { |
@@ -3487,7 +3487,7 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
bool ImmortalImmovable() const; |
bool IsCell() const { |
- return is_cell_; |
+ return instance_type_ == CELL_TYPE || instance_type_ == PROPERTY_CELL_TYPE; |
} |
virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
@@ -3535,14 +3535,14 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
bool HasStringValue() const { |
if (has_double_value_ || has_int32_value_) return false; |
ASSERT(!object_.handle().is_null()); |
- return type_.IsString(); |
+ return instance_type_ < FIRST_NONSTRING_TYPE; |
} |
Handle<String> StringValue() const { |
ASSERT(HasStringValue()); |
return Handle<String>::cast(object_.handle()); |
} |
bool HasInternalizedStringValue() const { |
- return HasStringValue() && is_internalized_string_; |
+ return HasStringValue() && StringShape(instance_type_).IsInternalized(); |
} |
bool HasExternalReferenceValue() const { |
@@ -3554,6 +3554,8 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
bool HasBooleanValue() const { return type_.IsBoolean(); } |
bool BooleanValue() const { return boolean_value_; } |
+ bool IsUndetectable() const { return is_undetectable_; } |
+ InstanceType GetInstanceType() const { return instance_type_; } |
virtual intptr_t Hashcode() V8_OVERRIDE { |
if (has_int32_value_) { |
@@ -3630,10 +3632,10 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
HConstant(Unique<Object> unique, |
Representation r, |
HType type, |
- bool is_internalized_string, |
bool is_not_in_new_space, |
- bool is_cell, |
- bool boolean_value); |
+ bool boolean_value, |
+ bool is_undetectable, |
+ InstanceType instance_type); |
explicit HConstant(ExternalReference reference); |
@@ -3656,13 +3658,15 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
bool has_int32_value_ : 1; |
bool has_double_value_ : 1; |
bool has_external_reference_value_ : 1; |
- bool is_internalized_string_ : 1; // TODO(yangguo): make this part of HType. |
bool is_not_in_new_space_ : 1; |
- bool is_cell_ : 1; |
bool boolean_value_ : 1; |
+ bool is_undetectable_: 1; |
int32_t int32_value_; |
double double_value_; |
ExternalReference external_reference_value_; |
+ |
+ static const InstanceType kUnknownInstanceType = FILLER_TYPE; |
+ InstanceType instance_type_; |
}; |
@@ -4328,6 +4332,8 @@ class HIsObjectAndBranch V8_FINAL : public HUnaryControlInstruction { |
return Representation::Tagged(); |
} |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ |
DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) |
private: |
@@ -4348,6 +4354,8 @@ class HIsStringAndBranch V8_FINAL : public HUnaryControlInstruction { |
return Representation::Tagged(); |
} |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ |
DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) |
protected: |
@@ -4373,6 +4381,8 @@ class HIsSmiAndBranch V8_FINAL : public HUnaryControlInstruction { |
return Representation::Tagged(); |
} |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ |
protected: |
virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } |
virtual int RedefinedOperandIndex() { return 0; } |
@@ -4395,6 +4405,8 @@ class HIsUndetectableAndBranch V8_FINAL : public HUnaryControlInstruction { |
return Representation::Tagged(); |
} |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ |
DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) |
private: |
@@ -4477,6 +4489,8 @@ class HHasInstanceTypeAndBranch V8_FINAL : public HUnaryControlInstruction { |
return Representation::Tagged(); |
} |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ |
DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) |
private: |
@@ -4558,8 +4572,7 @@ class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { |
public: |
DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); |
- Handle<String> type_literal() { return type_literal_; } |
- bool compares_number_type() { return compares_number_type_; } |
+ Handle<String> type_literal() { return type_literal_.handle(); } |
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) |
@@ -4570,16 +4583,16 @@ class HTypeofIsAndBranch V8_FINAL : public HUnaryControlInstruction { |
virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ virtual void FinalizeUniqueness() V8_OVERRIDE { |
+ type_literal_ = Unique<String>(type_literal_.handle()); |
+ } |
+ |
private: |
HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) |
: HUnaryControlInstruction(value, NULL, NULL), |
- type_literal_(type_literal) { |
- Heap* heap = type_literal->GetHeap(); |
- compares_number_type_ = type_literal->Equals(heap->number_string()); |
- } |
+ type_literal_(Unique<String>::CreateUninitialized(type_literal)) { } |
- Handle<String> type_literal_; |
- bool compares_number_type_ : 1; |
+ Unique<String> type_literal_; |
}; |