| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 8fc025338625aaed00cee4c5101c799296a24d84..3be7b1bce36bc52cfefc1e5beff7b832634391d4 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -48,6 +48,7 @@
|
| #include "snapshot.h"
|
| #include "store-buffer.h"
|
| #include "v8threads.h"
|
| +#include "v8utils.h"
|
| #include "vm-state-inl.h"
|
| #if V8_TARGET_ARCH_ARM && !V8_INTERPRETED_REGEXP
|
| #include "regexp-macro-assembler.h"
|
| @@ -4350,7 +4351,8 @@ MaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor,
|
|
|
| MaybeObject* Heap::AllocateStringFromAscii(Vector<const char> string,
|
| PretenureFlag pretenure) {
|
| - if (string.length() == 1) {
|
| + int length = string.length();
|
| + if (length == 1) {
|
| return Heap::LookupSingleCharacterStringFromCode(string[0]);
|
| }
|
| Object* result;
|
| @@ -4359,11 +4361,10 @@ MaybeObject* Heap::AllocateStringFromAscii(Vector<const char> string,
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
| }
|
|
|
| + isolate_->counters()->string_length_ascii()->Increment(length);
|
| +
|
| // Copy the characters into the new object.
|
| - SeqAsciiString* string_result = SeqAsciiString::cast(result);
|
| - for (int i = 0; i < string.length(); i++) {
|
| - string_result->SeqAsciiStringSet(i, string[i]);
|
| - }
|
| + CopyChars(SeqAsciiString::cast(result)->GetChars(), string.start(), length);
|
| return result;
|
| }
|
|
|
| @@ -4390,41 +4391,63 @@ MaybeObject* Heap::AllocateStringFromUtf8Slow(Vector<const char> string,
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
| }
|
|
|
| + isolate_->counters()->string_length_utf8()->Increment(chars);
|
| +
|
| // Convert and copy the characters into the new object.
|
| - String* string_result = String::cast(result);
|
| + SeqTwoByteString* twobyte = SeqTwoByteString::cast(result);
|
| decoder->Reset(string.start(), string.length());
|
| int i = 0;
|
| while (i < chars) {
|
| uint32_t r = decoder->GetNext();
|
| if (r > unibrow::Utf16::kMaxNonSurrogateCharCode) {
|
| - string_result->Set(i++, unibrow::Utf16::LeadSurrogate(r));
|
| - string_result->Set(i++, unibrow::Utf16::TrailSurrogate(r));
|
| + twobyte->SeqTwoByteStringSet(i++, unibrow::Utf16::LeadSurrogate(r));
|
| + twobyte->SeqTwoByteStringSet(i++, unibrow::Utf16::TrailSurrogate(r));
|
| } else {
|
| - string_result->Set(i++, r);
|
| + twobyte->SeqTwoByteStringSet(i++, r);
|
| }
|
| }
|
| return result;
|
| }
|
|
|
|
|
| +MaybeObject* Heap::AllocateStringFromLatin1Slow(Vector<const char> string,
|
| + PretenureFlag pretenure) {
|
| + int chars = string.length();
|
| + Object* result;
|
| + { MaybeObject* maybe_result = AllocateRawTwoByteString(chars, pretenure);
|
| + if (!maybe_result->ToObject(&result)) return maybe_result;
|
| + }
|
| +
|
| + isolate_->counters()->string_length_latin1()->Increment(chars);
|
| +
|
| + // Convert and copy the characters into the new object.
|
| + SeqTwoByteString* string_result = SeqTwoByteString::cast(result);
|
| + CopyChars(string_result->GetChars(),
|
| + reinterpret_cast<const unsigned char*>(string.start()),
|
| + chars);
|
| + return result;
|
| +}
|
| +
|
| +
|
| MaybeObject* Heap::AllocateStringFromTwoByte(Vector<const uc16> string,
|
| PretenureFlag pretenure) {
|
| // Check if the string is an ASCII string.
|
| - MaybeObject* maybe_result;
|
| - if (String::IsAscii(string.start(), string.length())) {
|
| - maybe_result = AllocateRawAsciiString(string.length(), pretenure);
|
| - } else { // It's not an ASCII string.
|
| - maybe_result = AllocateRawTwoByteString(string.length(), pretenure);
|
| - }
|
| Object* result;
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| + int length = string.length();
|
| + const uc16* start = string.start();
|
|
|
| - // Copy the characters into the new object, which may be either ASCII or
|
| - // UTF-16.
|
| - String* string_result = String::cast(result);
|
| - for (int i = 0; i < string.length(); i++) {
|
| - string_result->Set(i, string[i]);
|
| + if (String::IsAscii(start, length)) {
|
| + MaybeObject* maybe_result = AllocateRawAsciiString(length, pretenure);
|
| + if (!maybe_result->ToObject(&result)) return maybe_result;
|
| + isolate_->counters()->string_length_ascii()->Increment(length);
|
| + CopyChars(SeqAsciiString::cast(result)->GetChars(), start, length);
|
| + } else { // It's not an ASCII string.
|
| + MaybeObject* maybe_result = AllocateRawTwoByteString(length, pretenure);
|
| + if (!maybe_result->ToObject(&result)) return maybe_result;
|
| + isolate_->counters()->string_length_utf16()->Increment(length);
|
| + CopyChars(SeqTwoByteString::cast(result)->GetChars(), start, length);
|
| }
|
| +
|
| return result;
|
| }
|
|
|
|
|