| 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/object_store.h" | 7 #include "vm/object_store.h" |
| 8 | 8 |
| 9 namespace dart { | 9 namespace dart { |
| 10 | 10 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 value->value.as_array.length = length; | 159 value->value.as_array.length = length; |
| 160 if (length > 0) { | 160 if (length > 0) { |
| 161 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1); | 161 value->value.as_array.values = reinterpret_cast<Dart_CObject**>(value + 1); |
| 162 } else { | 162 } else { |
| 163 value->value.as_array.values = NULL; | 163 value->value.as_array.values = NULL; |
| 164 } | 164 } |
| 165 return value; | 165 return value; |
| 166 } | 166 } |
| 167 | 167 |
| 168 | 168 |
| 169 ApiMessageReader::BackRefNode* ApiMessageReader::AllocateBackRefNode( |
| 170 Dart_CObject* reference, |
| 171 DeserializeState state) { |
| 172 BackRefNode* value = |
| 173 reinterpret_cast<BackRefNode*>(alloc_(NULL, 0, sizeof(BackRefNode))); |
| 174 value->set_reference(reference); |
| 175 value->set_state(state); |
| 176 return value; |
| 177 } |
| 178 |
| 179 |
| 169 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { | 180 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { |
| 170 // Read the class header information and lookup the class. | 181 // Read the class header information and lookup the class. |
| 171 intptr_t class_header = ReadIntptrValue(); | 182 intptr_t class_header = ReadIntptrValue(); |
| 172 intptr_t tags = ReadIntptrValue(); | 183 intptr_t tags = ReadIntptrValue(); |
| 173 USE(tags); | 184 USE(tags); |
| 174 intptr_t class_id; | 185 intptr_t class_id; |
| 175 | 186 |
| 176 // Reading of regular dart instances is not supported. | 187 // Reading of regular dart instances is not supported. |
| 177 if (SerializedHeaderData::decode(class_header) == kInstanceId) { | 188 if (SerializedHeaderData::decode(class_header) == kInstanceId) { |
| 178 return AllocateDartCObjectUnsupported(); | 189 return AllocateDartCObjectUnsupported(); |
| 179 } | 190 } |
| 180 | 191 |
| 181 ASSERT((class_header & kSmiTagMask) != 0); | 192 ASSERT((class_header & kSmiTagMask) != 0); |
| 182 class_id = LookupInternalClass(class_header); | 193 class_id = LookupInternalClass(class_header); |
| 194 if (class_id == ObjectStore::kArrayClass || |
| 195 class_id == ObjectStore::kImmutableArrayClass) { |
| 196 intptr_t len = ReadSmiValue(); |
| 197 Dart_CObject* value = GetBackRef(object_id); |
| 198 if (value == NULL) { |
| 199 value = AllocateDartCObjectArray(len); |
| 200 AddBackRef(object_id, value, kIsDeserialized); |
| 201 } |
| 202 // Skip type arguments. |
| 203 // TODO(sjesse): Remove this when message serialization format is |
| 204 // updated (currently type_arguments is leaked). |
| 205 Dart_CObject* type_arguments = ReadObjectImpl(); |
| 206 if (type_arguments != &type_arguments_marker && |
| 207 type_arguments->type != Dart_CObject::kNull) { |
| 208 return AllocateDartCObjectUnsupported(); |
| 209 } |
| 210 for (int i = 0; i < len; i++) { |
| 211 value->value.as_array.values[i] = ReadObjectRef(); |
| 212 } |
| 213 return value; |
| 214 } |
| 215 |
| 216 return ReadInternalVMObject(class_id, object_id); |
| 217 } |
| 218 |
| 219 |
| 220 Dart_CObject* ApiMessageReader::ReadObjectRef() { |
| 221 int64_t value = Read<int64_t>(); |
| 222 if ((value & kSmiTagMask) == 0) { |
| 223 int64_t untagged_value = value >> kSmiTagShift; |
| 224 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { |
| 225 return AllocateDartCObjectInt32(untagged_value); |
| 226 } else { |
| 227 return AllocateDartCObjectInt64(untagged_value); |
| 228 } |
| 229 } |
| 230 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); |
| 231 SerializedHeaderType header_type = SerializedHeaderTag::decode(value); |
| 232 intptr_t header_value = SerializedHeaderData::decode(value); |
| 233 |
| 234 if (header_type == kObjectId) { |
| 235 return ReadIndexedObject(header_value); |
| 236 } |
| 237 ASSERT(header_type == kInlined); |
| 238 // Read the class header information and lookup the class. |
| 239 intptr_t class_header = ReadIntptrValue(); |
| 240 |
| 241 // Reading of regular dart instances is not supported. |
| 242 if (SerializedHeaderData::decode(class_header) == kInstanceId) { |
| 243 return AllocateDartCObjectUnsupported(); |
| 244 } |
| 245 ASSERT((class_header & kSmiTagMask) != 0); |
| 246 intptr_t object_id = header_value; |
| 247 intptr_t class_id = LookupInternalClass(class_header); |
| 248 if (class_id == ObjectStore::kArrayClass || |
| 249 class_id == ObjectStore::kImmutableArrayClass) { |
| 250 ASSERT(GetBackRef(object_id) == NULL); |
| 251 intptr_t len = ReadSmiValue(); |
| 252 Dart_CObject* value = AllocateDartCObjectArray(len); |
| 253 AddBackRef(object_id, value, kIsNotDeserialized); |
| 254 return value; |
| 255 } |
| 256 intptr_t tags = ReadIntptrValue(); |
| 257 USE(tags); |
| 258 |
| 259 return ReadInternalVMObject(class_id, object_id); |
| 260 } |
| 261 |
| 262 |
| 263 Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id, |
| 264 intptr_t object_id) { |
| 183 switch (class_id) { | 265 switch (class_id) { |
| 184 case Object::kClassClass: { | 266 case Object::kClassClass: { |
| 185 return AllocateDartCObjectUnsupported(); | 267 return AllocateDartCObjectUnsupported(); |
| 186 } | 268 } |
| 187 case Object::kTypeArgumentsClass: { | 269 case Object::kTypeArgumentsClass: { |
| 188 // TODO(sjesse): Remove this when message serialization format is | 270 // TODO(sjesse): Remove this when message serialization format is |
| 189 // updated (currently length is leaked). | 271 // updated (currently length is leaked). |
| 190 Dart_CObject* value = &type_arguments_marker; | 272 Dart_CObject* value = &type_arguments_marker; |
| 191 AddBackwardReference(object_id, value); | 273 AddBackRef(object_id, value, kIsDeserialized); |
| 192 Dart_CObject* length = ReadObject(); | 274 Dart_CObject* length = ReadObjectImpl(); |
| 193 ASSERT(length->type == Dart_CObject::kInt32); | 275 ASSERT(length->type == Dart_CObject::kInt32); |
| 194 for (int i = 0; i < length->value.as_int32; i++) { | 276 for (int i = 0; i < length->value.as_int32; i++) { |
| 195 Dart_CObject* type = ReadObject(); | 277 Dart_CObject* type = ReadObjectImpl(); |
| 196 if (type != &dynamic_type_marker) { | 278 if (type != &dynamic_type_marker) { |
| 197 return AllocateDartCObjectUnsupported(); | 279 return AllocateDartCObjectUnsupported(); |
| 198 } | 280 } |
| 199 } | 281 } |
| 200 return value; | 282 return value; |
| 201 } | 283 } |
| 202 case Object::kTypeParameterClass: { | 284 case Object::kTypeParameterClass: { |
| 203 // TODO(sgjesse): Fix this workaround ignoring the type parameter. | 285 // TODO(sgjesse): Fix this workaround ignoring the type parameter. |
| 204 Dart_CObject* value = &dynamic_type_marker; | 286 Dart_CObject* value = &dynamic_type_marker; |
| 205 AddBackwardReference(object_id, value); | 287 AddBackRef(object_id, value, kIsDeserialized); |
| 206 intptr_t index = ReadIntptrValue(); | 288 intptr_t index = ReadIntptrValue(); |
| 207 USE(index); | 289 USE(index); |
| 208 intptr_t token_index = ReadIntptrValue(); | 290 intptr_t token_index = ReadIntptrValue(); |
| 209 USE(token_index); | 291 USE(token_index); |
| 210 int8_t type_state = Read<int8_t>(); | 292 int8_t type_state = Read<int8_t>(); |
| 211 USE(type_state); | 293 USE(type_state); |
| 212 Dart_CObject* parameterized_class = ReadObject(); | 294 Dart_CObject* parameterized_class = ReadObjectImpl(); |
| 213 // The type parameter is finalized, therefore parameterized_class is null. | 295 // The type parameter is finalized, therefore parameterized_class is null. |
| 214 ASSERT(parameterized_class->type == Dart_CObject::kNull); | 296 ASSERT(parameterized_class->type == Dart_CObject::kNull); |
| 215 Dart_CObject* name = ReadObject(); | 297 Dart_CObject* name = ReadObjectImpl(); |
| 216 ASSERT(name->type == Dart_CObject::kString); | 298 ASSERT(name->type == Dart_CObject::kString); |
| 217 return value; | 299 return value; |
| 218 } | 300 } |
| 219 case ObjectStore::kArrayClass: { | |
| 220 intptr_t len = ReadSmiValue(); | |
| 221 Dart_CObject* value = AllocateDartCObjectArray(len); | |
| 222 AddBackwardReference(object_id, value); | |
| 223 // Skip type arguments. | |
| 224 // TODO(sjesse): Remove this when message serialization format is | |
| 225 // updated (currently type_arguments is leaked). | |
| 226 Dart_CObject* type_arguments = ReadObject(); | |
| 227 if (type_arguments != &type_arguments_marker && | |
| 228 type_arguments->type != Dart_CObject::kNull) { | |
| 229 return AllocateDartCObjectUnsupported(); | |
| 230 } | |
| 231 for (int i = 0; i < len; i++) { | |
| 232 value->value.as_array.values[i] = ReadObject(); | |
| 233 } | |
| 234 return value; | |
| 235 } | |
| 236 case ObjectStore::kMintClass: { | 301 case ObjectStore::kMintClass: { |
| 237 int64_t value = Read<int64_t>(); | 302 int64_t value = Read<int64_t>(); |
| 238 Dart_CObject* object; | 303 Dart_CObject* object; |
| 239 if (kMinInt32 <= value && value <= kMaxInt32) { | 304 if (kMinInt32 <= value && value <= kMaxInt32) { |
| 240 object = AllocateDartCObjectInt32(value); | 305 object = AllocateDartCObjectInt32(value); |
| 241 } else { | 306 } else { |
| 242 object = AllocateDartCObjectInt64(value); | 307 object = AllocateDartCObjectInt64(value); |
| 243 } | 308 } |
| 244 AddBackwardReference(object_id, object); | 309 AddBackRef(object_id, object, kIsDeserialized); |
| 245 return object; | 310 return object; |
| 246 } | 311 } |
| 247 case ObjectStore::kBigintClass: { | 312 case ObjectStore::kBigintClass: { |
| 248 // Read in the hex string representation of the bigint. | 313 // Read in the hex string representation of the bigint. |
| 249 intptr_t len = ReadIntptrValue(); | 314 intptr_t len = ReadIntptrValue(); |
| 250 Dart_CObject* object = AllocateDartCObjectBigint(len); | 315 Dart_CObject* object = AllocateDartCObjectBigint(len); |
| 251 AddBackwardReference(object_id, object); | 316 AddBackRef(object_id, object, kIsDeserialized); |
| 252 char* p = object->value.as_bigint; | 317 char* p = object->value.as_bigint; |
| 253 for (intptr_t i = 0; i < len; i++) { | 318 for (intptr_t i = 0; i < len; i++) { |
| 254 p[i] = Read<uint8_t>(); | 319 p[i] = Read<uint8_t>(); |
| 255 } | 320 } |
| 256 p[len] = '\0'; | 321 p[len] = '\0'; |
| 257 return object; | 322 return object; |
| 258 } | 323 } |
| 259 case ObjectStore::kDoubleClass: { | 324 case ObjectStore::kDoubleClass: { |
| 260 // Read the double value for the object. | 325 // Read the double value for the object. |
| 261 Dart_CObject* object = AllocateDartCObjectDouble(Read<double>()); | 326 Dart_CObject* object = AllocateDartCObjectDouble(Read<double>()); |
| 262 AddBackwardReference(object_id, object); | 327 AddBackRef(object_id, object, kIsDeserialized); |
| 263 return object; | 328 return object; |
| 264 } | 329 } |
| 265 case ObjectStore::kOneByteStringClass: { | 330 case ObjectStore::kOneByteStringClass: { |
| 266 intptr_t len = ReadSmiValue(); | 331 intptr_t len = ReadSmiValue(); |
| 267 intptr_t hash = ReadSmiValue(); | 332 intptr_t hash = ReadSmiValue(); |
| 268 USE(hash); | 333 USE(hash); |
| 269 Dart_CObject* object = AllocateDartCObjectString(len); | 334 Dart_CObject* object = AllocateDartCObjectString(len); |
| 270 AddBackwardReference(object_id, object); | 335 AddBackRef(object_id, object, kIsDeserialized); |
| 271 char* p = object->value.as_string; | 336 char* p = object->value.as_string; |
| 272 for (intptr_t i = 0; i < len; i++) { | 337 for (intptr_t i = 0; i < len; i++) { |
| 273 p[i] = Read<uint8_t>(); | 338 p[i] = Read<uint8_t>(); |
| 274 } | 339 } |
| 275 p[len] = '\0'; | 340 p[len] = '\0'; |
| 276 return object; | 341 return object; |
| 277 } | 342 } |
| 278 case ObjectStore::kTwoByteStringClass: | 343 case ObjectStore::kTwoByteStringClass: |
| 279 // Two byte strings not supported. | 344 // Two byte strings not supported. |
| 280 return AllocateDartCObjectUnsupported(); | 345 return AllocateDartCObjectUnsupported(); |
| 281 case ObjectStore::kFourByteStringClass: | 346 case ObjectStore::kFourByteStringClass: |
| 282 // Four byte strings not supported. | 347 // Four byte strings not supported. |
| 283 return AllocateDartCObjectUnsupported(); | 348 return AllocateDartCObjectUnsupported(); |
| 284 case ObjectStore::kUint8ArrayClass: { | 349 case ObjectStore::kUint8ArrayClass: { |
| 285 intptr_t len = ReadSmiValue(); | 350 intptr_t len = ReadSmiValue(); |
| 286 Dart_CObject* object = AllocateDartCObjectUint8Array(len); | 351 Dart_CObject* object = AllocateDartCObjectUint8Array(len); |
| 287 AddBackwardReference(object_id, object); | 352 AddBackRef(object_id, object, kIsDeserialized); |
| 288 if (len > 0) { | 353 if (len > 0) { |
| 289 uint8_t* p = object->value.as_byte_array.values; | 354 uint8_t* p = object->value.as_byte_array.values; |
| 290 for (intptr_t i = 0; i < len; i++) { | 355 for (intptr_t i = 0; i < len; i++) { |
| 291 p[i] = Read<uint8_t>(); | 356 p[i] = Read<uint8_t>(); |
| 292 } | 357 } |
| 293 } | 358 } |
| 294 return object; | 359 return object; |
| 295 } | 360 } |
| 296 default: | 361 default: |
| 297 // Everything else not supported. | 362 // Everything else not supported. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 313 if (object_id == ObjectStore::kDynamicType || | 378 if (object_id == ObjectStore::kDynamicType || |
| 314 object_id == ObjectStore::kDoubleInterface || | 379 object_id == ObjectStore::kDoubleInterface || |
| 315 object_id == ObjectStore::kIntInterface || | 380 object_id == ObjectStore::kIntInterface || |
| 316 object_id == ObjectStore::kBoolInterface || | 381 object_id == ObjectStore::kBoolInterface || |
| 317 object_id == ObjectStore::kStringInterface) { | 382 object_id == ObjectStore::kStringInterface) { |
| 318 // Always return dynamic type (this is only a marker). | 383 // Always return dynamic type (this is only a marker). |
| 319 return &dynamic_type_marker; | 384 return &dynamic_type_marker; |
| 320 } | 385 } |
| 321 intptr_t index = object_id - kMaxPredefinedObjectIds; | 386 intptr_t index = object_id - kMaxPredefinedObjectIds; |
| 322 ASSERT((0 <= index) && (index < backward_references_.length())); | 387 ASSERT((0 <= index) && (index < backward_references_.length())); |
| 323 ASSERT(backward_references_[index] != NULL); | 388 ASSERT(backward_references_[index]->reference() != NULL); |
| 324 return backward_references_[index]; | 389 return backward_references_[index]->reference(); |
| 325 } | |
| 326 | |
| 327 | |
| 328 Dart_CObject* ApiMessageReader::ReadObjectImpl(intptr_t header) { | |
| 329 SerializedHeaderType header_type = SerializedHeaderTag::decode(header); | |
| 330 intptr_t header_value = SerializedHeaderData::decode(header); | |
| 331 | |
| 332 if (header_type == kObjectId) { | |
| 333 return ReadIndexedObject(header_value); | |
| 334 } | |
| 335 ASSERT(header_type == kInlined); | |
| 336 return ReadInlinedObject(header_value); | |
| 337 } | 390 } |
| 338 | 391 |
| 339 | 392 |
| 340 Dart_CObject* ApiMessageReader::ReadObject() { | 393 Dart_CObject* ApiMessageReader::ReadObject() { |
| 394 Dart_CObject* value = ReadObjectImpl(); |
| 395 for (intptr_t i = 0; i < backward_references_.length(); i++) { |
| 396 if (!backward_references_[i]->is_deserialized()) { |
| 397 ReadObjectImpl(); |
| 398 backward_references_[i]->set_state(kIsDeserialized); |
| 399 } |
| 400 } |
| 401 return value; |
| 402 } |
| 403 |
| 404 |
| 405 Dart_CObject* ApiMessageReader::ReadObjectImpl() { |
| 341 int64_t value = Read<int64_t>(); | 406 int64_t value = Read<int64_t>(); |
| 342 if ((value & kSmiTagMask) == 0) { | 407 if ((value & kSmiTagMask) == 0) { |
| 343 int64_t untagged_value = value >> kSmiTagShift; | 408 int64_t untagged_value = value >> kSmiTagShift; |
| 344 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { | 409 if (kMinInt32 <= untagged_value && untagged_value <= kMaxInt32) { |
| 345 return AllocateDartCObjectInt32(untagged_value); | 410 return AllocateDartCObjectInt32(untagged_value); |
| 346 } else { | 411 } else { |
| 347 return AllocateDartCObjectInt64(untagged_value); | 412 return AllocateDartCObjectInt64(untagged_value); |
| 348 } | 413 } |
| 349 } | 414 } |
| 350 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); | 415 ASSERT((value <= kIntptrMax) && (value >= kIntptrMin)); |
| 351 return ReadObjectImpl(value); | 416 SerializedHeaderType header_type = SerializedHeaderTag::decode(value); |
| 417 intptr_t header_value = SerializedHeaderData::decode(value); |
| 418 |
| 419 if (header_type == kObjectId) { |
| 420 return ReadIndexedObject(header_value); |
| 421 } |
| 422 ASSERT(header_type == kInlined); |
| 423 return ReadInlinedObject(header_value); |
| 352 } | 424 } |
| 353 | 425 |
| 354 | 426 |
| 355 void ApiMessageReader::AddBackwardReference(intptr_t id, Dart_CObject* obj) { | 427 void ApiMessageReader::AddBackRef(intptr_t id, |
| 356 ASSERT((id - kMaxPredefinedObjectIds) == backward_references_.length()); | 428 Dart_CObject* obj, |
| 357 backward_references_.Add(obj); | 429 DeserializeState state) { |
| 430 intptr_t index = (id - kMaxPredefinedObjectIds); |
| 431 ASSERT(index == backward_references_.length()); |
| 432 BackRefNode* node = AllocateBackRefNode(obj, state); |
| 433 ASSERT(node != NULL); |
| 434 backward_references_.Add(node); |
| 358 } | 435 } |
| 359 | 436 |
| 437 |
| 438 Dart_CObject* ApiMessageReader::GetBackRef(intptr_t id) { |
| 439 ASSERT(id >= kMaxPredefinedObjectIds); |
| 440 intptr_t index = (id - kMaxPredefinedObjectIds); |
| 441 if (index < backward_references_.length()) { |
| 442 return backward_references_[index]->reference(); |
| 443 } |
| 444 return NULL; |
| 445 } |
| 446 |
| 447 |
| 360 void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) { | 448 void ApiMessageWriter::WriteMessage(intptr_t field_count, intptr_t *data) { |
| 361 // Write out the serialization header value for this object. | 449 // Write out the serialization header value for this object. |
| 362 WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds); | 450 WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds); |
| 363 | 451 |
| 364 // Write out the class and tags information. | 452 // Write out the class and tags information. |
| 365 WriteObjectHeader(ObjectStore::kArrayClass, 0); | 453 WriteObjectHeader(ObjectStore::kArrayClass, 0); |
| 366 | 454 |
| 367 // Write out the length field. | 455 // Write out the length field. |
| 368 Write<RawObject*>(Smi::New(field_count)); | 456 Write<RawObject*>(Smi::New(field_count)); |
| 369 | 457 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 UnmarkCObject(object); | 504 UnmarkCObject(object); |
| 417 if (object->type == Dart_CObject::kArray) { | 505 if (object->type == Dart_CObject::kArray) { |
| 418 for (int i = 0; i < object->value.as_array.length; i++) { | 506 for (int i = 0; i < object->value.as_array.length; i++) { |
| 419 Dart_CObject* element = object->value.as_array.values[i]; | 507 Dart_CObject* element = object->value.as_array.values[i]; |
| 420 UnmarkAllCObjects(element); | 508 UnmarkAllCObjects(element); |
| 421 } | 509 } |
| 422 } | 510 } |
| 423 } | 511 } |
| 424 | 512 |
| 425 | 513 |
| 514 void ApiMessageWriter::AddToForwardList(Dart_CObject* object) { |
| 515 if (forward_id_ >= forward_list_length_) { |
| 516 intptr_t new_size = (forward_list_length_ * sizeof(object)) * 2; |
| 517 void* new_list = ::realloc(forward_list_, new_size); |
| 518 ASSERT(new_list != NULL); |
| 519 forward_list_ = reinterpret_cast<Dart_CObject**>(new_list); |
| 520 } |
| 521 forward_list_[forward_id_] = object; |
| 522 forward_id_ += 1; |
| 523 } |
| 524 |
| 525 |
| 426 void ApiMessageWriter::WriteSmi(int64_t value) { | 526 void ApiMessageWriter::WriteSmi(int64_t value) { |
| 427 ASSERT(Smi::IsValid64(value)); | 527 ASSERT(Smi::IsValid64(value)); |
| 428 Write<RawObject*>(Smi::New(value)); | 528 Write<RawObject*>(Smi::New(value)); |
| 429 } | 529 } |
| 430 | 530 |
| 431 | 531 |
| 432 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) { | 532 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) { |
| 433 ASSERT(!Smi::IsValid64(value)); | 533 ASSERT(!Smi::IsValid64(value)); |
| 434 // Write out the serialization header value for mint object. | 534 // Write out the serialization header value for mint object. |
| 435 WriteInlinedHeader(object); | 535 WriteInlinedHeader(object); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 } | 570 } |
| 471 | 571 |
| 472 | 572 |
| 473 void ApiMessageWriter::WriteCObject(Dart_CObject* object) { | 573 void ApiMessageWriter::WriteCObject(Dart_CObject* object) { |
| 474 if (IsCObjectMarked(object)) { | 574 if (IsCObjectMarked(object)) { |
| 475 intptr_t object_id = GetMarkedCObjectMark(object); | 575 intptr_t object_id = GetMarkedCObjectMark(object); |
| 476 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); | 576 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); |
| 477 return; | 577 return; |
| 478 } | 578 } |
| 479 | 579 |
| 480 switch (object->type) { | 580 Dart_CObject::Type type = object->type; |
| 581 if (type == Dart_CObject::kArray) { |
| 582 // Write out the serialization header value for this object. |
| 583 WriteInlinedHeader(object); |
| 584 // Write out the class and tags information. |
| 585 WriteObjectHeader(ObjectStore::kArrayClass, 0); |
| 586 WriteSmi(object->value.as_array.length); |
| 587 // Write out the type arguments. |
| 588 WriteIndexedObject(Object::kNullObject); |
| 589 // Write out array elements. |
| 590 for (int i = 0; i < object->value.as_array.length; i++) { |
| 591 WriteCObjectRef(object->value.as_array.values[i]); |
| 592 } |
| 593 return; |
| 594 } |
| 595 return WriteCObjectInlined(object, type); |
| 596 } |
| 597 |
| 598 |
| 599 void ApiMessageWriter::WriteCObjectRef(Dart_CObject* object) { |
| 600 if (IsCObjectMarked(object)) { |
| 601 intptr_t object_id = GetMarkedCObjectMark(object); |
| 602 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); |
| 603 return; |
| 604 } |
| 605 |
| 606 Dart_CObject::Type type = object->type; |
| 607 if (type == Dart_CObject::kArray) { |
| 608 // Write out the serialization header value for this object. |
| 609 WriteInlinedHeader(object); |
| 610 // Write out the class information. |
| 611 WriteIndexedObject(ObjectStore::kArrayClass); |
| 612 // Write out the length information. |
| 613 WriteSmi(object->value.as_array.length); |
| 614 // Add object to forward list so that this object is serialized later. |
| 615 AddToForwardList(object); |
| 616 return; |
| 617 } |
| 618 return WriteCObjectInlined(object, type); |
| 619 } |
| 620 |
| 621 |
| 622 void ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) { |
| 623 ASSERT(IsCObjectMarked(object)); |
| 624 Dart_CObject::Type type = |
| 625 static_cast<Dart_CObject::Type>(object->type & kDartCObjectTypeMask); |
| 626 ASSERT(type == Dart_CObject::kArray); |
| 627 |
| 628 // Write out the serialization header value for this object. |
| 629 intptr_t object_id = GetMarkedCObjectMark(object); |
| 630 WriteSerializationMarker(kInlined, kMaxPredefinedObjectIds + object_id); |
| 631 // Write out the class and tags information. |
| 632 WriteObjectHeader(ObjectStore::kArrayClass, 0); |
| 633 WriteSmi(object->value.as_array.length); |
| 634 // Write out the type arguments. |
| 635 WriteIndexedObject(Object::kNullObject); |
| 636 // Write out array elements. |
| 637 for (int i = 0; i < object->value.as_array.length; i++) { |
| 638 WriteCObjectRef(object->value.as_array.values[i]); |
| 639 } |
| 640 } |
| 641 |
| 642 |
| 643 void ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object, |
| 644 Dart_CObject::Type type) { |
| 645 switch (type) { |
| 481 case Dart_CObject::kNull: | 646 case Dart_CObject::kNull: |
| 482 WriteIndexedObject(Object::kNullObject); | 647 WriteIndexedObject(Object::kNullObject); |
| 483 break; | 648 break; |
| 484 case Dart_CObject::kBool: | 649 case Dart_CObject::kBool: |
| 485 if (object->value.as_bool) { | 650 if (object->value.as_bool) { |
| 486 WriteIndexedObject(ObjectStore::kTrueValue); | 651 WriteIndexedObject(ObjectStore::kTrueValue); |
| 487 } else { | 652 } else { |
| 488 WriteIndexedObject(ObjectStore::kFalseValue); | 653 WriteIndexedObject(ObjectStore::kFalseValue); |
| 489 } | 654 } |
| 490 break; | 655 break; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 // Write string length, hash and content | 689 // Write string length, hash and content |
| 525 char* str = object->value.as_string; | 690 char* str = object->value.as_string; |
| 526 intptr_t len = strlen(str); | 691 intptr_t len = strlen(str); |
| 527 WriteSmi(len); | 692 WriteSmi(len); |
| 528 WriteSmi(0); // TODO(sgjesse): Hash - not written. | 693 WriteSmi(0); // TODO(sgjesse): Hash - not written. |
| 529 for (intptr_t i = 0; i < len; i++) { | 694 for (intptr_t i = 0; i < len; i++) { |
| 530 Write<uint8_t>(str[i]); | 695 Write<uint8_t>(str[i]); |
| 531 } | 696 } |
| 532 break; | 697 break; |
| 533 } | 698 } |
| 534 case Dart_CObject::kArray: { | |
| 535 // Write out the serialization header value for this object. | |
| 536 WriteInlinedHeader(object); | |
| 537 // Write out the class and tags information. | |
| 538 WriteObjectHeader(ObjectStore::kArrayClass, 0); | |
| 539 WriteSmi(object->value.as_array.length); | |
| 540 // Write out the type arguments. | |
| 541 WriteIndexedObject(Object::kNullObject); | |
| 542 // Write out array elements. | |
| 543 for (int i = 0; i < object->value.as_array.length; i++) { | |
| 544 WriteCObject(object->value.as_array.values[i]); | |
| 545 } | |
| 546 break; | |
| 547 } | |
| 548 case Dart_CObject::kUint8Array: { | 699 case Dart_CObject::kUint8Array: { |
| 549 // Write out the serialization header value for this object. | 700 // Write out the serialization header value for this object. |
| 550 WriteInlinedHeader(object); | 701 WriteInlinedHeader(object); |
| 551 // Write out the class and tags information. | 702 // Write out the class and tags information. |
| 552 WriteObjectHeader(ObjectStore::kUint8ArrayClass, 0); | 703 WriteObjectHeader(ObjectStore::kUint8ArrayClass, 0); |
| 553 uint8_t* bytes = object->value.as_byte_array.values; | 704 uint8_t* bytes = object->value.as_byte_array.values; |
| 554 intptr_t len = object->value.as_byte_array.length; | 705 intptr_t len = object->value.as_byte_array.length; |
| 555 WriteSmi(len); | 706 WriteSmi(len); |
| 556 for (intptr_t i = 0; i < len; i++) { | 707 for (intptr_t i = 0; i < len; i++) { |
| 557 Write<uint8_t>(bytes[i]); | 708 Write<uint8_t>(bytes[i]); |
| 558 } | 709 } |
| 559 break; | 710 break; |
| 560 } | 711 } |
| 561 default: | 712 default: |
| 562 UNREACHABLE(); | 713 UNREACHABLE(); |
| 563 } | 714 } |
| 564 } | 715 } |
| 565 | 716 |
| 566 | 717 |
| 567 void ApiMessageWriter::WriteCMessage(Dart_CObject* object) { | 718 void ApiMessageWriter::WriteCMessage(Dart_CObject* object) { |
| 568 WriteCObject(object); | 719 WriteCObject(object); |
| 720 // Write out all objects that were added to the forward list and have |
| 721 // not been serialized yet. These would typically be fields of arrays. |
| 722 // NOTE: The forward list might grow as we process the list. |
| 723 for (intptr_t i = 0; i < forward_id_; i++) { |
| 724 WriteForwardedCObject(forward_list_[i]); |
| 725 } |
| 569 UnmarkAllCObjects(object); | 726 UnmarkAllCObjects(object); |
| 570 FinalizeBuffer(); | 727 FinalizeBuffer(); |
| 571 } | 728 } |
| 572 | 729 |
| 573 } // namespace dart | 730 } // namespace dart |
| OLD | NEW |