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