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

Side by Side Diff: runtime/vm/dart_api_message.cc

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 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 | « runtime/vm/dart_api_message.h ('k') | runtime/vm/dart_api_state.h » ('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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/dart_api_message.h" 5 #include "vm/dart_api_message.h"
6 #include "vm/object.h" 6 #include "vm/object.h"
7 #include "vm/snapshot_ids.h" 7 #include "vm/snapshot_ids.h"
8 #include "vm/symbols.h" 8 #include "vm/symbols.h"
9 #include "vm/unicode.h" 9 #include "vm/unicode.h"
10 10
11 namespace dart { 11 namespace dart {
12 12
13 static const int kNumInitialReferences = 4; 13 static const int kNumInitialReferences = 4;
14 14
15 ApiMessageReader::ApiMessageReader(const uint8_t* buffer, intptr_t length) 15 ApiMessageReader::ApiMessageReader(const uint8_t* buffer, intptr_t length)
16 : BaseReader(buffer, length), 16 : BaseReader(buffer, length),
17 zone_(NULL), 17 zone_(NULL),
18 backward_references_(kNumInitialReferences), 18 backward_references_(kNumInitialReferences),
19 vm_isolate_references_(kNumInitialReferences), 19 vm_isolate_references_(kNumInitialReferences),
20 vm_symbol_references_(NULL) {} 20 vm_symbol_references_(NULL) {}
21 21
22
23 ApiMessageReader::ApiMessageReader(Message* msg) 22 ApiMessageReader::ApiMessageReader(Message* msg)
24 : BaseReader(msg->IsRaw() ? reinterpret_cast<uint8_t*>(msg->raw_obj()) 23 : BaseReader(msg->IsRaw() ? reinterpret_cast<uint8_t*>(msg->raw_obj())
25 : msg->data(), 24 : msg->data(),
26 msg->len()), 25 msg->len()),
27 zone_(NULL), 26 zone_(NULL),
28 backward_references_(kNumInitialReferences), 27 backward_references_(kNumInitialReferences),
29 vm_isolate_references_(kNumInitialReferences), 28 vm_isolate_references_(kNumInitialReferences),
30 vm_symbol_references_(NULL) {} 29 vm_symbol_references_(NULL) {}
31 30
32
33 void ApiMessageReader::Init() { 31 void ApiMessageReader::Init() {
34 // We need to have an enclosing ApiNativeScope. 32 // We need to have an enclosing ApiNativeScope.
35 ASSERT(ApiNativeScope::Current() != NULL); 33 ASSERT(ApiNativeScope::Current() != NULL);
36 zone_ = ApiNativeScope::Current()->zone(); 34 zone_ = ApiNativeScope::Current()->zone();
37 ASSERT(zone_ != NULL); 35 ASSERT(zone_ != NULL);
38 36
39 // Initialize marker objects used to handle Lists. 37 // Initialize marker objects used to handle Lists.
40 // TODO(sjesse): Remove this when message serialization format is 38 // TODO(sjesse): Remove this when message serialization format is
41 // updated. 39 // updated.
42 memset(&type_arguments_marker, 0, sizeof(type_arguments_marker)); 40 memset(&type_arguments_marker, 0, sizeof(type_arguments_marker));
43 memset(&dynamic_type_marker, 0, sizeof(dynamic_type_marker)); 41 memset(&dynamic_type_marker, 0, sizeof(dynamic_type_marker));
44 type_arguments_marker.type = 42 type_arguments_marker.type =
45 static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kTypeArguments); 43 static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kTypeArguments);
46 dynamic_type_marker.type = 44 dynamic_type_marker.type =
47 static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kDynamicType); 45 static_cast<Dart_CObject_Type>(Dart_CObject_Internal::kDynamicType);
48 } 46 }
49 47
50
51 Dart_CObject* ApiMessageReader::ReadMessage() { 48 Dart_CObject* ApiMessageReader::ReadMessage() {
52 Init(); 49 Init();
53 if (PendingBytes() > 0) { 50 if (PendingBytes() > 0) {
54 // Read the object out of the message. 51 // Read the object out of the message.
55 return ReadObject(); 52 return ReadObject();
56 } else { 53 } else {
57 const RawObject* raw_obj = 54 const RawObject* raw_obj =
58 reinterpret_cast<const RawObject*>(CurrentBufferAddress()); 55 reinterpret_cast<const RawObject*>(CurrentBufferAddress());
59 ASSERT(ApiObjectConverter::CanConvert(raw_obj)); 56 ASSERT(ApiObjectConverter::CanConvert(raw_obj));
60 Dart_CObject* cobj = 57 Dart_CObject* cobj =
61 reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject))); 58 reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject)));
62 ApiObjectConverter::Convert(raw_obj, cobj); 59 ApiObjectConverter::Convert(raw_obj, cobj);
63 return cobj; 60 return cobj;
64 } 61 }
65 } 62 }
66 63
67
68 intptr_t ApiMessageReader::LookupInternalClass(intptr_t class_header) { 64 intptr_t ApiMessageReader::LookupInternalClass(intptr_t class_header) {
69 if (IsVMIsolateObject(class_header)) { 65 if (IsVMIsolateObject(class_header)) {
70 return GetVMIsolateObjectId(class_header); 66 return GetVMIsolateObjectId(class_header);
71 } 67 }
72 ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId); 68 ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId);
73 return SerializedHeaderData::decode(class_header); 69 return SerializedHeaderData::decode(class_header);
74 } 70 }
75 71
76
77 Dart_CObject* ApiMessageReader::AllocateDartCObject(Dart_CObject_Type type) { 72 Dart_CObject* ApiMessageReader::AllocateDartCObject(Dart_CObject_Type type) {
78 Dart_CObject* value = 73 Dart_CObject* value =
79 reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject))); 74 reinterpret_cast<Dart_CObject*>(allocator(sizeof(Dart_CObject)));
80 ASSERT(value != NULL); 75 ASSERT(value != NULL);
81 value->type = type; 76 value->type = type;
82 return value; 77 return value;
83 } 78 }
84 79
85
86 Dart_CObject* ApiMessageReader::AllocateDartCObjectUnsupported() { 80 Dart_CObject* ApiMessageReader::AllocateDartCObjectUnsupported() {
87 return AllocateDartCObject(Dart_CObject_kUnsupported); 81 return AllocateDartCObject(Dart_CObject_kUnsupported);
88 } 82 }
89 83
90
91 Dart_CObject* ApiMessageReader::AllocateDartCObjectNull() { 84 Dart_CObject* ApiMessageReader::AllocateDartCObjectNull() {
92 return AllocateDartCObject(Dart_CObject_kNull); 85 return AllocateDartCObject(Dart_CObject_kNull);
93 } 86 }
94 87
95
96 Dart_CObject* ApiMessageReader::AllocateDartCObjectBool(bool val) { 88 Dart_CObject* ApiMessageReader::AllocateDartCObjectBool(bool val) {
97 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kBool); 89 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kBool);
98 value->value.as_bool = val; 90 value->value.as_bool = val;
99 return value; 91 return value;
100 } 92 }
101 93
102
103 Dart_CObject* ApiMessageReader::AllocateDartCObjectInt32(int32_t val) { 94 Dart_CObject* ApiMessageReader::AllocateDartCObjectInt32(int32_t val) {
104 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kInt32); 95 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kInt32);
105 value->value.as_int32 = val; 96 value->value.as_int32 = val;
106 return value; 97 return value;
107 } 98 }
108 99
109
110 Dart_CObject* ApiMessageReader::AllocateDartCObjectInt64(int64_t val) { 100 Dart_CObject* ApiMessageReader::AllocateDartCObjectInt64(int64_t val) {
111 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kInt64); 101 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kInt64);
112 value->value.as_int64 = val; 102 value->value.as_int64 = val;
113 return value; 103 return value;
114 } 104 }
115 105
116
117 _Dart_CObject* ApiMessageReader::singleton_uint32_typed_data_ = NULL; 106 _Dart_CObject* ApiMessageReader::singleton_uint32_typed_data_ = NULL;
118 107
119 Dart_CObject* ApiMessageReader::AllocateDartCObjectBigint() { 108 Dart_CObject* ApiMessageReader::AllocateDartCObjectBigint() {
120 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kBigint); 109 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kBigint);
121 value->value.as_bigint.neg = false; 110 value->value.as_bigint.neg = false;
122 value->value.as_bigint.used = 0; 111 value->value.as_bigint.used = 0;
123 if (singleton_uint32_typed_data_ == NULL) { 112 if (singleton_uint32_typed_data_ == NULL) {
124 singleton_uint32_typed_data_ = 113 singleton_uint32_typed_data_ =
125 AllocateDartCObjectTypedData(Dart_TypedData_kUint32, 0); 114 AllocateDartCObjectTypedData(Dart_TypedData_kUint32, 0);
126 } 115 }
127 value->value.as_bigint.digits = singleton_uint32_typed_data_; 116 value->value.as_bigint.digits = singleton_uint32_typed_data_;
128 value->type = Dart_CObject_kBigint; 117 value->type = Dart_CObject_kBigint;
129 return value; 118 return value;
130 } 119 }
131 120
132
133 Dart_CObject* ApiMessageReader::AllocateDartCObjectDouble(double val) { 121 Dart_CObject* ApiMessageReader::AllocateDartCObjectDouble(double val) {
134 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kDouble); 122 Dart_CObject* value = AllocateDartCObject(Dart_CObject_kDouble);
135 value->value.as_double = val; 123 value->value.as_double = val;
136 return value; 124 return value;
137 } 125 }
138 126
139
140 Dart_CObject* ApiMessageReader::AllocateDartCObjectString(intptr_t length) { 127 Dart_CObject* ApiMessageReader::AllocateDartCObjectString(intptr_t length) {
141 // Allocate a Dart_CObject structure followed by an array of chars 128 // Allocate a Dart_CObject structure followed by an array of chars
142 // for the string content. The pointer to the string content is set 129 // for the string content. The pointer to the string content is set
143 // up to this area. 130 // up to this area.
144 Dart_CObject* value = reinterpret_cast<Dart_CObject*>( 131 Dart_CObject* value = reinterpret_cast<Dart_CObject*>(
145 allocator(sizeof(Dart_CObject) + length + 1)); 132 allocator(sizeof(Dart_CObject) + length + 1));
146 ASSERT(value != NULL); 133 ASSERT(value != NULL);
147 value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value); 134 value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value);
148 value->type = Dart_CObject_kString; 135 value->type = Dart_CObject_kString;
149 return value; 136 return value;
150 } 137 }
151 138
152
153 static int GetTypedDataSizeInBytes(Dart_TypedData_Type type) { 139 static int GetTypedDataSizeInBytes(Dart_TypedData_Type type) {
154 switch (type) { 140 switch (type) {
155 case Dart_TypedData_kInt8: 141 case Dart_TypedData_kInt8:
156 case Dart_TypedData_kUint8: 142 case Dart_TypedData_kUint8:
157 case Dart_TypedData_kUint8Clamped: 143 case Dart_TypedData_kUint8Clamped:
158 return 1; 144 return 1;
159 case Dart_TypedData_kInt16: 145 case Dart_TypedData_kInt16:
160 case Dart_TypedData_kUint16: 146 case Dart_TypedData_kUint16:
161 return 2; 147 return 2;
162 case Dart_TypedData_kInt32: 148 case Dart_TypedData_kInt32:
163 case Dart_TypedData_kUint32: 149 case Dart_TypedData_kUint32:
164 case Dart_TypedData_kFloat32: 150 case Dart_TypedData_kFloat32:
165 return 4; 151 return 4;
166 case Dart_TypedData_kInt64: 152 case Dart_TypedData_kInt64:
167 case Dart_TypedData_kUint64: 153 case Dart_TypedData_kUint64:
168 case Dart_TypedData_kFloat64: 154 case Dart_TypedData_kFloat64:
169 return 8; 155 return 8;
170 default: 156 default:
171 break; 157 break;
172 } 158 }
173 UNREACHABLE(); 159 UNREACHABLE();
174 return -1; 160 return -1;
175 } 161 }
176 162
177
178 Dart_CObject* ApiMessageReader::AllocateDartCObjectTypedData( 163 Dart_CObject* ApiMessageReader::AllocateDartCObjectTypedData(
179 Dart_TypedData_Type type, 164 Dart_TypedData_Type type,
180 intptr_t length) { 165 intptr_t length) {
181 // Allocate a Dart_CObject structure followed by an array of bytes 166 // Allocate a Dart_CObject structure followed by an array of bytes
182 // for the byte array content. The pointer to the byte array content 167 // for the byte array content. The pointer to the byte array content
183 // is set up to this area. 168 // is set up to this area.
184 intptr_t length_in_bytes = GetTypedDataSizeInBytes(type) * length; 169 intptr_t length_in_bytes = GetTypedDataSizeInBytes(type) * length;
185 Dart_CObject* value = reinterpret_cast<Dart_CObject*>( 170 Dart_CObject* value = reinterpret_cast<Dart_CObject*>(
186 allocator(sizeof(Dart_CObject) + length_in_bytes)); 171 allocator(sizeof(Dart_CObject) + length_in_bytes));
187 ASSERT(value != NULL); 172 ASSERT(value != NULL);
188 value->type = Dart_CObject_kTypedData; 173 value->type = Dart_CObject_kTypedData;
189 value->value.as_typed_data.type = type; 174 value->value.as_typed_data.type = type;
190 value->value.as_typed_data.length = length_in_bytes; 175 value->value.as_typed_data.length = length_in_bytes;
191 if (length > 0) { 176 if (length > 0) {
192 value->value.as_typed_data.values = 177 value->value.as_typed_data.values =
193 reinterpret_cast<uint8_t*>(value) + sizeof(*value); 178 reinterpret_cast<uint8_t*>(value) + sizeof(*value);
194 } else { 179 } else {
195 value->value.as_typed_data.values = NULL; 180 value->value.as_typed_data.values = NULL;
196 } 181 }
197 return value; 182 return value;
198 } 183 }
199 184
200
201 Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) { 185 Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) {
202 // Allocate a Dart_CObject structure followed by an array of 186 // Allocate a Dart_CObject structure followed by an array of
203 // pointers to Dart_CObject structures. The pointer to the array 187 // pointers to Dart_CObject structures. The pointer to the array
204 // content is set up to this area. 188 // content is set up to this area.
205 Dart_CObject* value = reinterpret_cast<Dart_CObject*>( 189 Dart_CObject* value = reinterpret_cast<Dart_CObject*>(
206 allocator(sizeof(Dart_CObject) + length * sizeof(value))); 190 allocator(sizeof(Dart_CObject) + length * sizeof(value)));
207 ASSERT(value != NULL); 191 ASSERT(value != NULL);
208 value->type = Dart_CObject_kArray; 192 value->type = Dart_CObject_kArray;
209 value->value.as_array.length = length; 193 value->value.as_array.length = length;
210 if (length > 0) { 194 if (length > 0) {
211 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1); 195 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1);
212 } else { 196 } else {
213 value->value.as_array.values = NULL; 197 value->value.as_array.values = NULL;
214 } 198 }
215 return value; 199 return value;
216 } 200 }
217 201
218
219 Dart_CObject* ApiMessageReader::AllocateDartCObjectVmIsolateObj(intptr_t id) { 202 Dart_CObject* ApiMessageReader::AllocateDartCObjectVmIsolateObj(intptr_t id) {
220 RawObject* raw = VmIsolateSnapshotObject(id); 203 RawObject* raw = VmIsolateSnapshotObject(id);
221 intptr_t cid = raw->GetClassId(); 204 intptr_t cid = raw->GetClassId();
222 switch (cid) { 205 switch (cid) {
223 case kOneByteStringCid: { 206 case kOneByteStringCid: {
224 RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw); 207 RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw);
225 const char* str = reinterpret_cast<const char*>(raw_str->ptr()->data()); 208 const char* str = reinterpret_cast<const char*>(raw_str->ptr()->data());
226 ASSERT(str != NULL); 209 ASSERT(str != NULL);
227 Dart_CObject* object = NULL; 210 Dart_CObject* object = NULL;
228 for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) { 211 for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) {
(...skipping 18 matching lines...) Expand all
247 return GetCanonicalMintObject(Dart_CObject_kInt64, value64); 230 return GetCanonicalMintObject(Dart_CObject_kInt64, value64);
248 } 231 }
249 } 232 }
250 233
251 default: 234 default:
252 UNREACHABLE(); 235 UNREACHABLE();
253 return NULL; 236 return NULL;
254 } 237 }
255 } 238 }
256 239
257
258 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal( 240 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal(
259 Dart_CObject_Internal::Type type) { 241 Dart_CObject_Internal::Type type) {
260 Dart_CObject_Internal* value = reinterpret_cast<Dart_CObject_Internal*>( 242 Dart_CObject_Internal* value = reinterpret_cast<Dart_CObject_Internal*>(
261 allocator(sizeof(Dart_CObject_Internal))); 243 allocator(sizeof(Dart_CObject_Internal)));
262 ASSERT(value != NULL); 244 ASSERT(value != NULL);
263 value->type = static_cast<Dart_CObject_Type>(type); 245 value->type = static_cast<Dart_CObject_Type>(type);
264 return value; 246 return value;
265 } 247 }
266 248
267
268 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectClass() { 249 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectClass() {
269 return AllocateDartCObjectInternal(Dart_CObject_Internal::kClass); 250 return AllocateDartCObjectInternal(Dart_CObject_Internal::kClass);
270 } 251 }
271 252
272
273 ApiMessageReader::BackRefNode* ApiMessageReader::AllocateBackRefNode( 253 ApiMessageReader::BackRefNode* ApiMessageReader::AllocateBackRefNode(
274 Dart_CObject* reference, 254 Dart_CObject* reference,
275 DeserializeState state) { 255 DeserializeState state) {
276 BackRefNode* value = 256 BackRefNode* value =
277 reinterpret_cast<BackRefNode*>(allocator(sizeof(BackRefNode))); 257 reinterpret_cast<BackRefNode*>(allocator(sizeof(BackRefNode)));
278 value->set_reference(reference); 258 value->set_reference(reference);
279 value->set_state(state); 259 value->set_state(state);
280 return value; 260 return value;
281 } 261 }
282 262
283
284 static Dart_TypedData_Type GetTypedDataTypeFromView( 263 static Dart_TypedData_Type GetTypedDataTypeFromView(
285 Dart_CObject_Internal* object, 264 Dart_CObject_Internal* object,
286 char* class_name) { 265 char* class_name) {
287 struct { 266 struct {
288 const char* name; 267 const char* name;
289 Dart_TypedData_Type type; 268 Dart_TypedData_Type type;
290 } view_class_names[] = { 269 } view_class_names[] = {
291 {"_Int8ArrayView", Dart_TypedData_kInt8}, 270 {"_Int8ArrayView", Dart_TypedData_kInt8},
292 {"_Uint8ArrayView", Dart_TypedData_kUint8}, 271 {"_Uint8ArrayView", Dart_TypedData_kUint8},
293 {"_Uint8ClampedArrayView", Dart_TypedData_kUint8Clamped}, 272 {"_Uint8ClampedArrayView", Dart_TypedData_kUint8Clamped},
(...skipping 13 matching lines...) Expand all
307 while (view_class_names[i].name != NULL) { 286 while (view_class_names[i].name != NULL) {
308 if (strncmp(view_class_names[i].name, class_name, 287 if (strncmp(view_class_names[i].name, class_name,
309 strlen(view_class_names[i].name)) == 0) { 288 strlen(view_class_names[i].name)) == 0) {
310 return view_class_names[i].type; 289 return view_class_names[i].type;
311 } 290 }
312 i++; 291 i++;
313 } 292 }
314 return Dart_TypedData_kInvalid; 293 return Dart_TypedData_kInvalid;
315 } 294 }
316 295
317
318 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { 296 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) {
319 // Read the class header information and lookup the class. 297 // Read the class header information and lookup the class.
320 intptr_t class_header = Read<int32_t>(); 298 intptr_t class_header = Read<int32_t>();
321 intptr_t tags = ReadTags(); 299 intptr_t tags = ReadTags();
322 USE(tags); 300 USE(tags);
323 intptr_t class_id; 301 intptr_t class_id;
324 302
325 // There is limited support for reading regular dart instances. Only 303 // There is limited support for reading regular dart instances. Only
326 // typed data views are currently handled. 304 // typed data views are currently handled.
327 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { 305 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 } 378 }
401 for (int i = 0; i < len; i++) { 379 for (int i = 0; i < len; i++) {
402 value->value.as_array.values[i] = ReadObjectRef(); 380 value->value.as_array.values[i] = ReadObjectRef();
403 } 381 }
404 return value; 382 return value;
405 } 383 }
406 384
407 return ReadInternalVMObject(class_id, object_id); 385 return ReadInternalVMObject(class_id, object_id);
408 } 386 }
409 387
410
411 Dart_CObject* ApiMessageReader::ReadPredefinedSymbol(intptr_t object_id) { 388 Dart_CObject* ApiMessageReader::ReadPredefinedSymbol(intptr_t object_id) {
412 ASSERT(Symbols::IsPredefinedSymbolId(object_id)); 389 ASSERT(Symbols::IsPredefinedSymbolId(object_id));
413 intptr_t symbol_id = object_id - kMaxPredefinedObjectIds; 390 intptr_t symbol_id = object_id - kMaxPredefinedObjectIds;
414 Dart_CObject* object; 391 Dart_CObject* object;
415 if (vm_symbol_references_ != NULL && 392 if (vm_symbol_references_ != NULL &&
416 (object = vm_symbol_references_[symbol_id]) != NULL) { 393 (object = vm_symbol_references_[symbol_id]) != NULL) {
417 return object; 394 return object;
418 } 395 }
419 396
420 if (vm_symbol_references_ == NULL) { 397 if (vm_symbol_references_ == NULL) {
421 intptr_t size = 398 intptr_t size =
422 (sizeof(*vm_symbol_references_) * Symbols::kMaxPredefinedId); 399 (sizeof(*vm_symbol_references_) * Symbols::kMaxPredefinedId);
423 vm_symbol_references_ = reinterpret_cast<Dart_CObject**>(allocator(size)); 400 vm_symbol_references_ = reinterpret_cast<Dart_CObject**>(allocator(size));
424 memset(vm_symbol_references_, 0, size); 401 memset(vm_symbol_references_, 0, size);
425 } 402 }
426 403
427 object = CreateDartCObjectString(Symbols::GetPredefinedSymbol(object_id)); 404 object = CreateDartCObjectString(Symbols::GetPredefinedSymbol(object_id));
428 ASSERT(vm_symbol_references_[symbol_id] == NULL); 405 ASSERT(vm_symbol_references_[symbol_id] == NULL);
429 vm_symbol_references_[symbol_id] = object; 406 vm_symbol_references_[symbol_id] = object;
430 return object; 407 return object;
431 } 408 }
432 409
433
434 intptr_t ApiMessageReader::NextAvailableObjectId() const { 410 intptr_t ApiMessageReader::NextAvailableObjectId() const {
435 return backward_references_.length() + kMaxPredefinedObjectIds; 411 return backward_references_.length() + kMaxPredefinedObjectIds;
436 } 412 }
437 413
438
439 Dart_CObject* ApiMessageReader::CreateDartCObjectString(RawObject* raw) { 414 Dart_CObject* ApiMessageReader::CreateDartCObjectString(RawObject* raw) {
440 ASSERT(RawObject::IsOneByteStringClassId(raw->GetClassId())); 415 ASSERT(RawObject::IsOneByteStringClassId(raw->GetClassId()));
441 RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw); 416 RawOneByteString* raw_str = reinterpret_cast<RawOneByteString*>(raw);
442 intptr_t len = Smi::Value(raw_str->ptr()->length_); 417 intptr_t len = Smi::Value(raw_str->ptr()->length_);
443 Dart_CObject* object = AllocateDartCObjectString(len); 418 Dart_CObject* object = AllocateDartCObjectString(len);
444 char* p = object->value.as_string; 419 char* p = object->value.as_string;
445 memmove(p, raw_str->ptr()->data(), len); 420 memmove(p, raw_str->ptr()->data(), len);
446 p[len] = '\0'; 421 p[len] = '\0';
447 return object; 422 return object;
448 } 423 }
449 424
450
451 Dart_CObject* ApiMessageReader::GetCanonicalMintObject(Dart_CObject_Type type, 425 Dart_CObject* ApiMessageReader::GetCanonicalMintObject(Dart_CObject_Type type,
452 int64_t value64) { 426 int64_t value64) {
453 Dart_CObject* object = NULL; 427 Dart_CObject* object = NULL;
454 for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) { 428 for (intptr_t i = 0; i < vm_isolate_references_.length(); i++) {
455 object = vm_isolate_references_.At(i); 429 object = vm_isolate_references_.At(i);
456 if (object->type == type) { 430 if (object->type == type) {
457 if (value64 == object->value.as_int64) { 431 if (value64 == object->value.as_int64) {
458 return object; 432 return object;
459 } 433 }
460 } 434 }
461 } 435 }
462 if (type == Dart_CObject_kInt32) { 436 if (type == Dart_CObject_kInt32) {
463 object = AllocateDartCObjectInt32(static_cast<int32_t>(value64)); 437 object = AllocateDartCObjectInt32(static_cast<int32_t>(value64));
464 } else { 438 } else {
465 object = AllocateDartCObjectInt64(value64); 439 object = AllocateDartCObjectInt64(value64);
466 } 440 }
467 vm_isolate_references_.Add(object); 441 vm_isolate_references_.Add(object);
468 return object; 442 return object;
469 } 443 }
470 444
471
472 Dart_CObject* ApiMessageReader::ReadObjectRef() { 445 Dart_CObject* ApiMessageReader::ReadObjectRef() {
473 int64_t value64 = Read<int64_t>(); 446 int64_t value64 = Read<int64_t>();
474 if ((value64 & kSmiTagMask) == 0) { 447 if ((value64 & kSmiTagMask) == 0) {
475 int64_t untagged_value = value64 >> kSmiTagShift; 448 int64_t untagged_value = value64 >> kSmiTagShift;
476 if ((kMinInt32 <= untagged_value) && (untagged_value <= kMaxInt32)) { 449 if ((kMinInt32 <= untagged_value) && (untagged_value <= kMaxInt32)) {
477 return AllocateDartCObjectInt32(static_cast<int32_t>(untagged_value)); 450 return AllocateDartCObjectInt32(static_cast<int32_t>(untagged_value));
478 } else { 451 } else {
479 return AllocateDartCObjectInt64(untagged_value); 452 return AllocateDartCObjectInt64(untagged_value);
480 } 453 }
481 } 454 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) { 489 if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) {
517 ASSERT(GetBackRef(object_id) == NULL); 490 ASSERT(GetBackRef(object_id) == NULL);
518 intptr_t len = ReadSmiValue(); 491 intptr_t len = ReadSmiValue();
519 Dart_CObject* value = AllocateDartCObjectArray(len); 492 Dart_CObject* value = AllocateDartCObjectArray(len);
520 AddBackRef(object_id, value, kIsNotDeserialized); 493 AddBackRef(object_id, value, kIsNotDeserialized);
521 return value; 494 return value;
522 } 495 }
523 return ReadInternalVMObject(class_id, object_id); 496 return ReadInternalVMObject(class_id, object_id);
524 } 497 }
525 498
526
527 Dart_CObject* ApiMessageReader::ReadVMIsolateObject(intptr_t value) { 499 Dart_CObject* ApiMessageReader::ReadVMIsolateObject(intptr_t value) {
528 intptr_t object_id = GetVMIsolateObjectId(value); 500 intptr_t object_id = GetVMIsolateObjectId(value);
529 if (object_id == kNullObject) { 501 if (object_id == kNullObject) {
530 return AllocateDartCObjectNull(); 502 return AllocateDartCObjectNull();
531 } 503 }
532 if (object_id == kTrueValue) { 504 if (object_id == kTrueValue) {
533 return AllocateDartCObjectBool(true); 505 return AllocateDartCObjectBool(true);
534 } 506 }
535 if (object_id == kFalseValue) { 507 if (object_id == kFalseValue) {
536 return AllocateDartCObjectBool(false); 508 return AllocateDartCObjectBool(false);
537 } 509 }
538 if (object_id == kDoubleObject) { 510 if (object_id == kDoubleObject) {
539 return AllocateDartCObjectDouble(ReadDouble()); 511 return AllocateDartCObjectDouble(ReadDouble());
540 } 512 }
541 if (Symbols::IsPredefinedSymbolId(object_id)) { 513 if (Symbols::IsPredefinedSymbolId(object_id)) {
542 return ReadPredefinedSymbol(object_id); 514 return ReadPredefinedSymbol(object_id);
543 } 515 }
544 // No other VM isolate objects are supported. 516 // No other VM isolate objects are supported.
545 return AllocateDartCObjectNull(); 517 return AllocateDartCObjectNull();
546 } 518 }
547 519
548
549 Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id, 520 Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id,
550 intptr_t object_id) { 521 intptr_t object_id) {
551 switch (class_id) { 522 switch (class_id) {
552 case kClassCid: { 523 case kClassCid: {
553 Read<bool>(); // Consume the is_in_fullsnapshot indicator. 524 Read<bool>(); // Consume the is_in_fullsnapshot indicator.
554 Dart_CObject_Internal* object = AllocateDartCObjectClass(); 525 Dart_CObject_Internal* object = AllocateDartCObjectClass();
555 AddBackRef(object_id, object, kIsDeserialized); 526 AddBackRef(object_id, object, kIsDeserialized);
556 object->internal.as_class.library_url = ReadObjectImpl(); 527 object->internal.as_class.library_url = ReadObjectImpl();
557 ASSERT(object->internal.as_class.library_url->type == 528 ASSERT(object->internal.as_class.library_url->type ==
558 Dart_CObject_kString); 529 Dart_CObject_kString);
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 AddBackRef(object_id, object, kIsDeserialized); 669 AddBackRef(object_id, object, kIsDeserialized);
699 return object; 670 return object;
700 } 671 }
701 672
702 #define READ_TYPED_DATA_HEADER(type) \ 673 #define READ_TYPED_DATA_HEADER(type) \
703 intptr_t len = ReadSmiValue(); \ 674 intptr_t len = ReadSmiValue(); \
704 Dart_CObject* object = \ 675 Dart_CObject* object = \
705 AllocateDartCObjectTypedData(Dart_TypedData_k##type, len); \ 676 AllocateDartCObjectTypedData(Dart_TypedData_k##type, len); \
706 AddBackRef(object_id, object, kIsDeserialized); 677 AddBackRef(object_id, object, kIsDeserialized);
707 678
708
709 #define READ_TYPED_DATA(type, ctype) \ 679 #define READ_TYPED_DATA(type, ctype) \
710 { \ 680 { \
711 READ_TYPED_DATA_HEADER(type); \ 681 READ_TYPED_DATA_HEADER(type); \
712 if (len > 0) { \ 682 if (len > 0) { \
713 ctype* p = reinterpret_cast<ctype*>(object->value.as_typed_data.values); \ 683 ctype* p = reinterpret_cast<ctype*>(object->value.as_typed_data.values); \
714 for (intptr_t i = 0; i < len; i++) { \ 684 for (intptr_t i = 0; i < len; i++) { \
715 p[i] = Read<ctype>(); \ 685 p[i] = Read<ctype>(); \
716 } \ 686 } \
717 } \ 687 } \
718 return object; \ 688 return object; \
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 return value; 780 return value;
811 } 781 }
812 default: 782 default:
813 // Everything else not supported. 783 // Everything else not supported.
814 Dart_CObject* value = AllocateDartCObjectUnsupported(); 784 Dart_CObject* value = AllocateDartCObjectUnsupported();
815 AddBackRef(object_id, value, kIsDeserialized); 785 AddBackRef(object_id, value, kIsDeserialized);
816 return value; 786 return value;
817 } 787 }
818 } 788 }
819 789
820
821 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { 790 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) {
822 if (object_id == kDynamicType || object_id == kDoubleType || 791 if (object_id == kDynamicType || object_id == kDoubleType ||
823 object_id == kIntType || object_id == kBoolType || 792 object_id == kIntType || object_id == kBoolType ||
824 object_id == kStringType) { 793 object_id == kStringType) {
825 // Always return dynamic type (this is only a marker). 794 // Always return dynamic type (this is only a marker).
826 return &dynamic_type_marker; 795 return &dynamic_type_marker;
827 } 796 }
828 intptr_t index = object_id - kMaxPredefinedObjectIds; 797 intptr_t index = object_id - kMaxPredefinedObjectIds;
829 ASSERT((0 <= index) && (index < backward_references_.length())); 798 ASSERT((0 <= index) && (index < backward_references_.length()));
830 ASSERT(backward_references_[index]->reference() != NULL); 799 ASSERT(backward_references_[index]->reference() != NULL);
831 return backward_references_[index]->reference(); 800 return backward_references_[index]->reference();
832 } 801 }
833 802
834
835 Dart_CObject* ApiMessageReader::ReadObject() { 803 Dart_CObject* ApiMessageReader::ReadObject() {
836 Dart_CObject* value = ReadObjectImpl(); 804 Dart_CObject* value = ReadObjectImpl();
837 for (intptr_t i = 0; i < backward_references_.length(); i++) { 805 for (intptr_t i = 0; i < backward_references_.length(); i++) {
838 if (!backward_references_[i]->is_deserialized()) { 806 if (!backward_references_[i]->is_deserialized()) {
839 ReadObjectImpl(); 807 ReadObjectImpl();
840 backward_references_[i]->set_state(kIsDeserialized); 808 backward_references_[i]->set_state(kIsDeserialized);
841 } 809 }
842 } 810 }
843 return value; 811 return value;
844 } 812 }
845 813
846
847 Dart_CObject* ApiMessageReader::ReadObjectImpl() { 814 Dart_CObject* ApiMessageReader::ReadObjectImpl() {
848 int64_t value64 = Read<int64_t>(); 815 int64_t value64 = Read<int64_t>();
849 if ((value64 & kSmiTagMask) == 0) { 816 if ((value64 & kSmiTagMask) == 0) {
850 int64_t untagged_value = value64 >> kSmiTagShift; 817 int64_t untagged_value = value64 >> kSmiTagShift;
851 if ((kMinInt32 <= untagged_value) && (untagged_value <= kMaxInt32)) { 818 if ((kMinInt32 <= untagged_value) && (untagged_value <= kMaxInt32)) {
852 return AllocateDartCObjectInt32(static_cast<int32_t>(untagged_value)); 819 return AllocateDartCObjectInt32(static_cast<int32_t>(untagged_value));
853 } else { 820 } else {
854 return AllocateDartCObjectInt64(untagged_value); 821 return AllocateDartCObjectInt64(untagged_value);
855 } 822 }
856 } 823 }
857 ASSERT((value64 <= kIntptrMax) && (value64 >= kIntptrMin)); 824 ASSERT((value64 <= kIntptrMax) && (value64 >= kIntptrMin));
858 intptr_t value = static_cast<intptr_t>(value64); 825 intptr_t value = static_cast<intptr_t>(value64);
859 if (IsVMIsolateObject(value)) { 826 if (IsVMIsolateObject(value)) {
860 return ReadVMIsolateObject(value); 827 return ReadVMIsolateObject(value);
861 } 828 }
862 if (SerializedHeaderTag::decode(value) == kObjectId) { 829 if (SerializedHeaderTag::decode(value) == kObjectId) {
863 return ReadIndexedObject(SerializedHeaderData::decode(value)); 830 return ReadIndexedObject(SerializedHeaderData::decode(value));
864 } 831 }
865 ASSERT(SerializedHeaderTag::decode(value) == kInlined); 832 ASSERT(SerializedHeaderTag::decode(value) == kInlined);
866 833
867 intptr_t object_id = SerializedHeaderData::decode(value); 834 intptr_t object_id = SerializedHeaderData::decode(value);
868 if (object_id == kOmittedObjectId) { 835 if (object_id == kOmittedObjectId) {
869 object_id = NextAvailableObjectId(); 836 object_id = NextAvailableObjectId();
870 } 837 }
871 return ReadInlinedObject(object_id); 838 return ReadInlinedObject(object_id);
872 } 839 }
873 840
874
875 void ApiMessageReader::AddBackRef(intptr_t id, 841 void ApiMessageReader::AddBackRef(intptr_t id,
876 Dart_CObject* obj, 842 Dart_CObject* obj,
877 DeserializeState state) { 843 DeserializeState state) {
878 intptr_t index = (id - kMaxPredefinedObjectIds); 844 intptr_t index = (id - kMaxPredefinedObjectIds);
879 ASSERT(index == backward_references_.length()); 845 ASSERT(index == backward_references_.length());
880 BackRefNode* node = AllocateBackRefNode(obj, state); 846 BackRefNode* node = AllocateBackRefNode(obj, state);
881 ASSERT(node != NULL); 847 ASSERT(node != NULL);
882 backward_references_.Add(node); 848 backward_references_.Add(node);
883 } 849 }
884 850
885
886 Dart_CObject* ApiMessageReader::GetBackRef(intptr_t id) { 851 Dart_CObject* ApiMessageReader::GetBackRef(intptr_t id) {
887 ASSERT(id >= kMaxPredefinedObjectIds); 852 ASSERT(id >= kMaxPredefinedObjectIds);
888 intptr_t index = (id - kMaxPredefinedObjectIds); 853 intptr_t index = (id - kMaxPredefinedObjectIds);
889 if (index < backward_references_.length()) { 854 if (index < backward_references_.length()) {
890 return backward_references_[index]->reference(); 855 return backward_references_[index]->reference();
891 } 856 }
892 return NULL; 857 return NULL;
893 } 858 }
894 859
895
896 void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t* data) { 860 void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t* data) {
897 // Write out the serialization header value for this object. 861 // Write out the serialization header value for this object.
898 WriteInlinedObjectHeader(kMaxPredefinedObjectIds); 862 WriteInlinedObjectHeader(kMaxPredefinedObjectIds);
899 863
900 // Write out the class and tags information. 864 // Write out the class and tags information.
901 WriteIndexedObject(kArrayCid); 865 WriteIndexedObject(kArrayCid);
902 WriteTags(0); 866 WriteTags(0);
903 867
904 // Write out the length field. 868 // Write out the length field.
905 Write<RawObject*>(Smi::New(field_count)); 869 Write<RawObject*>(Smi::New(field_count));
906 870
907 // Write out the type arguments. 871 // Write out the type arguments.
908 WriteNullObject(); 872 WriteNullObject();
909 873
910 // Write out the individual Smis. 874 // Write out the individual Smis.
911 for (int i = 0; i < field_count; i++) { 875 for (int i = 0; i < field_count; i++) {
912 Write<RawObject*>(Integer::New(data[i])); 876 Write<RawObject*>(Integer::New(data[i]));
913 } 877 }
914 } 878 }
915 879
916
917 void ApiMessageWriter::MarkCObject(Dart_CObject* object, intptr_t object_id) { 880 void ApiMessageWriter::MarkCObject(Dart_CObject* object, intptr_t object_id) {
918 // Mark the object as serialized by adding the object id to the 881 // Mark the object as serialized by adding the object id to the
919 // upper bits of the type field in the Dart_CObject structure. Add 882 // upper bits of the type field in the Dart_CObject structure. Add
920 // an offset for making marking of object id 0 possible. 883 // an offset for making marking of object id 0 possible.
921 ASSERT(!IsCObjectMarked(object)); 884 ASSERT(!IsCObjectMarked(object));
922 intptr_t mark_value = object_id + kDartCObjectMarkOffset; 885 intptr_t mark_value = object_id + kDartCObjectMarkOffset;
923 object->type = static_cast<Dart_CObject_Type>( 886 object->type = static_cast<Dart_CObject_Type>(
924 ((mark_value) << kDartCObjectTypeBits) | object->type); 887 ((mark_value) << kDartCObjectTypeBits) | object->type);
925 } 888 }
926 889
927
928 void ApiMessageWriter::UnmarkCObject(Dart_CObject* object) { 890 void ApiMessageWriter::UnmarkCObject(Dart_CObject* object) {
929 ASSERT(IsCObjectMarked(object)); 891 ASSERT(IsCObjectMarked(object));
930 object->type = 892 object->type =
931 static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask); 893 static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask);
932 } 894 }
933 895
934
935 bool ApiMessageWriter::IsCObjectMarked(Dart_CObject* object) { 896 bool ApiMessageWriter::IsCObjectMarked(Dart_CObject* object) {
936 return (object->type & kDartCObjectMarkMask) != 0; 897 return (object->type & kDartCObjectMarkMask) != 0;
937 } 898 }
938 899
939
940 intptr_t ApiMessageWriter::GetMarkedCObjectMark(Dart_CObject* object) { 900 intptr_t ApiMessageWriter::GetMarkedCObjectMark(Dart_CObject* object) {
941 ASSERT(IsCObjectMarked(object)); 901 ASSERT(IsCObjectMarked(object));
942 intptr_t mark_value = 902 intptr_t mark_value =
943 ((object->type & kDartCObjectMarkMask) >> kDartCObjectTypeBits); 903 ((object->type & kDartCObjectMarkMask) >> kDartCObjectTypeBits);
944 // An offset was added to object id for making marking object id 0 possible. 904 // An offset was added to object id for making marking object id 0 possible.
945 return mark_value - kDartCObjectMarkOffset; 905 return mark_value - kDartCObjectMarkOffset;
946 } 906 }
947 907
948
949 void ApiMessageWriter::UnmarkAllCObjects(Dart_CObject* object) { 908 void ApiMessageWriter::UnmarkAllCObjects(Dart_CObject* object) {
950 if (!IsCObjectMarked(object)) return; 909 if (!IsCObjectMarked(object)) return;
951 UnmarkCObject(object); 910 UnmarkCObject(object);
952 if (object->type == Dart_CObject_kArray) { 911 if (object->type == Dart_CObject_kArray) {
953 for (int i = 0; i < object->value.as_array.length; i++) { 912 for (int i = 0; i < object->value.as_array.length; i++) {
954 Dart_CObject* element = object->value.as_array.values[i]; 913 Dart_CObject* element = object->value.as_array.values[i];
955 UnmarkAllCObjects(element); 914 UnmarkAllCObjects(element);
956 } 915 }
957 } 916 }
958 } 917 }
959 918
960
961 void ApiMessageWriter::AddToForwardList(Dart_CObject* object) { 919 void ApiMessageWriter::AddToForwardList(Dart_CObject* object) {
962 if (forward_id_ >= forward_list_length_) { 920 if (forward_id_ >= forward_list_length_) {
963 void* new_list = NULL; 921 void* new_list = NULL;
964 if (forward_list_length_ == 0) { 922 if (forward_list_length_ == 0) {
965 forward_list_length_ = 4; 923 forward_list_length_ = 4;
966 intptr_t new_size = forward_list_length_ * sizeof(object); 924 intptr_t new_size = forward_list_length_ * sizeof(object);
967 new_list = ::malloc(new_size); 925 new_list = ::malloc(new_size);
968 } else { 926 } else {
969 forward_list_length_ *= 2; 927 forward_list_length_ *= 2;
970 intptr_t new_size = (forward_list_length_ * sizeof(object)); 928 intptr_t new_size = (forward_list_length_ * sizeof(object));
971 new_list = ::realloc(forward_list_, new_size); 929 new_list = ::realloc(forward_list_, new_size);
972 } 930 }
973 ASSERT(new_list != NULL); 931 ASSERT(new_list != NULL);
974 forward_list_ = reinterpret_cast<Dart_CObject**>(new_list); 932 forward_list_ = reinterpret_cast<Dart_CObject**>(new_list);
975 } 933 }
976 forward_list_[forward_id_] = object; 934 forward_list_[forward_id_] = object;
977 forward_id_ += 1; 935 forward_id_ += 1;
978 } 936 }
979 937
980
981 void ApiMessageWriter::WriteSmi(int64_t value) { 938 void ApiMessageWriter::WriteSmi(int64_t value) {
982 ASSERT(Smi::IsValid(value)); 939 ASSERT(Smi::IsValid(value));
983 Write<RawObject*>(Smi::New(static_cast<intptr_t>(value))); 940 Write<RawObject*>(Smi::New(static_cast<intptr_t>(value)));
984 } 941 }
985 942
986
987 void ApiMessageWriter::WriteNullObject() { 943 void ApiMessageWriter::WriteNullObject() {
988 WriteVMIsolateObject(kNullObject); 944 WriteVMIsolateObject(kNullObject);
989 } 945 }
990 946
991
992 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) { 947 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) {
993 ASSERT(!Smi::IsValid(value)); 948 ASSERT(!Smi::IsValid(value));
994 // Write out the serialization header value for mint object. 949 // Write out the serialization header value for mint object.
995 WriteInlinedHeader(object); 950 WriteInlinedHeader(object);
996 // Write out the class and tags information. 951 // Write out the class and tags information.
997 WriteIndexedObject(kMintCid); 952 WriteIndexedObject(kMintCid);
998 WriteTags(0); 953 WriteTags(0);
999 // Write the 64-bit value. 954 // Write the 64-bit value.
1000 Write<int64_t>(value); 955 Write<int64_t>(value);
1001 } 956 }
1002 957
1003
1004 void ApiMessageWriter::WriteInt32(Dart_CObject* object) { 958 void ApiMessageWriter::WriteInt32(Dart_CObject* object) {
1005 int64_t value = object->value.as_int32; 959 int64_t value = object->value.as_int32;
1006 if (Smi::IsValid(value)) { 960 if (Smi::IsValid(value)) {
1007 WriteSmi(value); 961 WriteSmi(value);
1008 } else { 962 } else {
1009 WriteMint(object, value); 963 WriteMint(object, value);
1010 } 964 }
1011 } 965 }
1012 966
1013
1014 void ApiMessageWriter::WriteInt64(Dart_CObject* object) { 967 void ApiMessageWriter::WriteInt64(Dart_CObject* object) {
1015 int64_t value = object->value.as_int64; 968 int64_t value = object->value.as_int64;
1016 if (Smi::IsValid(value)) { 969 if (Smi::IsValid(value)) {
1017 WriteSmi(value); 970 WriteSmi(value);
1018 } else { 971 } else {
1019 WriteMint(object, value); 972 WriteMint(object, value);
1020 } 973 }
1021 } 974 }
1022 975
1023
1024 void ApiMessageWriter::WriteInlinedHeader(Dart_CObject* object) { 976 void ApiMessageWriter::WriteInlinedHeader(Dart_CObject* object) {
1025 // Write out the serialization header value for this object. 977 // Write out the serialization header value for this object.
1026 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id_); 978 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id_);
1027 // Mark object with its object id. 979 // Mark object with its object id.
1028 MarkCObject(object, object_id_); 980 MarkCObject(object, object_id_);
1029 // Advance object id. 981 // Advance object id.
1030 object_id_++; 982 object_id_++;
1031 } 983 }
1032 984
1033
1034 bool ApiMessageWriter::WriteCObject(Dart_CObject* object) { 985 bool ApiMessageWriter::WriteCObject(Dart_CObject* object) {
1035 if (IsCObjectMarked(object)) { 986 if (IsCObjectMarked(object)) {
1036 intptr_t object_id = GetMarkedCObjectMark(object); 987 intptr_t object_id = GetMarkedCObjectMark(object);
1037 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); 988 WriteIndexedObject(kMaxPredefinedObjectIds + object_id);
1038 return true; 989 return true;
1039 } 990 }
1040 991
1041 Dart_CObject_Type type = object->type; 992 Dart_CObject_Type type = object->type;
1042 if (type == Dart_CObject_kArray) { 993 if (type == Dart_CObject_kArray) {
1043 const intptr_t array_length = object->value.as_array.length; 994 const intptr_t array_length = object->value.as_array.length;
(...skipping 13 matching lines...) Expand all
1057 // Write out array elements. 1008 // Write out array elements.
1058 for (int i = 0; i < array_length; i++) { 1009 for (int i = 0; i < array_length; i++) {
1059 bool success = WriteCObjectRef(object->value.as_array.values[i]); 1010 bool success = WriteCObjectRef(object->value.as_array.values[i]);
1060 if (!success) return false; 1011 if (!success) return false;
1061 } 1012 }
1062 return true; 1013 return true;
1063 } 1014 }
1064 return WriteCObjectInlined(object, type); 1015 return WriteCObjectInlined(object, type);
1065 } 1016 }
1066 1017
1067
1068 bool ApiMessageWriter::WriteCObjectRef(Dart_CObject* object) { 1018 bool ApiMessageWriter::WriteCObjectRef(Dart_CObject* object) {
1069 if (IsCObjectMarked(object)) { 1019 if (IsCObjectMarked(object)) {
1070 intptr_t object_id = GetMarkedCObjectMark(object); 1020 intptr_t object_id = GetMarkedCObjectMark(object);
1071 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); 1021 WriteIndexedObject(kMaxPredefinedObjectIds + object_id);
1072 return true; 1022 return true;
1073 } 1023 }
1074 1024
1075 Dart_CObject_Type type = object->type; 1025 Dart_CObject_Type type = object->type;
1076 if (type == Dart_CObject_kArray) { 1026 if (type == Dart_CObject_kArray) {
1077 const intptr_t array_length = object->value.as_array.length; 1027 const intptr_t array_length = object->value.as_array.length;
1078 if (array_length < 0 || array_length > Array::kMaxElements) { 1028 if (array_length < 0 || array_length > Array::kMaxElements) {
1079 return false; 1029 return false;
1080 } 1030 }
1081 // Write out the serialization header value for this object. 1031 // Write out the serialization header value for this object.
1082 WriteInlinedHeader(object); 1032 WriteInlinedHeader(object);
1083 // Write out the class information. 1033 // Write out the class information.
1084 WriteIndexedObject(kArrayCid); 1034 WriteIndexedObject(kArrayCid);
1085 WriteTags(0); 1035 WriteTags(0);
1086 // Write out the length information. 1036 // Write out the length information.
1087 WriteSmi(array_length); 1037 WriteSmi(array_length);
1088 // Add object to forward list so that this object is serialized later. 1038 // Add object to forward list so that this object is serialized later.
1089 AddToForwardList(object); 1039 AddToForwardList(object);
1090 return true; 1040 return true;
1091 } 1041 }
1092 return WriteCObjectInlined(object, type); 1042 return WriteCObjectInlined(object, type);
1093 } 1043 }
1094 1044
1095
1096 bool ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) { 1045 bool ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) {
1097 ASSERT(IsCObjectMarked(object)); 1046 ASSERT(IsCObjectMarked(object));
1098 Dart_CObject_Type type = 1047 Dart_CObject_Type type =
1099 static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask); 1048 static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask);
1100 ASSERT(type == Dart_CObject_kArray); 1049 ASSERT(type == Dart_CObject_kArray);
1101 const intptr_t array_length = object->value.as_array.length; 1050 const intptr_t array_length = object->value.as_array.length;
1102 if (array_length < 0 || array_length > Array::kMaxElements) { 1051 if (array_length < 0 || array_length > Array::kMaxElements) {
1103 return false; 1052 return false;
1104 } 1053 }
1105 1054
1106 // Write out the serialization header value for this object. 1055 // Write out the serialization header value for this object.
1107 intptr_t object_id = GetMarkedCObjectMark(object); 1056 intptr_t object_id = GetMarkedCObjectMark(object);
1108 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id); 1057 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id);
1109 // Write out the class and tags information. 1058 // Write out the class and tags information.
1110 WriteIndexedObject(kArrayCid); 1059 WriteIndexedObject(kArrayCid);
1111 WriteTags(0); 1060 WriteTags(0);
1112 // Write out the length information. 1061 // Write out the length information.
1113 WriteSmi(array_length); 1062 WriteSmi(array_length);
1114 // Write out the type arguments. 1063 // Write out the type arguments.
1115 WriteNullObject(); 1064 WriteNullObject();
1116 // Write out array elements. 1065 // Write out array elements.
1117 for (int i = 0; i < array_length; i++) { 1066 for (int i = 0; i < array_length; i++) {
1118 bool success = WriteCObjectRef(object->value.as_array.values[i]); 1067 bool success = WriteCObjectRef(object->value.as_array.values[i]);
1119 if (!success) return false; 1068 if (!success) return false;
1120 } 1069 }
1121 return true; 1070 return true;
1122 } 1071 }
1123 1072
1124
1125 bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object, 1073 bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object,
1126 Dart_CObject_Type type) { 1074 Dart_CObject_Type type) {
1127 switch (type) { 1075 switch (type) {
1128 case Dart_CObject_kNull: 1076 case Dart_CObject_kNull:
1129 WriteNullObject(); 1077 WriteNullObject();
1130 break; 1078 break;
1131 case Dart_CObject_kBool: 1079 case Dart_CObject_kBool:
1132 if (object->value.as_bool) { 1080 if (object->value.as_bool) {
1133 WriteVMIsolateObject(kTrueValue); 1081 WriteVMIsolateObject(kTrueValue);
1134 } else { 1082 } else {
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1262 // order to post external arrays through ports. We need to make 1210 // order to post external arrays through ports. We need to make
1263 // sure that messages containing pointers can never be posted 1211 // sure that messages containing pointers can never be posted
1264 // to other processes. 1212 // to other processes.
1265 1213
1266 // Write out serialization header value for this object. 1214 // Write out serialization header value for this object.
1267 WriteInlinedHeader(object); 1215 WriteInlinedHeader(object);
1268 // Write out the class and tag information. 1216 // Write out the class and tag information.
1269 WriteIndexedObject(kExternalTypedDataUint8ArrayCid); 1217 WriteIndexedObject(kExternalTypedDataUint8ArrayCid);
1270 WriteTags(0); 1218 WriteTags(0);
1271 intptr_t length = object->value.as_external_typed_data.length; 1219 intptr_t length = object->value.as_external_typed_data.length;
1272 if (length < 0 || 1220 if (length < 0 || length > ExternalTypedData::MaxElements(
1273 length > 1221 kExternalTypedDataUint8ArrayCid)) {
1274 ExternalTypedData::MaxElements(kExternalTypedDataUint8ArrayCid)) {
1275 return false; 1222 return false;
1276 } 1223 }
1277 uint8_t* data = object->value.as_external_typed_data.data; 1224 uint8_t* data = object->value.as_external_typed_data.data;
1278 void* peer = object->value.as_external_typed_data.peer; 1225 void* peer = object->value.as_external_typed_data.peer;
1279 Dart_WeakPersistentHandleFinalizer callback = 1226 Dart_WeakPersistentHandleFinalizer callback =
1280 object->value.as_external_typed_data.callback; 1227 object->value.as_external_typed_data.callback;
1281 WriteSmi(length); 1228 WriteSmi(length);
1282 WriteRawPointerValue(reinterpret_cast<intptr_t>(data)); 1229 WriteRawPointerValue(reinterpret_cast<intptr_t>(data));
1283 WriteRawPointerValue(reinterpret_cast<intptr_t>(peer)); 1230 WriteRawPointerValue(reinterpret_cast<intptr_t>(peer));
1284 WriteRawPointerValue(reinterpret_cast<intptr_t>(callback)); 1231 WriteRawPointerValue(reinterpret_cast<intptr_t>(callback));
(...skipping 14 matching lines...) Expand all
1299 Write<uint64_t>(object->value.as_capability.id); 1246 Write<uint64_t>(object->value.as_capability.id);
1300 break; 1247 break;
1301 } 1248 }
1302 default: 1249 default:
1303 FATAL1("Unexpected Dart_CObject_Type %d\n", type); 1250 FATAL1("Unexpected Dart_CObject_Type %d\n", type);
1304 } 1251 }
1305 1252
1306 return true; 1253 return true;
1307 } 1254 }
1308 1255
1309
1310 bool ApiMessageWriter::WriteCMessage(Dart_CObject* object) { 1256 bool ApiMessageWriter::WriteCMessage(Dart_CObject* object) {
1311 bool success = WriteCObject(object); 1257 bool success = WriteCObject(object);
1312 if (!success) { 1258 if (!success) {
1313 UnmarkAllCObjects(object); 1259 UnmarkAllCObjects(object);
1314 return false; 1260 return false;
1315 } 1261 }
1316 // Write out all objects that were added to the forward list and have 1262 // Write out all objects that were added to the forward list and have
1317 // not been serialized yet. These would typically be fields of arrays. 1263 // not been serialized yet. These would typically be fields of arrays.
1318 // NOTE: The forward list might grow as we process the list. 1264 // NOTE: The forward list might grow as we process the list.
1319 for (intptr_t i = 0; i < forward_id_; i++) { 1265 for (intptr_t i = 0; i < forward_id_; i++) {
1320 success = WriteForwardedCObject(forward_list_[i]); 1266 success = WriteForwardedCObject(forward_list_[i]);
1321 if (!success) { 1267 if (!success) {
1322 UnmarkAllCObjects(object); 1268 UnmarkAllCObjects(object);
1323 return false; 1269 return false;
1324 } 1270 }
1325 } 1271 }
1326 UnmarkAllCObjects(object); 1272 UnmarkAllCObjects(object);
1327 return true; 1273 return true;
1328 } 1274 }
1329 1275
1330 } // namespace dart 1276 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_message.h ('k') | runtime/vm/dart_api_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698