| Index: src/value-serializer.cc
|
| diff --git a/src/value-serializer.cc b/src/value-serializer.cc
|
| index d0ca6f1601e47577001971a808ba87c55cda0cfb..9dfaa4a857805abbf42a57856b86248b033a10d9 100644
|
| --- a/src/value-serializer.cc
|
| +++ b/src/value-serializer.cc
|
| @@ -23,7 +23,10 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -static const uint32_t kLatestVersion = 9;
|
| +// Version 9: (imported from Blink)
|
| +// Version 10: one-byte (Latin-1) strings
|
| +static const uint32_t kLatestVersion = 10;
|
| +
|
| static const int kPretenureThreshold = 100 * KB;
|
|
|
| template <typename T>
|
| @@ -61,6 +64,7 @@ enum class SerializationTag : uint8_t {
|
| kDouble = 'N',
|
| // byteLength:uint32_t, then raw data
|
| kUtf8String = 'S',
|
| + kOneByteString = '"',
|
| kTwoByteString = 'c',
|
| // Reference to a serialized object. objectID:uint32_t
|
| kObjectReference = '^',
|
| @@ -372,24 +376,9 @@ void ValueSerializer::WriteString(Handle<String> string) {
|
| String::FlatContent flat = string->GetFlatContent();
|
| DCHECK(flat.IsFlat());
|
| if (flat.IsOneByte()) {
|
| - // The existing format uses UTF-8, rather than Latin-1. As a result we must
|
| - // to do work to encode strings that have characters outside ASCII.
|
| - // TODO(jbroman): In a future format version, consider adding a tag for
|
| - // Latin-1 strings, so that this can be skipped.
|
| - WriteTag(SerializationTag::kUtf8String);
|
| Vector<const uint8_t> chars = flat.ToOneByteVector();
|
| - if (String::IsAscii(chars.begin(), chars.length())) {
|
| - WriteOneByteString(chars);
|
| - } else {
|
| - v8::Local<v8::String> api_string = Utils::ToLocal(string);
|
| - uint32_t utf8_length = api_string->Utf8Length();
|
| - WriteVarint(utf8_length);
|
| - uint8_t* dest;
|
| - if (ReserveRawBytes(utf8_length).To(&dest)) {
|
| - api_string->WriteUtf8(reinterpret_cast<char*>(dest), utf8_length,
|
| - nullptr, v8::String::NO_NULL_TERMINATION);
|
| - }
|
| - }
|
| + WriteTag(SerializationTag::kOneByteString);
|
| + WriteOneByteString(chars);
|
| } else if (flat.IsTwoByte()) {
|
| Vector<const uc16> chars = flat.ToUC16Vector();
|
| uint32_t byte_length = chars.length() * sizeof(uc16);
|
| @@ -1116,6 +1105,8 @@ MaybeHandle<Object> ValueDeserializer::ReadObjectInternal() {
|
| }
|
| case SerializationTag::kUtf8String:
|
| return ReadUtf8String();
|
| + case SerializationTag::kOneByteString:
|
| + return ReadOneByteString();
|
| case SerializationTag::kTwoByteString:
|
| return ReadTwoByteString();
|
| case SerializationTag::kObjectReference: {
|
| @@ -1175,6 +1166,18 @@ MaybeHandle<String> ValueDeserializer::ReadUtf8String() {
|
| Vector<const char>::cast(utf8_bytes), pretenure_);
|
| }
|
|
|
| +MaybeHandle<String> ValueDeserializer::ReadOneByteString() {
|
| + uint32_t byte_length;
|
| + Vector<const uint8_t> bytes;
|
| + if (!ReadVarint<uint32_t>().To(&byte_length) ||
|
| + byte_length >
|
| + static_cast<uint32_t>(std::numeric_limits<int32_t>::max()) ||
|
| + !ReadRawBytes(byte_length).To(&bytes)) {
|
| + return MaybeHandle<String>();
|
| + }
|
| + return isolate_->factory()->NewStringFromOneByte(bytes, pretenure_);
|
| +}
|
| +
|
| MaybeHandle<String> ValueDeserializer::ReadTwoByteString() {
|
| uint32_t byte_length;
|
| Vector<const uint8_t> bytes;
|
|
|