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

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

Issue 14065006: Add support for typed data views on native threads (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review commetns Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/dart_api_message.h ('k') | runtime/vm/snapshot_test.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 (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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_message.h ('k') | runtime/vm/snapshot_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698