| 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:
|
|
|