| Index: src/objects.cc
|
| ===================================================================
|
| --- src/objects.cc (revision 3257)
|
| +++ src/objects.cc (working copy)
|
| @@ -683,23 +683,6 @@
|
| #endif
|
|
|
| switch (StringShape(this).representation_tag()) {
|
| - case kSlicedStringTag: {
|
| - SlicedString* ss = SlicedString::cast(this);
|
| - // The SlicedString constructor should ensure that there are no
|
| - // SlicedStrings that are constructed directly on top of other
|
| - // SlicedStrings.
|
| - String* buf = ss->buffer();
|
| - ASSERT(!buf->IsSlicedString());
|
| - Object* ok = buf->TryFlatten();
|
| - if (ok->IsFailure()) return ok;
|
| - // Under certain circumstances (TryFlattenIfNotFlat fails in
|
| - // String::Slice) we can have a cons string under a slice.
|
| - // In this case we need to get the flat string out of the cons!
|
| - if (StringShape(String::cast(ok)).IsCons()) {
|
| - ss->set_buffer(ConsString::cast(ok)->first());
|
| - }
|
| - return this;
|
| - }
|
| case kConsStringTag: {
|
| ConsString* cs = ConsString::cast(this);
|
| if (cs->second()->length() == 0) {
|
| @@ -1135,9 +1118,6 @@
|
| case kConsStringTag:
|
| reinterpret_cast<ConsString*>(this)->ConsStringIterateBody(v);
|
| break;
|
| - case kSlicedStringTag:
|
| - reinterpret_cast<SlicedString*>(this)->SlicedStringIterateBody(v);
|
| - break;
|
| case kExternalStringTag:
|
| if ((type & kStringEncodingMask) == kAsciiStringTag) {
|
| reinterpret_cast<ExternalAsciiString*>(this)->
|
| @@ -3571,12 +3551,7 @@
|
| int length = this->length();
|
| StringRepresentationTag string_tag = StringShape(this).representation_tag();
|
| String* string = this;
|
| - if (string_tag == kSlicedStringTag) {
|
| - SlicedString* sliced = SlicedString::cast(string);
|
| - offset += sliced->start();
|
| - string = sliced->buffer();
|
| - string_tag = StringShape(string).representation_tag();
|
| - } else if (string_tag == kConsStringTag) {
|
| + if (string_tag == kConsStringTag) {
|
| ConsString* cons = ConsString::cast(string);
|
| ASSERT(cons->second()->length() == 0);
|
| string = cons->first();
|
| @@ -3602,12 +3577,7 @@
|
| int length = this->length();
|
| StringRepresentationTag string_tag = StringShape(this).representation_tag();
|
| String* string = this;
|
| - if (string_tag == kSlicedStringTag) {
|
| - SlicedString* sliced = SlicedString::cast(string);
|
| - offset += sliced->start();
|
| - string = String::cast(sliced->buffer());
|
| - string_tag = StringShape(string).representation_tag();
|
| - } else if (string_tag == kConsStringTag) {
|
| + if (string_tag == kConsStringTag) {
|
| ConsString* cons = ConsString::cast(string);
|
| ASSERT(cons->second()->length() == 0);
|
| string = cons->first();
|
| @@ -3698,17 +3668,6 @@
|
| case kExternalStringTag:
|
| return ExternalTwoByteString::cast(this)->
|
| ExternalTwoByteStringGetData(start);
|
| - case kSlicedStringTag: {
|
| - SlicedString* sliced_string = SlicedString::cast(this);
|
| - String* buffer = sliced_string->buffer();
|
| - if (StringShape(buffer).IsCons()) {
|
| - ConsString* cs = ConsString::cast(buffer);
|
| - // Flattened string.
|
| - ASSERT(cs->second()->length() == 0);
|
| - buffer = cs->first();
|
| - }
|
| - return buffer->GetTwoByteData(start + sliced_string->start());
|
| - }
|
| case kConsStringTag:
|
| UNREACHABLE();
|
| return NULL;
|
| @@ -3863,22 +3822,6 @@
|
| }
|
|
|
|
|
| -const unibrow::byte* SlicedString::SlicedStringReadBlock(ReadBlockBuffer* rbb,
|
| - unsigned* offset_ptr,
|
| - unsigned max_chars) {
|
| - String* backing = buffer();
|
| - unsigned offset = start() + *offset_ptr;
|
| - unsigned length = backing->length();
|
| - if (max_chars > length - offset) {
|
| - max_chars = length - offset;
|
| - }
|
| - const unibrow::byte* answer =
|
| - String::ReadBlock(backing, rbb, &offset, max_chars);
|
| - *offset_ptr = offset - start();
|
| - return answer;
|
| -}
|
| -
|
| -
|
| uint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) {
|
| ASSERT(index >= 0 && index < length());
|
| return resource()->data()[index];
|
| @@ -4002,10 +3945,6 @@
|
| return ConsString::cast(input)->ConsStringReadBlock(rbb,
|
| offset_ptr,
|
| max_chars);
|
| - case kSlicedStringTag:
|
| - return SlicedString::cast(input)->SlicedStringReadBlock(rbb,
|
| - offset_ptr,
|
| - max_chars);
|
| case kExternalStringTag:
|
| if (input->IsAsciiRepresentation()) {
|
| return ExternalAsciiString::cast(input)->ExternalAsciiStringReadBlock(
|
| @@ -4148,11 +4087,6 @@
|
| offset_ptr,
|
| max_chars);
|
| return;
|
| - case kSlicedStringTag:
|
| - SlicedString::cast(input)->SlicedStringReadBlockIntoBuffer(rbb,
|
| - offset_ptr,
|
| - max_chars);
|
| - return;
|
| case kExternalStringTag:
|
| if (input->IsAsciiRepresentation()) {
|
| ExternalAsciiString::cast(input)->
|
| @@ -4267,20 +4201,6 @@
|
| }
|
|
|
|
|
| -void SlicedString::SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* rbb,
|
| - unsigned* offset_ptr,
|
| - unsigned max_chars) {
|
| - String* backing = buffer();
|
| - unsigned offset = start() + *offset_ptr;
|
| - unsigned length = backing->length();
|
| - if (max_chars > length - offset) {
|
| - max_chars = length - offset;
|
| - }
|
| - String::ReadBlockIntoBuffer(backing, rbb, &offset, max_chars);
|
| - *offset_ptr = offset - start();
|
| -}
|
| -
|
| -
|
| void ConsString::ConsStringIterateBody(ObjectVisitor* v) {
|
| IteratePointers(v, kFirstOffset, kSecondOffset + kPointerSize);
|
| }
|
| @@ -4359,15 +4279,6 @@
|
| to - from);
|
| return;
|
| }
|
| - case kAsciiStringTag | kSlicedStringTag:
|
| - case kTwoByteStringTag | kSlicedStringTag: {
|
| - SlicedString* sliced_string = SlicedString::cast(source);
|
| - int start = sliced_string->start();
|
| - from += start;
|
| - to += start;
|
| - source = String::cast(sliced_string->buffer());
|
| - break;
|
| - }
|
| case kAsciiStringTag | kConsStringTag:
|
| case kTwoByteStringTag | kConsStringTag: {
|
| ConsString* cons_string = ConsString::cast(source);
|
| @@ -4403,10 +4314,6 @@
|
| }
|
|
|
|
|
| -void SlicedString::SlicedStringIterateBody(ObjectVisitor* v) {
|
| - IteratePointer(v, kBufferOffset);
|
| -}
|
| -
|
| #define FIELD_ADDR(p, offset) \
|
| (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag)
|
|
|
| @@ -4425,14 +4332,6 @@
|
|
|
| #undef FIELD_ADDR
|
|
|
| -uint16_t SlicedString::SlicedStringGet(int index) {
|
| - ASSERT(index >= 0 && index < this->length());
|
| - // Delegate to the buffer string.
|
| - String* underlying = buffer();
|
| - return underlying->Get(start() + index);
|
| -}
|
| -
|
| -
|
| template <typename IteratorA, typename IteratorB>
|
| static inline bool CompareStringContents(IteratorA* ia, IteratorB* ib) {
|
| // General slow case check. We know that the ia and ib iterators
|
| @@ -4731,43 +4630,10 @@
|
| }
|
|
|
|
|
| -Object* String::Slice(int start, int end) {
|
| +Object* String::SubString(int start, int end) {
|
| if (start == 0 && end == length()) return this;
|
| - if (StringShape(this).representation_tag() == kSlicedStringTag) {
|
| - // Translate slices of a SlicedString into slices of the
|
| - // underlying string buffer.
|
| - SlicedString* str = SlicedString::cast(this);
|
| - String* buf = str->buffer();
|
| - return Heap::AllocateSlicedString(buf,
|
| - str->start() + start,
|
| - str->start() + end);
|
| - }
|
| - Object* result = Heap::AllocateSlicedString(this, start, end);
|
| - if (result->IsFailure()) {
|
| - return result;
|
| - }
|
| - // Due to the way we retry after GC on allocation failure we are not allowed
|
| - // to fail on allocation after this point. This is the one-allocation rule.
|
| -
|
| - // Try to flatten a cons string that is under the sliced string.
|
| - // This is to avoid memory leaks and possible stack overflows caused by
|
| - // building 'towers' of sliced strings on cons strings.
|
| - // This may fail due to an allocation failure (when a GC is needed), but it
|
| - // will succeed often enough to avoid the problem. We only have to do this
|
| - // if Heap::AllocateSlicedString actually returned a SlicedString. It will
|
| - // return flat strings for small slices for efficiency reasons.
|
| - String* answer = String::cast(result);
|
| - if (StringShape(answer).IsSliced() &&
|
| - StringShape(this).representation_tag() == kConsStringTag) {
|
| - TryFlatten();
|
| - // If the flatten succeeded we might as well make the sliced string point
|
| - // to the flat string rather than the cons string.
|
| - String* second = ConsString::cast(this)->second();
|
| - if (second->length() == 0) {
|
| - SlicedString::cast(answer)->set_buffer(ConsString::cast(this)->first());
|
| - }
|
| - }
|
| - return answer;
|
| + Object* result = Heap::AllocateSubString(this, start, end);
|
| + return result;
|
| }
|
|
|
|
|
| @@ -5020,7 +4886,7 @@
|
| return;
|
| }
|
|
|
| - // Get the slice of the source for this function.
|
| + // Get the source for the script which this function came from.
|
| // Don't use String::cast because we don't want more assertion errors while
|
| // we are already creating a stack dump.
|
| String* script_source =
|
|
|