| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 53a3183694cbfdfc87f16524888036e27d434d14..1c0ab9d70eb219bee5697e172bcde746c970836c 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -177,10 +177,14 @@ bool Object::IsSymbol() {
|
|
|
|
|
| bool Object::IsConsString() {
|
| - if (!this->IsHeapObject()) return false;
|
| - uint32_t type = HeapObject::cast(this)->map()->instance_type();
|
| - return (type & (kIsNotStringMask | kStringRepresentationMask)) ==
|
| - (kStringTag | kConsStringTag);
|
| + if (!IsString()) return false;
|
| + return StringShape(String::cast(this)).IsCons();
|
| +}
|
| +
|
| +
|
| +bool Object::IsSlicedString() {
|
| + if (!IsString()) return false;
|
| + return StringShape(String::cast(this)).IsSliced();
|
| }
|
|
|
|
|
| @@ -280,6 +284,11 @@ bool StringShape::IsCons() {
|
| }
|
|
|
|
|
| +bool StringShape::IsSliced() {
|
| + return (type_ & kStringRepresentationMask) == kSlicedStringTag;
|
| +}
|
| +
|
| +
|
| bool StringShape::IsExternal() {
|
| return (type_ & kStringRepresentationMask) == kExternalStringTag;
|
| }
|
| @@ -2041,6 +2050,7 @@ CAST_ACCESSOR(String)
|
| CAST_ACCESSOR(SeqString)
|
| CAST_ACCESSOR(SeqAsciiString)
|
| CAST_ACCESSOR(SeqTwoByteString)
|
| +CAST_ACCESSOR(SlicedString)
|
| CAST_ACCESSOR(ConsString)
|
| CAST_ACCESSOR(ExternalString)
|
| CAST_ACCESSOR(ExternalAsciiString)
|
| @@ -2156,6 +2166,9 @@ uint16_t String::Get(int index) {
|
| return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
|
| case kExternalStringTag | kTwoByteStringTag:
|
| return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
|
| + case kSlicedStringTag | kAsciiStringTag:
|
| + case kSlicedStringTag | kTwoByteStringTag:
|
| + return SlicedString::cast(this)->SlicedStringGet(index);
|
| default:
|
| break;
|
| }
|
| @@ -2243,6 +2256,20 @@ int SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) {
|
| }
|
|
|
|
|
| +String* SlicedString::parent() {
|
| + return String::cast(READ_FIELD(this, kParentOffset));
|
| +}
|
| +
|
| +
|
| +void SlicedString::set_parent(String* parent) {
|
| + ASSERT(parent->IsSeqString());
|
| + WRITE_FIELD(this, kParentOffset, parent);
|
| +}
|
| +
|
| +
|
| +SMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
|
| +
|
| +
|
| String* ConsString::first() {
|
| return String::cast(READ_FIELD(this, kFirstOffset));
|
| }
|
|
|