OLD | NEW |
---|---|
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 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
157 value->value.as_array.length = length; | 157 value->value.as_array.length = length; |
158 if (length > 0) { | 158 if (length > 0) { |
159 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1); | 159 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1); |
160 } else { | 160 } else { |
161 value->value.as_array.values = NULL; | 161 value->value.as_array.values = NULL; |
162 } | 162 } |
163 return value; | 163 return value; |
164 } | 164 } |
165 | 165 |
166 | 166 |
167 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal( | |
168 Dart_CObject_Internal::Type type) { | |
169 Dart_CObject_Internal* value = | |
170 reinterpret_cast<Dart_CObject_Internal*>( | |
171 alloc_(NULL, 0, sizeof(Dart_CObject_Internal))); | |
172 ASSERT(value != NULL); | |
173 value->type = static_cast<Dart_CObject::Type>(type); | |
174 return value; | |
175 } | |
176 | |
177 | |
178 Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectClass() { | |
179 return AllocateDartCObjectInternal(Dart_CObject_Internal::kClass); | |
180 } | |
181 | |
182 | |
167 ApiMessageReader::BackRefNode* ApiMessageReader::AllocateBackRefNode( | 183 ApiMessageReader::BackRefNode* ApiMessageReader::AllocateBackRefNode( |
168 Dart_CObject* reference, | 184 Dart_CObject* reference, |
169 DeserializeState state) { | 185 DeserializeState state) { |
170 BackRefNode* value = | 186 BackRefNode* value = |
171 reinterpret_cast<BackRefNode*>(alloc_(NULL, 0, sizeof(BackRefNode))); | 187 reinterpret_cast<BackRefNode*>(alloc_(NULL, 0, sizeof(BackRefNode))); |
172 value->set_reference(reference); | 188 value->set_reference(reference); |
173 value->set_state(state); | 189 value->set_state(state); |
174 return value; | 190 return value; |
175 } | 191 } |
176 | 192 |
177 | 193 |
178 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { | 194 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { |
179 // Read the class header information and lookup the class. | 195 // Read the class header information and lookup the class. |
180 intptr_t class_header = ReadIntptrValue(); | 196 intptr_t class_header = ReadIntptrValue(); |
181 intptr_t tags = ReadIntptrValue(); | 197 intptr_t tags = ReadIntptrValue(); |
182 USE(tags); | 198 USE(tags); |
183 intptr_t class_id; | 199 intptr_t class_id; |
184 | 200 |
185 // Reading of regular dart instances is not supported. | 201 // There is limited support for reading regular dart instances. Only |
202 // typed data views are currently handled. | |
186 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { | 203 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { |
187 return AllocateDartCObjectUnsupported(); | 204 Dart_CObject_Internal* object = |
205 reinterpret_cast<Dart_CObject_Internal*>(GetBackRef(object_id)); | |
206 if (object == NULL) { | |
207 object = | |
208 AllocateDartCObjectInternal(Dart_CObject_Internal::kUninitialized); | |
209 AddBackRef(object_id, object, kIsDeserialized); | |
210 // Read class of object. | |
211 object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl()); | |
212 ASSERT(object->cls->type == | |
213 static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass)); | |
214 } | |
215 ASSERT(object->type == | |
216 static_cast<Dart_CObject::Type>( | |
217 Dart_CObject_Internal::kUninitialized)); | |
218 | |
219 // Handle typed data views. | |
220 char* library_url = | |
221 object->cls->internal.as_class.library_url->value.as_string; | |
222 char* class_name = | |
223 object->cls->internal.as_class.class_name->value.as_string; | |
224 if (strcmp("dart:typeddata", library_url) == 0 && | |
225 strncmp("_Uint8ArrayView", class_name, 15) == 0) { | |
siva
2013/04/15 20:17:47
This seems rather inefficient having to do a strcm
Søren Gjesse
2013/04/17 12:54:58
That would be a great idea. I added this way of pr
siva
2013/04/18 02:30:40
Yes these predefined Cid's are already assigned to
| |
226 object->type = | |
227 static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kView); | |
228 // Skip type arguments. | |
229 ReadObjectImpl(); | |
230 object->internal.as_view.buffer = ReadObjectImpl(); | |
231 object->internal.as_view.offset_in_bytes = ReadSmiValue(); | |
232 object->internal.as_view.length = ReadSmiValue(); | |
233 | |
234 // The buffer is fully read now as typed data objects are | |
235 // serialized in-line. | |
236 Dart_CObject* buffer = object->internal.as_view.buffer; | |
237 ASSERT(buffer->type == Dart_CObject::kUint8Array); | |
238 | |
239 // Now turn the view into a byte array. | |
siva
2013/04/15 20:26:30
Another issue that might need addressing :
if we
Søren Gjesse
2013/04/17 12:54:58
Why is that? The view will just point to the under
siva
2013/04/18 02:30:40
True it would point to the underlying deserialized
| |
240 object->type = Dart_CObject::kUint8Array; | |
241 object->value.as_byte_array.length = object->internal.as_view.length; | |
242 object->value.as_byte_array.values = | |
243 buffer->value.as_byte_array.values + | |
244 object->internal.as_view.offset_in_bytes; | |
245 } else { | |
246 // TODO(sgjesse): Handle other instances. Currently this will | |
247 // skew the reading as the fields of the instance is not read. | |
248 } | |
249 return object; | |
188 } | 250 } |
189 | 251 |
190 ASSERT((class_header & kSmiTagMask) != 0); | 252 ASSERT((class_header & kSmiTagMask) != 0); |
191 class_id = LookupInternalClass(class_header); | 253 class_id = LookupInternalClass(class_header); |
192 if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) { | 254 if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) { |
193 intptr_t len = ReadSmiValue(); | 255 intptr_t len = ReadSmiValue(); |
194 Dart_CObject* value = GetBackRef(object_id); | 256 Dart_CObject* value = GetBackRef(object_id); |
195 if (value == NULL) { | 257 if (value == NULL) { |
196 value = AllocateDartCObjectArray(len); | 258 value = AllocateDartCObjectArray(len); |
197 AddBackRef(object_id, value, kIsDeserialized); | 259 AddBackRef(object_id, value, kIsDeserialized); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
258 if (IsVMIsolateObject(value)) { | 320 if (IsVMIsolateObject(value)) { |
259 return ReadVMIsolateObject(value); | 321 return ReadVMIsolateObject(value); |
260 } | 322 } |
261 if (SerializedHeaderTag::decode(value) == kObjectId) { | 323 if (SerializedHeaderTag::decode(value) == kObjectId) { |
262 return ReadIndexedObject(SerializedHeaderData::decode(value)); | 324 return ReadIndexedObject(SerializedHeaderData::decode(value)); |
263 } | 325 } |
264 ASSERT(SerializedHeaderTag::decode(value) == kInlined); | 326 ASSERT(SerializedHeaderTag::decode(value) == kInlined); |
265 // Read the class header information and lookup the class. | 327 // Read the class header information and lookup the class. |
266 intptr_t class_header = ReadIntptrValue(); | 328 intptr_t class_header = ReadIntptrValue(); |
267 | 329 |
268 // Reading of regular dart instances is not supported. | 330 // Reading of regular dart instances has limited support in order to |
331 // read typed data views. | |
269 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { | 332 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { |
270 intptr_t object_id = SerializedHeaderData::decode(value); | 333 intptr_t object_id = SerializedHeaderData::decode(value); |
271 Dart_CObject* object = AllocateDartCObjectUnsupported(); | 334 Dart_CObject_Internal* object = |
335 AllocateDartCObjectInternal(Dart_CObject_Internal::kUninitialized); | |
272 AddBackRef(object_id, object, kIsNotDeserialized); | 336 AddBackRef(object_id, object, kIsNotDeserialized); |
337 // Read class of object. | |
338 object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl()); | |
339 ASSERT(object->cls->type == | |
340 static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass)); | |
273 return object; | 341 return object; |
274 } | 342 } |
275 ASSERT((class_header & kSmiTagMask) != 0); | 343 ASSERT((class_header & kSmiTagMask) != 0); |
276 intptr_t object_id = SerializedHeaderData::decode(value); | 344 intptr_t object_id = SerializedHeaderData::decode(value); |
277 intptr_t class_id = LookupInternalClass(class_header); | 345 intptr_t class_id = LookupInternalClass(class_header); |
278 if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) { | 346 if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) { |
279 ASSERT(GetBackRef(object_id) == NULL); | 347 ASSERT(GetBackRef(object_id) == NULL); |
280 intptr_t len = ReadSmiValue(); | 348 intptr_t len = ReadSmiValue(); |
281 Dart_CObject* value = AllocateDartCObjectArray(len); | 349 Dart_CObject* value = AllocateDartCObjectArray(len); |
282 AddBackRef(object_id, value, kIsNotDeserialized); | 350 AddBackRef(object_id, value, kIsNotDeserialized); |
(...skipping 23 matching lines...) Expand all Loading... | |
306 } | 374 } |
307 // No other VM isolate objects are supported. | 375 // No other VM isolate objects are supported. |
308 return AllocateDartCObjectNull(); | 376 return AllocateDartCObjectNull(); |
309 } | 377 } |
310 | 378 |
311 | 379 |
312 Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id, | 380 Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id, |
313 intptr_t object_id) { | 381 intptr_t object_id) { |
314 switch (class_id) { | 382 switch (class_id) { |
315 case kClassCid: { | 383 case kClassCid: { |
316 Dart_CObject* object = AllocateDartCObjectUnsupported(); | 384 Dart_CObject_Internal* object = AllocateDartCObjectClass(); |
317 AddBackRef(object_id, object, kIsDeserialized); | 385 AddBackRef(object_id, object, kIsDeserialized); |
386 object->internal.as_class.library_url = ReadObjectImpl(); | |
387 ASSERT(object->internal.as_class.library_url->type == | |
388 Dart_CObject::kString); | |
389 object->internal.as_class.class_name = ReadObjectImpl(); | |
390 ASSERT(object->internal.as_class.class_name->type == | |
391 Dart_CObject::kString); | |
318 return object; | 392 return object; |
319 } | 393 } |
320 case kTypeArgumentsCid: { | 394 case kTypeArgumentsCid: { |
321 // TODO(sjesse): Remove this when message serialization format is | 395 // TODO(sjesse): Remove this when message serialization format is |
322 // updated (currently length is leaked). | 396 // updated (currently length is leaked). |
323 Dart_CObject* value = &type_arguments_marker; | 397 Dart_CObject* value = &type_arguments_marker; |
324 AddBackRef(object_id, value, kIsDeserialized); | 398 AddBackRef(object_id, value, kIsDeserialized); |
325 Dart_CObject* length = ReadObjectImpl(); | 399 Dart_CObject* length = ReadObjectImpl(); |
326 ASSERT(length->type == Dart_CObject::kInt32); | 400 ASSERT(length->type == Dart_CObject::kInt32); |
327 for (int i = 0; i < length->value.as_int32; i++) { | 401 for (int i = 0; i < length->value.as_int32; i++) { |
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
910 if (!success) { | 984 if (!success) { |
911 UnmarkAllCObjects(object); | 985 UnmarkAllCObjects(object); |
912 return false; | 986 return false; |
913 } | 987 } |
914 } | 988 } |
915 UnmarkAllCObjects(object); | 989 UnmarkAllCObjects(object); |
916 return true; | 990 return true; |
917 } | 991 } |
918 | 992 |
919 } // namespace dart | 993 } // namespace dart |
OLD | NEW |