Chromium Code Reviews| Index: src/factory.cc |
| diff --git a/src/factory.cc b/src/factory.cc |
| index cdbc6fe04dbf8f4fcbe5cee231017e8c56245046..463603074499ee284b101c16dbdbb5965e56ef89 100644 |
| --- a/src/factory.cc |
| +++ b/src/factory.cc |
| @@ -306,6 +306,44 @@ MaybeHandle<String> Factory::NewStringFromUtf8(Vector<const char> string, |
| return result; |
| } |
| +MaybeHandle<String> Factory::NewStringFromUtf8SubString( |
| + Handle<SeqOneByteString> str, int begin, int length, |
| + PretenureFlag pretenure) { |
| + // Check for ASCII first since this is the common case. |
| + const char* start = reinterpret_cast<const char*>(str->GetChars() + begin); |
| + int non_ascii_start = String::NonAsciiStart(start, length); |
| + if (non_ascii_start >= length) { |
| + // If the string is ASCII, we can just make a substring. |
| + // TODO(v8): the pretenure flag is ignored in this case. |
| + return NewSubString(str, begin, begin + length); |
| + } |
| + |
| + // Non-ASCII and we need to decode. |
| + Access<UnicodeCache::Utf8Decoder> decoder( |
| + isolate()->unicode_cache()->utf8_decoder()); |
| + decoder->Reset(start + non_ascii_start, length - non_ascii_start); |
| + int utf16_length = static_cast<int>(decoder->Utf16Length()); |
| + DCHECK(utf16_length > 0); |
| + // Allocate string. |
| + Handle<SeqTwoByteString> result; |
| + ASSIGN_RETURN_ON_EXCEPTION( |
| + isolate(), result, |
| + NewRawTwoByteString(non_ascii_start + utf16_length, pretenure), String); |
| + |
| + // Reset the decoder, because the original {str} may have moved. |
| + const char* ascii_data = |
| + reinterpret_cast<const char*>(str->GetChars() + begin); |
| + decoder->Reset(ascii_data + non_ascii_start, length - non_ascii_start); |
| + // Copy ASCII portion. |
| + uint16_t* data = result->GetChars(); |
| + for (int i = 0; i < non_ascii_start; i++) { |
|
Mircea Trofin
2016/10/19 05:28:55
can't this be a condition on ascii_data not hittin
titzer
2016/10/19 09:54:40
This is essentially a copy of the above code, so f
|
| + *data++ = *ascii_data++; |
| + } |
| + // Now write the remainder. |
| + decoder->WriteUtf16(data, utf16_length); |
| + return result; |
| +} |
| + |
| MaybeHandle<String> Factory::NewStringFromTwoByte(const uc16* string, |
| int length, |
| PretenureFlag pretenure) { |