Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 5ba7fb19e0e364a3c30e570cf0c911812e01ae75..01ed4f28c66b4083a5f4dc3af23f8d5babd8ccec 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -178,7 +178,6 @@ class LChunkBuilder; |
V(StringCharCodeAt) \ |
V(StringCharFromCode) \ |
V(StringCompareAndBranch) \ |
- V(StringLength) \ |
V(Sub) \ |
V(ThisFunction) \ |
V(Throw) \ |
@@ -200,6 +199,7 @@ class LChunkBuilder; |
#define GVN_UNTRACKED_FLAG_LIST(V) \ |
V(ArrayElements) \ |
V(ArrayLengths) \ |
+ V(StringLengths) \ |
V(BackingStoreFields) \ |
V(Calls) \ |
V(ContextSlots) \ |
@@ -5845,6 +5845,10 @@ class HObjectAccess { |
return portion() == kExternalMemory; |
} |
+ inline bool IsStringLength() const { |
+ return portion() == kStringLengths; |
+ } |
+ |
inline int offset() const { |
return OffsetField::decode(value_); |
} |
@@ -5898,6 +5902,14 @@ class HObjectAccess { |
FLAG_track_fields ? Representation::Smi() : Representation::Tagged()); |
} |
+ static HObjectAccess ForStringLength() { |
+ STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); |
+ return HObjectAccess( |
+ kStringLengths, |
+ String::kLengthOffset, |
+ FLAG_track_fields ? Representation::Smi() : Representation::Tagged()); |
+ } |
+ |
static HObjectAccess ForPropertiesPointer() { |
return HObjectAccess(kInobject, JSObject::kPropertiesOffset); |
} |
@@ -5961,6 +5973,7 @@ class HObjectAccess { |
enum Portion { |
kMaps, // map of an object |
kArrayLengths, // the length of an array |
+ kStringLengths, // the length of a string |
kElementsPointer, // elements pointer |
kBackingStore, // some field in the backing store |
kDouble, // some double field |
@@ -6023,6 +6036,7 @@ class HLoadNamedField: public HTemplateInstruction<2> { |
} |
return Representation::Tagged(); |
} |
+ virtual Range* InferRange(Zone* zone); |
virtual void PrintDataTo(StringStream* stream); |
DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) |
@@ -6858,36 +6872,6 @@ class HStringCharFromCode: public HTemplateInstruction<2> { |
}; |
-class HStringLength: public HUnaryOperation { |
- public: |
- static HInstruction* New(Zone* zone, HValue* context, HValue* string); |
- |
- virtual Representation RequiredInputRepresentation(int index) { |
- return Representation::Tagged(); |
- } |
- |
- DECLARE_CONCRETE_INSTRUCTION(StringLength) |
- |
- protected: |
- virtual bool DataEquals(HValue* other) { return true; } |
- |
- virtual Range* InferRange(Zone* zone) { |
- return new(zone) Range(0, String::kMaxLength); |
- } |
- |
- private: |
- explicit HStringLength(HValue* string) |
- : HUnaryOperation(string, HType::Smi()) { |
- STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); |
- set_representation(Representation::Tagged()); |
- SetFlag(kUseGVN); |
- SetGVNFlag(kDependsOnMaps); |
- } |
- |
- virtual bool IsDeletable() const { return true; } |
-}; |
- |
- |
template <int V> |
class HMaterializedLiteral: public HTemplateInstruction<V> { |
public: |