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

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

Issue 2709023003: ValueSerializer: Add an explicit tag for host objects. (Closed)
Patch Set: correct version number Created 3 years, 10 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 | « no previous file | 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/conversions.h" 10 #include "src/conversions.h"
11 #include "src/factory.h" 11 #include "src/factory.h"
12 #include "src/flags.h" 12 #include "src/flags.h"
13 #include "src/handles-inl.h" 13 #include "src/handles-inl.h"
14 #include "src/isolate.h" 14 #include "src/isolate.h"
15 #include "src/objects-inl.h" 15 #include "src/objects-inl.h"
16 #include "src/objects.h" 16 #include "src/objects.h"
17 #include "src/snapshot/code-serializer.h" 17 #include "src/snapshot/code-serializer.h"
18 #include "src/transitions.h" 18 #include "src/transitions.h"
19 #include "src/wasm/wasm-module.h" 19 #include "src/wasm/wasm-module.h"
20 #include "src/wasm/wasm-objects.h" 20 #include "src/wasm/wasm-objects.h"
21 #include "src/wasm/wasm-result.h" 21 #include "src/wasm/wasm-result.h"
22 22
23 namespace v8 { 23 namespace v8 {
24 namespace internal { 24 namespace internal {
25 25
26 // Version 9: (imported from Blink) 26 // Version 9: (imported from Blink)
27 // Version 10: one-byte (Latin-1) strings 27 // Version 10: one-byte (Latin-1) strings
28 // Version 11: properly separate undefined from the hole in arrays 28 // Version 11: properly separate undefined from the hole in arrays
29 // Version 12: regexp and string objects share normal string encoding 29 // Version 12: regexp and string objects share normal string encoding
30 static const uint32_t kLatestVersion = 12; 30 // Version 13: host objects have an explicit tag (rather than handling all
31 // unknown tags)
32 static const uint32_t kLatestVersion = 13;
31 33
32 static const int kPretenureThreshold = 100 * KB; 34 static const int kPretenureThreshold = 100 * KB;
33 35
34 template <typename T> 36 template <typename T>
35 static size_t BytesNeededForVarint(T value) { 37 static size_t BytesNeededForVarint(T value) {
36 static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value, 38 static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value,
37 "Only unsigned integer types can be written as varints."); 39 "Only unsigned integer types can be written as varints.");
38 size_t result = 0; 40 size_t result = 0;
39 do { 41 do {
40 result++; 42 result++;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 // ObjectReference to one) serialized just before it. This is a quirk arising 119 // ObjectReference to one) serialized just before it. This is a quirk arising
118 // from the previous stack-based implementation. 120 // from the previous stack-based implementation.
119 kArrayBufferView = 'V', 121 kArrayBufferView = 'V',
120 // Shared array buffer. transferID:uint32_t 122 // Shared array buffer. transferID:uint32_t
121 kSharedArrayBuffer = 'u', 123 kSharedArrayBuffer = 'u',
122 // Compiled WebAssembly module. encodingType:(one-byte tag). 124 // Compiled WebAssembly module. encodingType:(one-byte tag).
123 // If encodingType == 'y' (raw bytes): 125 // If encodingType == 'y' (raw bytes):
124 // wasmWireByteLength:uint32_t, then raw data 126 // wasmWireByteLength:uint32_t, then raw data
125 // compiledDataLength:uint32_t, then raw data 127 // compiledDataLength:uint32_t, then raw data
126 kWasmModule = 'W', 128 kWasmModule = 'W',
129 // The delegate is responsible for processing all following data.
130 // This "escapes" to whatever wire format the delegate chooses.
131 kHostObject = '\\',
127 }; 132 };
128 133
129 namespace { 134 namespace {
130 135
131 enum class ArrayBufferViewTag : uint8_t { 136 enum class ArrayBufferViewTag : uint8_t {
132 kInt8Array = 'b', 137 kInt8Array = 'b',
133 kUint8Array = 'B', 138 kUint8Array = 'B',
134 kUint8ClampedArray = 'C', 139 kUint8ClampedArray = 'C',
135 kInt16Array = 'w', 140 kInt16Array = 'w',
136 kUint16Array = 'W', 141 kUint16Array = 'W',
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 WasmCompiledModuleSerializer::SerializeWasmModule(isolate_, 821 WasmCompiledModuleSerializer::SerializeWasmModule(isolate_,
817 compiled_part); 822 compiled_part);
818 int script_data_length = script_data->length(); 823 int script_data_length = script_data->length();
819 WriteVarint<uint32_t>(script_data_length); 824 WriteVarint<uint32_t>(script_data_length);
820 WriteRawBytes(script_data->data(), script_data_length); 825 WriteRawBytes(script_data->data(), script_data_length);
821 826
822 return ThrowIfOutOfMemory(); 827 return ThrowIfOutOfMemory();
823 } 828 }
824 829
825 Maybe<bool> ValueSerializer::WriteHostObject(Handle<JSObject> object) { 830 Maybe<bool> ValueSerializer::WriteHostObject(Handle<JSObject> object) {
831 WriteTag(SerializationTag::kHostObject);
826 if (!delegate_) { 832 if (!delegate_) {
827 isolate_->Throw(*isolate_->factory()->NewError( 833 isolate_->Throw(*isolate_->factory()->NewError(
828 isolate_->error_function(), MessageTemplate::kDataCloneError, object)); 834 isolate_->error_function(), MessageTemplate::kDataCloneError, object));
829 return Nothing<bool>(); 835 return Nothing<bool>();
830 } 836 }
831 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_); 837 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_);
832 Maybe<bool> result = 838 Maybe<bool> result =
833 delegate_->WriteHostObject(v8_isolate, Utils::ToLocal(object)); 839 delegate_->WriteHostObject(v8_isolate, Utils::ToLocal(object));
834 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate_, Nothing<bool>()); 840 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate_, Nothing<bool>());
835 DCHECK(!result.IsNothing()); 841 DCHECK(!result.IsNothing());
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
1137 case SerializationTag::kArrayBufferTransfer: { 1143 case SerializationTag::kArrayBufferTransfer: {
1138 const bool is_shared = false; 1144 const bool is_shared = false;
1139 return ReadTransferredJSArrayBuffer(is_shared); 1145 return ReadTransferredJSArrayBuffer(is_shared);
1140 } 1146 }
1141 case SerializationTag::kSharedArrayBuffer: { 1147 case SerializationTag::kSharedArrayBuffer: {
1142 const bool is_shared = true; 1148 const bool is_shared = true;
1143 return ReadTransferredJSArrayBuffer(is_shared); 1149 return ReadTransferredJSArrayBuffer(is_shared);
1144 } 1150 }
1145 case SerializationTag::kWasmModule: 1151 case SerializationTag::kWasmModule:
1146 return ReadWasmModule(); 1152 return ReadWasmModule();
1153 case SerializationTag::kHostObject:
1154 return ReadHostObject();
1147 default: 1155 default:
1148 // TODO(jbroman): Introduce an explicit tag for host objects to avoid 1156 // Before there was an explicit tag for host objects, all unknown tags
1149 // having to treat every unknown tag as a potential host object. 1157 // were delegated to the host.
1150 position_--; 1158 if (version_ < 13) {
1151 return ReadHostObject(); 1159 position_--;
1160 return ReadHostObject();
1161 }
1162 return MaybeHandle<Object>();
1152 } 1163 }
1153 } 1164 }
1154 1165
1155 MaybeHandle<String> ValueDeserializer::ReadString() { 1166 MaybeHandle<String> ValueDeserializer::ReadString() {
1156 if (version_ < 12) return ReadUtf8String(); 1167 if (version_ < 12) return ReadUtf8String();
1157 Handle<Object> object; 1168 Handle<Object> object;
1158 if (!ReadObject().ToHandle(&object) || !object->IsString()) { 1169 if (!ReadObject().ToHandle(&object) || !object->IsString()) {
1159 return MaybeHandle<String>(); 1170 return MaybeHandle<String>();
1160 } 1171 }
1161 return Handle<String>::cast(object); 1172 return Handle<String>::cast(object);
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after
1944 if (stack.size() != 1) { 1955 if (stack.size() != 1) {
1945 isolate_->Throw(*isolate_->factory()->NewError( 1956 isolate_->Throw(*isolate_->factory()->NewError(
1946 MessageTemplate::kDataCloneDeserializationError)); 1957 MessageTemplate::kDataCloneDeserializationError));
1947 return MaybeHandle<Object>(); 1958 return MaybeHandle<Object>();
1948 } 1959 }
1949 return scope.CloseAndEscape(stack[0]); 1960 return scope.CloseAndEscape(stack[0]);
1950 } 1961 }
1951 1962
1952 } // namespace internal 1963 } // namespace internal
1953 } // namespace v8 1964 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/unittests/value-serializer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698