| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/value-serializer.h" | 5 #include "src/value-serializer.h" |
| 6 | 6 |
| 7 #include <type_traits> | 7 #include <type_traits> |
| 8 | 8 |
| 9 #include "src/base/logging.h" | 9 #include "src/base/logging.h" |
| 10 #include "src/factory.h" | 10 #include "src/factory.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 kEndDenseJSArray = '$', | 72 kEndDenseJSArray = '$', |
| 73 // Date. millisSinceEpoch:double | 73 // Date. millisSinceEpoch:double |
| 74 kDate = 'D', | 74 kDate = 'D', |
| 75 // Boolean object. No data. | 75 // Boolean object. No data. |
| 76 kTrueObject = 'y', | 76 kTrueObject = 'y', |
| 77 kFalseObject = 'x', | 77 kFalseObject = 'x', |
| 78 // Number object. value:double | 78 // Number object. value:double |
| 79 kNumberObject = 'n', | 79 kNumberObject = 'n', |
| 80 // String object, UTF-8 encoding. byteLength:uint32_t, then raw data. | 80 // String object, UTF-8 encoding. byteLength:uint32_t, then raw data. |
| 81 kStringObject = 's', | 81 kStringObject = 's', |
| 82 // Regular expression, UTF-8 encoding. byteLength:uint32_t, raw data, |
| 83 // flags:uint32_t. |
| 84 kRegExp = 'R', |
| 82 }; | 85 }; |
| 83 | 86 |
| 84 ValueSerializer::ValueSerializer(Isolate* isolate) | 87 ValueSerializer::ValueSerializer(Isolate* isolate) |
| 85 : isolate_(isolate), | 88 : isolate_(isolate), |
| 86 zone_(isolate->allocator()), | 89 zone_(isolate->allocator()), |
| 87 id_map_(isolate->heap(), &zone_) {} | 90 id_map_(isolate->heap(), &zone_) {} |
| 88 | 91 |
| 89 ValueSerializer::~ValueSerializer() {} | 92 ValueSerializer::~ValueSerializer() {} |
| 90 | 93 |
| 91 void ValueSerializer::WriteHeader() { | 94 void ValueSerializer::WriteHeader() { |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 case JS_ARRAY_TYPE: | 279 case JS_ARRAY_TYPE: |
| 277 return WriteJSArray(Handle<JSArray>::cast(receiver)); | 280 return WriteJSArray(Handle<JSArray>::cast(receiver)); |
| 278 case JS_OBJECT_TYPE: | 281 case JS_OBJECT_TYPE: |
| 279 case JS_API_OBJECT_TYPE: | 282 case JS_API_OBJECT_TYPE: |
| 280 return WriteJSObject(Handle<JSObject>::cast(receiver)); | 283 return WriteJSObject(Handle<JSObject>::cast(receiver)); |
| 281 case JS_DATE_TYPE: | 284 case JS_DATE_TYPE: |
| 282 WriteJSDate(JSDate::cast(*receiver)); | 285 WriteJSDate(JSDate::cast(*receiver)); |
| 283 return Just(true); | 286 return Just(true); |
| 284 case JS_VALUE_TYPE: | 287 case JS_VALUE_TYPE: |
| 285 return WriteJSValue(Handle<JSValue>::cast(receiver)); | 288 return WriteJSValue(Handle<JSValue>::cast(receiver)); |
| 289 case JS_REGEXP_TYPE: |
| 290 WriteJSRegExp(JSRegExp::cast(*receiver)); |
| 291 return Just(true); |
| 286 default: | 292 default: |
| 287 UNIMPLEMENTED(); | 293 UNIMPLEMENTED(); |
| 288 break; | 294 break; |
| 289 } | 295 } |
| 290 return Nothing<bool>(); | 296 return Nothing<bool>(); |
| 291 } | 297 } |
| 292 | 298 |
| 293 Maybe<bool> ValueSerializer::WriteJSObject(Handle<JSObject> object) { | 299 Maybe<bool> ValueSerializer::WriteJSObject(Handle<JSObject> object) { |
| 294 WriteTag(SerializationTag::kBeginJSObject); | 300 WriteTag(SerializationTag::kBeginJSObject); |
| 295 Handle<FixedArray> keys; | 301 Handle<FixedArray> keys; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 api_string->WriteUtf8(reinterpret_cast<char*>(ReserveRawBytes(utf8_length)), | 399 api_string->WriteUtf8(reinterpret_cast<char*>(ReserveRawBytes(utf8_length)), |
| 394 utf8_length, nullptr, | 400 utf8_length, nullptr, |
| 395 v8::String::NO_NULL_TERMINATION); | 401 v8::String::NO_NULL_TERMINATION); |
| 396 } else { | 402 } else { |
| 397 DCHECK(inner_value->IsSymbol()); | 403 DCHECK(inner_value->IsSymbol()); |
| 398 return Nothing<bool>(); | 404 return Nothing<bool>(); |
| 399 } | 405 } |
| 400 return Just(true); | 406 return Just(true); |
| 401 } | 407 } |
| 402 | 408 |
| 409 void ValueSerializer::WriteJSRegExp(JSRegExp* regexp) { |
| 410 WriteTag(SerializationTag::kRegExp); |
| 411 v8::Local<v8::String> api_string = |
| 412 Utils::ToLocal(handle(regexp->Pattern(), isolate_)); |
| 413 uint32_t utf8_length = api_string->Utf8Length(); |
| 414 WriteVarint(utf8_length); |
| 415 api_string->WriteUtf8(reinterpret_cast<char*>(ReserveRawBytes(utf8_length)), |
| 416 utf8_length, nullptr, v8::String::NO_NULL_TERMINATION); |
| 417 WriteVarint(static_cast<uint32_t>(regexp->GetFlags())); |
| 418 } |
| 419 |
| 403 Maybe<uint32_t> ValueSerializer::WriteJSObjectProperties( | 420 Maybe<uint32_t> ValueSerializer::WriteJSObjectProperties( |
| 404 Handle<JSObject> object, Handle<FixedArray> keys) { | 421 Handle<JSObject> object, Handle<FixedArray> keys) { |
| 405 uint32_t properties_written = 0; | 422 uint32_t properties_written = 0; |
| 406 int length = keys->length(); | 423 int length = keys->length(); |
| 407 for (int i = 0; i < length; i++) { | 424 for (int i = 0; i < length; i++) { |
| 408 Handle<Object> key(keys->get(i), isolate_); | 425 Handle<Object> key(keys->get(i), isolate_); |
| 409 | 426 |
| 410 bool success; | 427 bool success; |
| 411 LookupIterator it = LookupIterator::PropertyOrElement( | 428 LookupIterator it = LookupIterator::PropertyOrElement( |
| 412 isolate_, object, key, &success, LookupIterator::OWN); | 429 isolate_, object, key, &success, LookupIterator::OWN); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 return ReadSparseJSArray(); | 597 return ReadSparseJSArray(); |
| 581 case SerializationTag::kBeginDenseJSArray: | 598 case SerializationTag::kBeginDenseJSArray: |
| 582 return ReadDenseJSArray(); | 599 return ReadDenseJSArray(); |
| 583 case SerializationTag::kDate: | 600 case SerializationTag::kDate: |
| 584 return ReadJSDate(); | 601 return ReadJSDate(); |
| 585 case SerializationTag::kTrueObject: | 602 case SerializationTag::kTrueObject: |
| 586 case SerializationTag::kFalseObject: | 603 case SerializationTag::kFalseObject: |
| 587 case SerializationTag::kNumberObject: | 604 case SerializationTag::kNumberObject: |
| 588 case SerializationTag::kStringObject: | 605 case SerializationTag::kStringObject: |
| 589 return ReadJSValue(tag); | 606 return ReadJSValue(tag); |
| 607 case SerializationTag::kRegExp: |
| 608 return ReadJSRegExp(); |
| 590 default: | 609 default: |
| 591 return MaybeHandle<Object>(); | 610 return MaybeHandle<Object>(); |
| 592 } | 611 } |
| 593 } | 612 } |
| 594 | 613 |
| 595 MaybeHandle<String> ValueDeserializer::ReadUtf8String() { | 614 MaybeHandle<String> ValueDeserializer::ReadUtf8String() { |
| 596 uint32_t utf8_length; | 615 uint32_t utf8_length; |
| 597 Vector<const uint8_t> utf8_bytes; | 616 Vector<const uint8_t> utf8_bytes; |
| 598 if (!ReadVarint<uint32_t>().To(&utf8_length) || | 617 if (!ReadVarint<uint32_t>().To(&utf8_length) || |
| 599 utf8_length > | 618 utf8_length > |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 break; | 779 break; |
| 761 } | 780 } |
| 762 default: | 781 default: |
| 763 UNREACHABLE(); | 782 UNREACHABLE(); |
| 764 return MaybeHandle<JSValue>(); | 783 return MaybeHandle<JSValue>(); |
| 765 } | 784 } |
| 766 AddObjectWithID(id, value); | 785 AddObjectWithID(id, value); |
| 767 return value; | 786 return value; |
| 768 } | 787 } |
| 769 | 788 |
| 789 MaybeHandle<JSRegExp> ValueDeserializer::ReadJSRegExp() { |
| 790 uint32_t id = next_id_++; |
| 791 Handle<String> pattern; |
| 792 uint32_t raw_flags; |
| 793 Handle<JSRegExp> regexp; |
| 794 if (!ReadUtf8String().ToHandle(&pattern) || |
| 795 !ReadVarint<uint32_t>().To(&raw_flags) || |
| 796 !JSRegExp::New(pattern, static_cast<JSRegExp::Flags>(raw_flags)) |
| 797 .ToHandle(®exp)) { |
| 798 return MaybeHandle<JSRegExp>(); |
| 799 } |
| 800 AddObjectWithID(id, regexp); |
| 801 return regexp; |
| 802 } |
| 803 |
| 770 Maybe<uint32_t> ValueDeserializer::ReadJSObjectProperties( | 804 Maybe<uint32_t> ValueDeserializer::ReadJSObjectProperties( |
| 771 Handle<JSObject> object, SerializationTag end_tag) { | 805 Handle<JSObject> object, SerializationTag end_tag) { |
| 772 for (uint32_t num_properties = 0;; num_properties++) { | 806 for (uint32_t num_properties = 0;; num_properties++) { |
| 773 SerializationTag tag; | 807 SerializationTag tag; |
| 774 if (!PeekTag().To(&tag)) return Nothing<uint32_t>(); | 808 if (!PeekTag().To(&tag)) return Nothing<uint32_t>(); |
| 775 if (tag == end_tag) { | 809 if (tag == end_tag) { |
| 776 ConsumeTag(end_tag); | 810 ConsumeTag(end_tag); |
| 777 return Just(num_properties); | 811 return Just(num_properties); |
| 778 } | 812 } |
| 779 | 813 |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 924 } | 958 } |
| 925 #endif | 959 #endif |
| 926 position_ = end_; | 960 position_ = end_; |
| 927 | 961 |
| 928 if (stack.size() != 1) return MaybeHandle<Object>(); | 962 if (stack.size() != 1) return MaybeHandle<Object>(); |
| 929 return scope.CloseAndEscape(stack[0]); | 963 return scope.CloseAndEscape(stack[0]); |
| 930 } | 964 } |
| 931 | 965 |
| 932 } // namespace internal | 966 } // namespace internal |
| 933 } // namespace v8 | 967 } // namespace v8 |
| OLD | NEW |