Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Side by Side Diff: src/value-serializer.cc

Issue 2262013002: Blink-compatible serialization of RegExp objects. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@vs-value
Patch Set: Merge branch 'vs-value' into vs-regexp Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/value-serializer.h ('k') | test/unittests/value-serializer-unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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(&regexp)) {
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
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
OLDNEW
« no previous file with comments | « src/value-serializer.h ('k') | test/unittests/value-serializer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698