Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 535) |
+++ src/runtime.cc (working copy) |
@@ -1356,7 +1356,7 @@ |
AssertNoAllocation no_heap_allocation; // ensure vectors stay valid |
// dispatch on type of strings |
if (pat->is_ascii_representation()) { |
- Vector<const char> pat_vector = pat->ToAsciiVector(); |
+ Vector<const byte> pat_vector = pat->ToAsciiVector(); |
if (sub->is_ascii_representation()) { |
return StringMatchStrategy(sub->ToAsciiVector(), pat_vector, start_index); |
} |
@@ -2591,6 +2591,27 @@ |
} |
+template<typename sinkchar> |
+static inline void StringBuilderConcatHelper(String* special, sinkchar* sink, FixedArray* fixed_array, int array_length) { |
+ int position = 0; |
+ for (int i = 0; i < array_length; i++) { |
+ Object* element = fixed_array->get(i); |
+ if (element->IsSmi()) { |
+ int len = Smi::cast(element)->value(); |
+ int pos = len >> 11; |
+ len &= 0x7ff; |
+ String::WriteToFlat(special, sink + position, pos, pos + len); |
+ position += len; |
+ } else { |
+ String* string = String::cast(element); |
+ int element_length = string->length(); |
+ String::WriteToFlat(string, sink + position, 0, element_length); |
+ position += element_length; |
+ } |
+ } |
+} |
+ |
+ |
static Object* Runtime_StringBuilderConcat(Arguments args) { |
NoHandleAllocation ha; |
ASSERT(args.length() == 2); |
@@ -2647,32 +2668,27 @@ |
} |
int length = position; |
- position = 0; |
Object* object; |
+ |
if (ascii) { |
object = Heap::AllocateRawAsciiString(length); |
+ if (object->IsFailure()) return object; |
+ SeqAsciiString* answer = SeqAsciiString::cast(object); |
+ StringBuilderConcatHelper(special, |
+ answer->GetCharsAddress(), |
+ fixed_array, |
+ array_length); |
+ return answer; |
} else { |
object = Heap::AllocateRawTwoByteString(length); |
+ if (object->IsFailure()) return object; |
+ SeqTwoByteString* answer = SeqTwoByteString::cast(object); |
+ StringBuilderConcatHelper(special, |
+ reinterpret_cast<uc16*>(answer->GetCharsAddress()), |
+ fixed_array, |
+ array_length); |
+ return answer; |
} |
- if (object->IsFailure()) return object; |
- |
- String* answer = String::cast(object); |
- for (int i = 0; i < array_length; i++) { |
- Object* element = fixed_array->get(i); |
- if (element->IsSmi()) { |
- int len = Smi::cast(element)->value(); |
- int pos = len >> 11; |
- len &= 0x7ff; |
- String::Flatten(special, answer, pos, pos + len, position); |
- position += len; |
- } else { |
- String* string = String::cast(element); |
- int element_length = string->length(); |
- String::Flatten(string, answer, 0, element_length, position); |
- position += element_length; |
- } |
- } |
- return answer; |
} |