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/object.h" | 5 #include "vm/object.h" |
6 #include "vm/object_store.h" | 6 #include "vm/object_store.h" |
7 #include "vm/snapshot.h" | 7 #include "vm/snapshot.h" |
8 #include "vm/stub_code.h" | 8 #include "vm/stub_code.h" |
9 #include "vm/symbols.h" | 9 #include "vm/symbols.h" |
10 #include "vm/visitor.h" | 10 #include "vm/visitor.h" |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 (*reader->PassiveObjectHandle()) = | 700 (*reader->PassiveObjectHandle()) = |
701 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset)); | 701 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset)); |
702 func.StorePointer((func.raw()->from() + i), | 702 func.StorePointer((func.raw()->from() + i), |
703 reader->PassiveObjectHandle()->raw()); | 703 reader->PassiveObjectHandle()->raw()); |
704 } | 704 } |
705 | 705 |
706 if (!reader->snapshot_code()) { | 706 if (!reader->snapshot_code()) { |
707 // Initialize all fields that are not part of the snapshot. | 707 // Initialize all fields that are not part of the snapshot. |
708 func.ClearICDataArray(); | 708 func.ClearICDataArray(); |
709 func.ClearCode(); | 709 func.ClearCode(); |
| 710 } else { |
| 711 // TODO(rmacnak): Fix entry_point_. |
710 } | 712 } |
711 return func.raw(); | 713 return func.raw(); |
712 } | 714 } |
713 | 715 |
714 | 716 |
715 void RawFunction::WriteTo(SnapshotWriter* writer, | 717 void RawFunction::WriteTo(SnapshotWriter* writer, |
716 intptr_t object_id, | 718 intptr_t object_id, |
717 Snapshot::Kind kind) { | 719 Snapshot::Kind kind) { |
718 ASSERT(writer != NULL); | 720 ASSERT(writer != NULL); |
719 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); | 721 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 // Write out all the object pointer fields. | 1183 // Write out all the object pointer fields. |
1182 SnapshotWriterVisitor visitor(writer); | 1184 SnapshotWriterVisitor visitor(writer); |
1183 visitor.VisitPointers(from(), to()); | 1185 visitor.VisitPointers(from(), to()); |
1184 } | 1186 } |
1185 | 1187 |
1186 | 1188 |
1187 RawCode* Code::ReadFrom(SnapshotReader* reader, | 1189 RawCode* Code::ReadFrom(SnapshotReader* reader, |
1188 intptr_t object_id, | 1190 intptr_t object_id, |
1189 intptr_t tags, | 1191 intptr_t tags, |
1190 Snapshot::Kind kind) { | 1192 Snapshot::Kind kind) { |
1191 UNREACHABLE(); // Untested. | |
1192 ASSERT(reader->snapshot_code()); | 1193 ASSERT(reader->snapshot_code()); |
1193 ASSERT(kind == Snapshot::kFull); | 1194 ASSERT(kind == Snapshot::kFull); |
1194 | 1195 |
1195 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0)); | 1196 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0)); |
1196 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1197 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1197 | 1198 |
1198 result.set_compile_timestamp(reader->Read<int64_t>()); | 1199 result.set_compile_timestamp(reader->Read<int64_t>()); |
1199 result.set_state_bits(reader->Read<int32_t>()); | 1200 result.set_state_bits(reader->Read<int32_t>()); |
1200 result.set_entry_patch_pc_offset(reader->Read<int32_t>()); | 1201 result.set_entry_patch_pc_offset(reader->Read<int32_t>()); |
1201 result.set_patch_code_pc_offset(reader->Read<int32_t>()); | 1202 result.set_patch_code_pc_offset(reader->Read<int32_t>()); |
1202 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>()); | 1203 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>()); |
1203 | 1204 |
1204 // Set all the object fields. | 1205 // Set all the object fields. |
1205 // TODO(5411462): Need to assert No GC can happen here, even though | 1206 // TODO(5411462): Need to assert No GC can happen here, even though |
1206 // allocations may happen. | 1207 // allocations may happen. |
1207 intptr_t num_flds = (result.raw()->to() - result.raw()->from()); | 1208 intptr_t num_flds = (result.raw()->to() - result.raw()->from()); |
1208 for (intptr_t i = 0; i <= num_flds; i++) { | 1209 for (intptr_t i = 0; i <= num_flds; i++) { |
1209 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); | 1210 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); |
1210 result.StorePointer((result.raw()->from() + i), | 1211 result.StorePointer((result.raw()->from() + i), |
1211 reader->PassiveObjectHandle()->raw()); | 1212 reader->PassiveObjectHandle()->raw()); |
1212 } | 1213 } |
1213 | 1214 |
| 1215 // TODO(rmacnak): Fix entry_point_. |
| 1216 |
1214 return result.raw(); | 1217 return result.raw(); |
1215 } | 1218 } |
1216 | 1219 |
1217 | 1220 |
1218 void RawCode::WriteTo(SnapshotWriter* writer, | 1221 void RawCode::WriteTo(SnapshotWriter* writer, |
1219 intptr_t object_id, | 1222 intptr_t object_id, |
1220 Snapshot::Kind kind) { | 1223 Snapshot::Kind kind) { |
1221 ASSERT(writer->snapshot_code()); | 1224 ASSERT(writer->snapshot_code()); |
1222 ASSERT(kind == Snapshot::kFull); | 1225 ASSERT(kind == Snapshot::kFull); |
1223 | 1226 |
(...skipping 21 matching lines...) Expand all Loading... |
1245 // Write out all the object pointer fields. | 1248 // Write out all the object pointer fields. |
1246 SnapshotWriterVisitor visitor(writer); | 1249 SnapshotWriterVisitor visitor(writer); |
1247 visitor.VisitPointers(from(), to()); | 1250 visitor.VisitPointers(from(), to()); |
1248 } | 1251 } |
1249 | 1252 |
1250 | 1253 |
1251 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, | 1254 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, |
1252 intptr_t object_id, | 1255 intptr_t object_id, |
1253 intptr_t tags, | 1256 intptr_t tags, |
1254 Snapshot::Kind kind) { | 1257 Snapshot::Kind kind) { |
1255 UNREACHABLE(); // Untested. | |
1256 ASSERT(reader->snapshot_code()); | 1258 ASSERT(reader->snapshot_code()); |
1257 ASSERT(kind == Snapshot::kFull); | 1259 ASSERT(kind == Snapshot::kFull); |
1258 | 1260 |
1259 intptr_t id = reader->Read<int32_t>(); | 1261 intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>()); |
| 1262 intptr_t offset = reader->Read<int32_t>(); |
1260 Instructions& result = | 1263 Instructions& result = |
1261 Instructions::ZoneHandle(reader->zone(), | 1264 Instructions::ZoneHandle(reader->zone(), |
1262 reader->GetInstructionsById(id)); | 1265 reader->GetInstructionsAt(offset, full_tags)); |
1263 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1266 reader->AddBackRef(object_id, &result, kIsDeserialized); |
| 1267 |
| 1268 { |
| 1269 // TODO(rmacnak): Drop after calling convention change. |
| 1270 Code::CheckedHandle(reader->ReadObjectImpl(kAsReference)); |
| 1271 ObjectPool::CheckedHandle(reader->ReadObjectImpl(kAsReference)); |
| 1272 } |
| 1273 |
1264 return result.raw(); | 1274 return result.raw(); |
1265 } | 1275 } |
1266 | 1276 |
1267 | 1277 |
1268 void RawInstructions::WriteTo(SnapshotWriter* writer, | 1278 void RawInstructions::WriteTo(SnapshotWriter* writer, |
1269 intptr_t object_id, | 1279 intptr_t object_id, |
1270 Snapshot::Kind kind) { | 1280 Snapshot::Kind kind) { |
1271 ASSERT(writer->snapshot_code()); | 1281 ASSERT(writer->snapshot_code()); |
1272 ASSERT(kind == Snapshot::kFull); | 1282 ASSERT(kind == Snapshot::kFull); |
1273 | 1283 |
1274 { | 1284 { |
1275 // TODO(rmacnak): Drop after calling convention change. | 1285 // TODO(rmacnak): Drop after calling convention change. |
1276 writer->WriteInlinedObjectHeader(object_id); | 1286 writer->WriteInlinedObjectHeader(object_id); |
1277 writer->WriteVMIsolateObject(kInstructionsCid); | 1287 writer->WriteVMIsolateObject(kInstructionsCid); |
1278 writer->WriteTags(writer->GetObjectTags(this)); | 1288 writer->WriteTags(writer->GetObjectTags(this)); |
| 1289 } |
| 1290 |
| 1291 writer->Write<intptr_t>(writer->GetObjectTags(this)); // For sanity check. |
| 1292 |
| 1293 // Temporarily restore the object header for writing to the text section. |
| 1294 // TODO(asiva): Don't mutate object headers during serialization. |
| 1295 uword object_tags = writer->GetObjectTags(this); |
| 1296 uword snapshot_tags = ptr()->tags_; |
| 1297 ptr()->tags_ = object_tags; |
| 1298 writer->Write<int32_t>(writer->GetInstructionsId(this)); |
| 1299 ptr()->tags_ = snapshot_tags; |
| 1300 |
| 1301 { |
| 1302 // TODO(rmacnak): Drop after calling convention change. |
1279 writer->WriteObjectImpl(ptr()->code_, kAsReference); | 1303 writer->WriteObjectImpl(ptr()->code_, kAsReference); |
1280 writer->WriteObjectImpl(ptr()->object_pool_, kAsReference); | 1304 writer->WriteObjectImpl(ptr()->object_pool_, kAsReference); |
1281 } | 1305 } |
1282 | |
1283 writer->Write<int32_t>(writer->GetInstructionsId(this)); | |
1284 } | 1306 } |
1285 | 1307 |
1286 | 1308 |
1287 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader, | 1309 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader, |
1288 intptr_t object_id, | 1310 intptr_t object_id, |
1289 intptr_t tags, | 1311 intptr_t tags, |
1290 Snapshot::Kind kind) { | 1312 Snapshot::Kind kind) { |
1291 UNREACHABLE(); // Untested. | |
1292 ASSERT(reader->snapshot_code()); | 1313 ASSERT(reader->snapshot_code()); |
1293 ASSERT(kind == Snapshot::kFull); | 1314 ASSERT(kind == Snapshot::kFull); |
1294 | 1315 |
1295 intptr_t length = reader->Read<intptr_t>(); | 1316 intptr_t length = reader->Read<intptr_t>(); |
1296 | 1317 |
1297 ObjectPool& result = | 1318 ObjectPool& result = |
1298 ObjectPool::ZoneHandle(reader->zone(), | 1319 ObjectPool::ZoneHandle(reader->zone(), |
1299 NEW_OBJECT_WITH_LEN(ObjectPool, length)); | 1320 NEW_OBJECT_WITH_LEN(ObjectPool, length)); |
1300 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1321 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1301 | 1322 |
1302 RawTypedData* info_array = result.raw_ptr()->info_array_->ptr(); | 1323 const TypedData& info_array = |
| 1324 TypedData::Handle(reader->NewTypedData(kTypedDataInt8ArrayCid, length)); |
| 1325 result.set_info_array(info_array); |
1303 | 1326 |
1304 // Set all the object fields. | 1327 NoSafepointScope no_safepoint; |
1305 // TODO(5411462): Need to assert No GC can happen here, even though | |
1306 // allocations may happen. | |
1307 for (intptr_t i = 0; i < length; i++) { | 1328 for (intptr_t i = 0; i < length; i++) { |
1308 ObjectPool::EntryType entry_type = | 1329 ObjectPool::EntryType entry_type = |
1309 static_cast<ObjectPool::EntryType>(reader->Read<uint8_t>()); | 1330 static_cast<ObjectPool::EntryType>(reader->Read<int8_t>()); |
1310 info_array->data()[i] = entry_type; | 1331 *reinterpret_cast<int8_t*>(info_array.DataAddr(i)) = entry_type; |
1311 switch (entry_type) { | 1332 switch (entry_type) { |
1312 case ObjectPool::kTaggedObject: { | 1333 case ObjectPool::kTaggedObject: { |
1313 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); | 1334 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); |
1314 result.SetObjectAt(i, *(reader->PassiveObjectHandle())); | 1335 result.SetObjectAt(i, *(reader->PassiveObjectHandle())); |
1315 break; | 1336 break; |
1316 } | 1337 } |
1317 case ObjectPool::kImmediate: { | 1338 case ObjectPool::kImmediate: { |
1318 intptr_t raw_value = reader->Read<intptr_t>(); | 1339 intptr_t raw_value = reader->Read<intptr_t>(); |
1319 result.SetRawValueAt(i, raw_value); | 1340 result.SetRawValueAt(i, raw_value); |
1320 break; | 1341 break; |
(...skipping 27 matching lines...) Expand all Loading... |
1348 writer->WriteTags(writer->GetObjectTags(this)); | 1369 writer->WriteTags(writer->GetObjectTags(this)); |
1349 | 1370 |
1350 intptr_t length = ptr()->length_; | 1371 intptr_t length = ptr()->length_; |
1351 RawTypedData* info_array = ptr()->info_array_->ptr(); | 1372 RawTypedData* info_array = ptr()->info_array_->ptr(); |
1352 ASSERT(info_array != TypedData::null()); | 1373 ASSERT(info_array != TypedData::null()); |
1353 | 1374 |
1354 writer->Write<intptr_t>(length); | 1375 writer->Write<intptr_t>(length); |
1355 for (intptr_t i = 0; i < length; i++) { | 1376 for (intptr_t i = 0; i < length; i++) { |
1356 ObjectPool::EntryType entry_type = | 1377 ObjectPool::EntryType entry_type = |
1357 static_cast<ObjectPool::EntryType>(info_array->data()[i]); | 1378 static_cast<ObjectPool::EntryType>(info_array->data()[i]); |
1358 writer->Write<uint8_t>(entry_type); | 1379 writer->Write<int8_t>(entry_type); |
1359 Entry& entry = ptr()->data()[i]; | 1380 Entry& entry = ptr()->data()[i]; |
1360 switch (entry_type) { | 1381 switch (entry_type) { |
1361 case ObjectPool::kTaggedObject: | 1382 case ObjectPool::kTaggedObject: |
1362 writer->WriteObjectImpl(entry.raw_obj_, kAsReference); | 1383 writer->WriteObjectImpl(entry.raw_obj_, kAsReference); |
1363 break; | 1384 break; |
1364 case ObjectPool::kImmediate: | 1385 case ObjectPool::kImmediate: |
1365 writer->Write<intptr_t>(entry.raw_value_); | 1386 writer->Write<intptr_t>(entry.raw_value_); |
1366 break; | 1387 break; |
1367 case ObjectPool::kExternalLabel: | 1388 case ObjectPool::kExternalLabel: |
1368 // TODO(rmacnak): Write symbolically. | 1389 // TODO(rmacnak): Write symbolically. |
1369 writer->Write<intptr_t>(entry.raw_value_); | 1390 writer->Write<intptr_t>(entry.raw_value_); |
1370 break; | 1391 break; |
1371 default: | 1392 default: |
1372 UNREACHABLE(); | 1393 UNREACHABLE(); |
1373 } | 1394 } |
1374 } | 1395 } |
1375 } | 1396 } |
1376 | 1397 |
1377 | 1398 |
1378 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader, | 1399 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader, |
1379 intptr_t object_id, | 1400 intptr_t object_id, |
1380 intptr_t tags, | 1401 intptr_t tags, |
1381 Snapshot::Kind kind) { | 1402 Snapshot::Kind kind) { |
1382 UNREACHABLE(); // Untested. | |
1383 ASSERT(reader->snapshot_code()); | 1403 ASSERT(reader->snapshot_code()); |
| 1404 ASSERT(kind == Snapshot::kFull); |
1384 | 1405 |
1385 const int32_t length = reader->Read<int32_t>(); | 1406 const int32_t length = reader->Read<int32_t>(); |
1386 PcDescriptors& result = PcDescriptors::ZoneHandle(reader->zone(), | 1407 PcDescriptors& result = |
1387 PcDescriptors::New(length)); | 1408 PcDescriptors::ZoneHandle(reader->zone(), |
| 1409 NEW_OBJECT_WITH_LEN(PcDescriptors, length)); |
1388 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1410 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1389 | 1411 |
1390 if (result.Length() > 0) { | 1412 if (result.Length() > 0) { |
1391 NoSafepointScope no_safepoint; | 1413 NoSafepointScope no_safepoint; |
1392 intptr_t len = result.Length(); | 1414 intptr_t len = result.Length(); |
1393 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); | 1415 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); |
1394 reader->ReadBytes(data, len); | 1416 reader->ReadBytes(data, len); |
1395 } | 1417 } |
1396 | 1418 |
1397 return result.raw(); | 1419 return result.raw(); |
1398 } | 1420 } |
1399 | 1421 |
1400 | 1422 |
1401 void RawPcDescriptors::WriteTo(SnapshotWriter* writer, | 1423 void RawPcDescriptors::WriteTo(SnapshotWriter* writer, |
1402 intptr_t object_id, | 1424 intptr_t object_id, |
1403 Snapshot::Kind kind) { | 1425 Snapshot::Kind kind) { |
1404 ASSERT(writer->snapshot_code()); | 1426 ASSERT(writer->snapshot_code()); |
| 1427 ASSERT(kind == Snapshot::kFull); |
1405 | 1428 |
1406 // Write out the serialization header value for this object. | 1429 // Write out the serialization header value for this object. |
1407 writer->WriteInlinedObjectHeader(object_id); | 1430 writer->WriteInlinedObjectHeader(object_id); |
1408 writer->WriteIndexedObject(kPcDescriptorsCid); | 1431 writer->WriteIndexedObject(kPcDescriptorsCid); |
1409 writer->WriteTags(writer->GetObjectTags(this)); | 1432 writer->WriteTags(writer->GetObjectTags(this)); |
1410 writer->Write<int32_t>(ptr()->length_); | 1433 writer->Write<int32_t>(ptr()->length_); |
1411 if (ptr()->length_ > 0) { | 1434 if (ptr()->length_ > 0) { |
1412 intptr_t len = ptr()->length_; | 1435 intptr_t len = ptr()->length_; |
1413 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); | 1436 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); |
1414 writer->WriteBytes(data, len); | 1437 writer->WriteBytes(data, len); |
1415 } | 1438 } |
1416 } | 1439 } |
1417 | 1440 |
1418 | 1441 |
1419 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader, | 1442 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader, |
1420 intptr_t object_id, | 1443 intptr_t object_id, |
1421 intptr_t tags, | 1444 intptr_t tags, |
1422 Snapshot::Kind kind) { | 1445 Snapshot::Kind kind) { |
1423 UNREACHABLE(); // Untested. | |
1424 ASSERT(reader->snapshot_code()); | 1446 ASSERT(reader->snapshot_code()); |
| 1447 ASSERT(kind == Snapshot::kFull); |
1425 | 1448 |
1426 const int32_t length = reader->Read<int32_t>(); | 1449 const int32_t length = reader->Read<int32_t>(); |
1427 const int32_t register_bit_count = reader->Read<int32_t>(); | |
1428 const uword pc_offset = reader->Read<uint32_t>(); | |
1429 | |
1430 Stackmap& result = | 1450 Stackmap& result = |
1431 Stackmap::ZoneHandle(reader->zone(), | 1451 Stackmap::ZoneHandle(reader->zone(), |
1432 Stackmap::New(length, register_bit_count, pc_offset)); | 1452 reader->NewStackmap(length)); |
1433 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1453 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1434 | 1454 |
1435 if (result.Length() > 0) { | 1455 result.SetRegisterBitCount(reader->Read<int32_t>()); |
| 1456 result.SetPcOffset(reader->Read<uint32_t>()); |
| 1457 |
| 1458 if (length > 0) { |
1436 NoSafepointScope no_safepoint; | 1459 NoSafepointScope no_safepoint; |
1437 intptr_t len = (result.Length() + 7) / 8; | 1460 intptr_t len = (result.Length() + 7) / 8; |
1438 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); | 1461 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); |
1439 reader->ReadBytes(data, len); | 1462 reader->ReadBytes(data, len); |
1440 } | 1463 } |
1441 | 1464 |
1442 return result.raw(); | 1465 return result.raw(); |
1443 } | 1466 } |
1444 | 1467 |
1445 | 1468 |
1446 void RawStackmap::WriteTo(SnapshotWriter* writer, | 1469 void RawStackmap::WriteTo(SnapshotWriter* writer, |
1447 intptr_t object_id, | 1470 intptr_t object_id, |
1448 Snapshot::Kind kind) { | 1471 Snapshot::Kind kind) { |
1449 ASSERT(writer->snapshot_code()); | 1472 ASSERT(writer->snapshot_code()); |
| 1473 ASSERT(kind == Snapshot::kFull); |
1450 | 1474 |
1451 // Write out the serialization header value for this object. | 1475 // Write out the serialization header value for this object. |
1452 writer->WriteInlinedObjectHeader(object_id); | 1476 writer->WriteInlinedObjectHeader(object_id); |
1453 writer->WriteIndexedObject(kStackmapCid); | 1477 writer->WriteIndexedObject(kStackmapCid); |
1454 writer->WriteTags(writer->GetObjectTags(this)); | 1478 writer->WriteTags(writer->GetObjectTags(this)); |
| 1479 |
1455 writer->Write<int32_t>(ptr()->length_); | 1480 writer->Write<int32_t>(ptr()->length_); |
1456 writer->Write<int32_t>(ptr()->register_bit_count_); | 1481 writer->Write<int32_t>(ptr()->register_bit_count_); |
1457 writer->Write<uint32_t>(ptr()->pc_offset_); | 1482 writer->Write<uint32_t>(ptr()->pc_offset_); |
1458 if (ptr()->length_ > 0) { | 1483 if (ptr()->length_ > 0) { |
1459 intptr_t len = (ptr()->length_ + 7) / 8; | 1484 intptr_t len = (ptr()->length_ + 7) / 8; |
1460 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); | 1485 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); |
1461 writer->WriteBytes(data, len); | 1486 writer->WriteBytes(data, len); |
1462 } | 1487 } |
1463 } | 1488 } |
1464 | 1489 |
1465 | 1490 |
1466 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader, | 1491 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader, |
1467 intptr_t object_id, | 1492 intptr_t object_id, |
1468 intptr_t tags, | 1493 intptr_t tags, |
1469 Snapshot::Kind kind) { | 1494 Snapshot::Kind kind) { |
1470 UNREACHABLE(); // Untested. | |
1471 ASSERT(reader->snapshot_code()); | 1495 ASSERT(reader->snapshot_code()); |
| 1496 ASSERT(kind == Snapshot::kFull); |
1472 | 1497 |
1473 const int32_t num_entries = reader->Read<int32_t>(); | 1498 const int32_t num_entries = reader->Read<int32_t>(); |
1474 | 1499 |
1475 LocalVarDescriptors& result = | 1500 LocalVarDescriptors& result = |
1476 LocalVarDescriptors::ZoneHandle(reader->zone(), | 1501 LocalVarDescriptors::ZoneHandle(reader->zone(), |
1477 LocalVarDescriptors::New(num_entries)); | 1502 NEW_OBJECT_WITH_LEN(LocalVarDescriptors, |
| 1503 num_entries)); |
1478 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1504 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1479 | 1505 |
1480 for (intptr_t i = 0; i < num_entries; i++) { | 1506 for (intptr_t i = 0; i < num_entries; i++) { |
1481 (*reader->StringHandle()) ^= reader->ReadObjectImpl(kAsReference); | 1507 (*reader->StringHandle()) ^= reader->ReadObjectImpl(kAsReference); |
1482 result.StorePointer(result.raw()->nameAddrAt(i), | 1508 result.StorePointer(result.raw()->nameAddrAt(i), |
1483 reader->StringHandle()->raw()); | 1509 reader->StringHandle()->raw()); |
1484 } | 1510 } |
1485 | 1511 |
1486 if (num_entries > 0) { | 1512 if (num_entries > 0) { |
1487 NoSafepointScope no_safepoint; | 1513 NoSafepointScope no_safepoint; |
1488 intptr_t len = num_entries * sizeof(RawLocalVarDescriptors::VarInfo); | 1514 intptr_t len = num_entries * sizeof(RawLocalVarDescriptors::VarInfo); |
1489 uint8_t* data = result.UnsafeMutableNonPointer( | 1515 uint8_t* data = result.UnsafeMutableNonPointer( |
1490 reinterpret_cast<const uint8_t*>(result.raw()->data())); | 1516 reinterpret_cast<const uint8_t*>(result.raw()->data())); |
1491 reader->ReadBytes(data, len); | 1517 reader->ReadBytes(data, len); |
1492 } | 1518 } |
1493 | 1519 |
1494 return result.raw(); | 1520 return result.raw(); |
1495 } | 1521 } |
1496 | 1522 |
1497 | 1523 |
1498 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer, | 1524 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer, |
1499 intptr_t object_id, | 1525 intptr_t object_id, |
1500 Snapshot::Kind kind) { | 1526 Snapshot::Kind kind) { |
1501 ASSERT(writer->snapshot_code()); | 1527 ASSERT(writer->snapshot_code()); |
| 1528 ASSERT(kind == Snapshot::kFull); |
1502 | 1529 |
1503 // Write out the serialization header value for this object. | 1530 // Write out the serialization header value for this object. |
1504 writer->WriteInlinedObjectHeader(object_id); | 1531 writer->WriteInlinedObjectHeader(object_id); |
1505 writer->WriteIndexedObject(kLocalVarDescriptorsCid); | 1532 writer->WriteIndexedObject(kLocalVarDescriptorsCid); |
1506 writer->WriteTags(writer->GetObjectTags(this)); | 1533 writer->WriteTags(writer->GetObjectTags(this)); |
1507 writer->Write<int32_t>(ptr()->num_entries_); | 1534 writer->Write<int32_t>(ptr()->num_entries_); |
1508 for (intptr_t i = 0; i < ptr()->num_entries_; i++) { | 1535 for (intptr_t i = 0; i < ptr()->num_entries_; i++) { |
1509 writer->WriteObjectImpl(ptr()->names()[i], kAsInlinedObject); | 1536 writer->WriteObjectImpl(ptr()->names()[i], kAsInlinedObject); |
1510 } | 1537 } |
1511 if (ptr()->num_entries_ > 0) { | 1538 if (ptr()->num_entries_ > 0) { |
1512 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo); | 1539 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo); |
1513 uint8_t* data = reinterpret_cast<uint8_t*>(this->data()); | 1540 uint8_t* data = reinterpret_cast<uint8_t*>(this->data()); |
1514 writer->WriteBytes(data, len); | 1541 writer->WriteBytes(data, len); |
1515 } | 1542 } |
1516 } | 1543 } |
1517 | 1544 |
1518 | 1545 |
1519 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader, | 1546 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader, |
1520 intptr_t object_id, | 1547 intptr_t object_id, |
1521 intptr_t tags, | 1548 intptr_t tags, |
1522 Snapshot::Kind kind) { | 1549 Snapshot::Kind kind) { |
1523 UNREACHABLE(); // Untested. | |
1524 ASSERT(reader->snapshot_code()); | 1550 ASSERT(reader->snapshot_code()); |
| 1551 ASSERT(kind == Snapshot::kFull); |
1525 | 1552 |
1526 // handled_types_data. | 1553 const int32_t num_entries = reader->Read<int32_t>(); |
1527 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); | |
1528 | |
1529 ExceptionHandlers& result = | 1554 ExceptionHandlers& result = |
1530 ExceptionHandlers::ZoneHandle(reader->zone(), | 1555 ExceptionHandlers::ZoneHandle(reader->zone(), |
1531 ExceptionHandlers::New(*reader->ArrayHandle())); | 1556 NEW_OBJECT_WITH_LEN(ExceptionHandlers, |
| 1557 num_entries)); |
1532 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1558 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1533 | 1559 |
1534 if (result.num_entries() > 0) { | 1560 if (result.num_entries() > 0) { |
1535 NoSafepointScope no_safepoint; | 1561 NoSafepointScope no_safepoint; |
1536 const intptr_t len = | 1562 const intptr_t len = |
1537 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo); | 1563 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo); |
1538 uint8_t* data = result.UnsafeMutableNonPointer( | 1564 uint8_t* data = result.UnsafeMutableNonPointer( |
1539 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data())); | 1565 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data())); |
1540 reader->ReadBytes(data, len); | 1566 reader->ReadBytes(data, len); |
1541 } | 1567 } |
1542 | 1568 |
| 1569 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); |
| 1570 result.StorePointer(&result.raw_ptr()->handled_types_data_, |
| 1571 reader->ArrayHandle()->raw()); |
| 1572 |
1543 return result.raw(); | 1573 return result.raw(); |
1544 } | 1574 } |
1545 | 1575 |
1546 | 1576 |
1547 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer, | 1577 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer, |
1548 intptr_t object_id, | 1578 intptr_t object_id, |
1549 Snapshot::Kind kind) { | 1579 Snapshot::Kind kind) { |
1550 ASSERT(writer->snapshot_code()); | 1580 ASSERT(writer->snapshot_code()); |
| 1581 ASSERT(kind == Snapshot::kFull); |
1551 | 1582 |
1552 // Write out the serialization header value for this object. | 1583 // Write out the serialization header value for this object. |
1553 writer->WriteInlinedObjectHeader(object_id); | 1584 writer->WriteInlinedObjectHeader(object_id); |
1554 writer->WriteIndexedObject(kExceptionHandlersCid); | 1585 writer->WriteIndexedObject(kExceptionHandlersCid); |
1555 writer->WriteTags(writer->GetObjectTags(this)); | 1586 writer->WriteTags(writer->GetObjectTags(this)); |
1556 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject); | 1587 writer->Write<int32_t>(ptr()->num_entries_); |
1557 | 1588 |
1558 if (ptr()->num_entries_ > 0) { | 1589 if (ptr()->num_entries_ > 0) { |
1559 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo); | 1590 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo); |
1560 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); | 1591 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); |
1561 writer->WriteBytes(data, len); | 1592 writer->WriteBytes(data, len); |
1562 } | 1593 } |
| 1594 |
| 1595 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject); |
1563 } | 1596 } |
1564 | 1597 |
1565 | 1598 |
1566 RawContext* Context::ReadFrom(SnapshotReader* reader, | 1599 RawContext* Context::ReadFrom(SnapshotReader* reader, |
1567 intptr_t object_id, | 1600 intptr_t object_id, |
1568 intptr_t tags, | 1601 intptr_t tags, |
1569 Snapshot::Kind kind) { | 1602 Snapshot::Kind kind) { |
1570 ASSERT(reader != NULL); | 1603 ASSERT(reader != NULL); |
1571 | 1604 |
1572 // Allocate context object. | 1605 // Allocate context object. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 intptr_t object_id, | 1661 intptr_t object_id, |
1629 Snapshot::Kind kind) { | 1662 Snapshot::Kind kind) { |
1630 UNREACHABLE(); | 1663 UNREACHABLE(); |
1631 } | 1664 } |
1632 | 1665 |
1633 | 1666 |
1634 RawICData* ICData::ReadFrom(SnapshotReader* reader, | 1667 RawICData* ICData::ReadFrom(SnapshotReader* reader, |
1635 intptr_t object_id, | 1668 intptr_t object_id, |
1636 intptr_t tags, | 1669 intptr_t tags, |
1637 Snapshot::Kind kind) { | 1670 Snapshot::Kind kind) { |
1638 UNREACHABLE(); // Untested. | |
1639 ASSERT(reader->snapshot_code()); | 1671 ASSERT(reader->snapshot_code()); |
1640 ASSERT(kind == Snapshot::kFull); | 1672 ASSERT(kind == Snapshot::kFull); |
1641 | 1673 |
1642 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); | 1674 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); |
1643 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1675 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1644 | 1676 |
1645 result.set_deopt_id(reader->Read<int32_t>()); | 1677 result.set_deopt_id(reader->Read<int32_t>()); |
1646 result.set_state_bits(reader->Read<uint32_t>()); | 1678 result.set_state_bits(reader->Read<uint32_t>()); |
1647 | 1679 |
1648 // Set all the object fields. | 1680 // Set all the object fields. |
(...skipping 30 matching lines...) Expand all Loading... |
1679 // Write out all the object pointer fields. | 1711 // Write out all the object pointer fields. |
1680 SnapshotWriterVisitor visitor(writer); | 1712 SnapshotWriterVisitor visitor(writer); |
1681 visitor.VisitPointers(from(), to()); | 1713 visitor.VisitPointers(from(), to()); |
1682 } | 1714 } |
1683 | 1715 |
1684 | 1716 |
1685 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader, | 1717 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader, |
1686 intptr_t object_id, | 1718 intptr_t object_id, |
1687 intptr_t tags, | 1719 intptr_t tags, |
1688 Snapshot::Kind kind) { | 1720 Snapshot::Kind kind) { |
1689 UNREACHABLE(); // Untested. | |
1690 ASSERT(reader->snapshot_code()); | 1721 ASSERT(reader->snapshot_code()); |
1691 ASSERT(kind == Snapshot::kFull); | 1722 ASSERT(kind == Snapshot::kFull); |
1692 | 1723 |
1693 MegamorphicCache& result = | 1724 MegamorphicCache& result = |
1694 MegamorphicCache::ZoneHandle(reader->zone(), | 1725 MegamorphicCache::ZoneHandle(reader->zone(), |
1695 NEW_OBJECT(MegamorphicCache)); | 1726 NEW_OBJECT(MegamorphicCache)); |
1696 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1727 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1697 | 1728 |
1698 result.set_filled_entry_count(reader->Read<int32_t>()); | 1729 result.set_filled_entry_count(reader->Read<int32_t>()); |
1699 | 1730 |
(...skipping 30 matching lines...) Expand all Loading... |
1730 // Write out all the object pointer fields. | 1761 // Write out all the object pointer fields. |
1731 SnapshotWriterVisitor visitor(writer); | 1762 SnapshotWriterVisitor visitor(writer); |
1732 visitor.VisitPointers(from(), to()); | 1763 visitor.VisitPointers(from(), to()); |
1733 } | 1764 } |
1734 | 1765 |
1735 | 1766 |
1736 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader, | 1767 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader, |
1737 intptr_t object_id, | 1768 intptr_t object_id, |
1738 intptr_t tags, | 1769 intptr_t tags, |
1739 Snapshot::Kind kind) { | 1770 Snapshot::Kind kind) { |
1740 UNREACHABLE(); // Untested. | |
1741 ASSERT(reader->snapshot_code()); | 1771 ASSERT(reader->snapshot_code()); |
1742 ASSERT(kind == Snapshot::kFull); | 1772 ASSERT(kind == Snapshot::kFull); |
1743 | 1773 |
1744 SubtypeTestCache& result = | 1774 SubtypeTestCache& result = |
1745 SubtypeTestCache::ZoneHandle(reader->zone(), | 1775 SubtypeTestCache::ZoneHandle(reader->zone(), |
1746 NEW_OBJECT(SubtypeTestCache)); | 1776 NEW_OBJECT(SubtypeTestCache)); |
1747 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1777 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1748 | 1778 |
1749 // Set all the object fields. | 1779 // Set all the object fields. |
1750 // TODO(5411462): Need to assert No GC can happen here, even though | 1780 // TODO(5411462): Need to assert No GC can happen here, even though |
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2532 | 2562 |
2533 | 2563 |
2534 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, | 2564 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, |
2535 intptr_t object_id, | 2565 intptr_t object_id, |
2536 intptr_t tags, | 2566 intptr_t tags, |
2537 Snapshot::Kind kind) { | 2567 Snapshot::Kind kind) { |
2538 ASSERT(reader != NULL); | 2568 ASSERT(reader != NULL); |
2539 | 2569 |
2540 LinkedHashMap& map = LinkedHashMap::ZoneHandle( | 2570 LinkedHashMap& map = LinkedHashMap::ZoneHandle( |
2541 reader->zone(), LinkedHashMap::null()); | 2571 reader->zone(), LinkedHashMap::null()); |
2542 if (kind == Snapshot::kFull || kind == Snapshot::kScript) { | 2572 if ((kind == Snapshot::kFull && !reader->snapshot_code()) || |
| 2573 kind == Snapshot::kScript) { |
2543 // The immutable maps that seed map literals are not yet VM-internal, so | 2574 // The immutable maps that seed map literals are not yet VM-internal, so |
2544 // we don't reach this. | 2575 // we don't reach this. |
2545 UNREACHABLE(); | 2576 UNREACHABLE(); |
2546 } else { | 2577 } else { |
2547 // Since the map might contain itself as a key or value, allocate first. | 2578 // Since the map might contain itself as a key or value, allocate first. |
2548 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind)); | 2579 if (kind == Snapshot::kFull) { |
| 2580 map = reader->NewLinkedHashMap(); |
| 2581 } else { |
| 2582 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind)); |
| 2583 } |
2549 } | 2584 } |
2550 reader->AddBackRef(object_id, &map, kIsDeserialized); | 2585 reader->AddBackRef(object_id, &map, kIsDeserialized); |
2551 | 2586 |
2552 // Read the type arguments. | 2587 // Read the type arguments. |
2553 const intptr_t typeargs_offset = | 2588 const intptr_t typeargs_offset = |
2554 GrowableObjectArray::type_arguments_offset() / kWordSize; | 2589 GrowableObjectArray::type_arguments_offset() / kWordSize; |
2555 *reader->TypeArgumentsHandle() ^= | 2590 *reader->TypeArgumentsHandle() ^= |
2556 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); | 2591 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); |
2557 map.SetTypeArguments(*reader->TypeArgumentsHandle()); | 2592 map.SetTypeArguments(*reader->TypeArgumentsHandle()); |
2558 | 2593 |
2559 // Read the number of key/value pairs. | 2594 // Read the number of key/value pairs. |
2560 intptr_t len = reader->ReadSmiValue(); | 2595 intptr_t len = reader->ReadSmiValue(); |
2561 intptr_t used_data = (len << 1); | 2596 intptr_t used_data = (len << 1); |
2562 map.SetUsedData(used_data); | 2597 map.SetUsedData(used_data); |
2563 | 2598 |
2564 // Allocate the data array. | 2599 // Allocate the data array. |
2565 intptr_t data_size = Utils::Maximum( | 2600 intptr_t data_size = Utils::Maximum( |
2566 Utils::RoundUpToPowerOfTwo(used_data), | 2601 Utils::RoundUpToPowerOfTwo(used_data), |
2567 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize)); | 2602 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize)); |
2568 Array& data = Array::ZoneHandle(reader->zone(), | 2603 Array& data = Array::ZoneHandle(reader->zone(), |
2569 Array::New(data_size, HEAP_SPACE(kind))); | 2604 NEW_OBJECT_WITH_LEN_SPACE(Array, |
| 2605 data_size, |
| 2606 kind)); |
2570 map.SetData(data); | 2607 map.SetData(data); |
2571 map.SetDeletedKeys(0); | 2608 map.SetDeletedKeys(0); |
2572 | 2609 |
2573 // The index and hashMask is regenerated by the maps themselves on demand. | 2610 // The index and hashMask is regenerated by the maps themselves on demand. |
2574 // Thus, the index will probably be allocated in new space (unless it's huge). | 2611 // Thus, the index will probably be allocated in new space (unless it's huge). |
2575 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and | 2612 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and |
2576 // in particular, if/when (const) maps are needed in the VM isolate snapshot. | 2613 // in particular, if/when (const) maps are needed in the VM isolate snapshot. |
2577 ASSERT(reader->isolate() != Dart::vm_isolate()); | 2614 ASSERT(reader->isolate() != Dart::vm_isolate()); |
2578 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback. | 2615 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback. |
2579 | 2616 |
2580 // Read the keys and values. | 2617 // Read the keys and values. |
2581 bool as_reference = RawObject::IsCanonical(tags) ? false : true; | 2618 bool as_reference = RawObject::IsCanonical(tags) ? false : true; |
2582 for (intptr_t i = 0; i < used_data; i++) { | 2619 for (intptr_t i = 0; i < used_data; i++) { |
2583 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(as_reference); | 2620 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(as_reference); |
2584 data.SetAt(i, *reader->PassiveObjectHandle()); | 2621 data.SetAt(i, *reader->PassiveObjectHandle()); |
2585 } | 2622 } |
2586 return map.raw(); | 2623 return map.raw(); |
2587 } | 2624 } |
2588 | 2625 |
2589 | 2626 |
2590 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer, | 2627 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer, |
2591 intptr_t object_id, | 2628 intptr_t object_id, |
2592 Snapshot::Kind kind) { | 2629 Snapshot::Kind kind) { |
2593 if (kind == Snapshot::kFull || kind == Snapshot::kScript) { | 2630 if ((kind == Snapshot::kFull && !writer->snapshot_code()) || |
| 2631 kind == Snapshot::kScript) { |
2594 // The immutable maps that seed map literals are not yet VM-internal, so | 2632 // The immutable maps that seed map literals are not yet VM-internal, so |
2595 // we don't reach this. | 2633 // we don't reach this. |
2596 UNREACHABLE(); | |
2597 } | 2634 } |
2598 ASSERT(writer != NULL); | 2635 ASSERT(writer != NULL); |
2599 | 2636 |
2600 // Write out the serialization header value for this object. | 2637 // Write out the serialization header value for this object. |
2601 writer->WriteInlinedObjectHeader(object_id); | 2638 writer->WriteInlinedObjectHeader(object_id); |
2602 | 2639 |
2603 // Write out the class and tags information. | 2640 // Write out the class and tags information. |
2604 writer->WriteIndexedObject(kLinkedHashMapCid); | 2641 writer->WriteIndexedObject(kLinkedHashMapCid); |
2605 const uword tags = writer->GetObjectTags(this); | 2642 const uword tags = writer->GetObjectTags(this); |
2606 writer->WriteTags(tags); | 2643 writer->WriteTags(tags); |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3032 } else { | 3069 } else { |
3033 UNREACHABLE(); | 3070 UNREACHABLE(); |
3034 } | 3071 } |
3035 } | 3072 } |
3036 | 3073 |
3037 | 3074 |
3038 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader, | 3075 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader, |
3039 intptr_t object_id, | 3076 intptr_t object_id, |
3040 intptr_t tags, | 3077 intptr_t tags, |
3041 Snapshot::Kind kind) { | 3078 Snapshot::Kind kind) { |
| 3079 ASSERT(kind == Snapshot::kMessage || reader->snapshot_code()); |
| 3080 |
3042 uint64_t id = reader->Read<uint64_t>(); | 3081 uint64_t id = reader->Read<uint64_t>(); |
3043 uint64_t origin_id = reader->Read<uint64_t>(); | 3082 uint64_t origin_id = reader->Read<uint64_t>(); |
3044 | 3083 |
3045 SendPort& result = SendPort::ZoneHandle(reader->zone(), | 3084 SendPort& result = SendPort::ZoneHandle(reader->zone()); |
3046 SendPort::New(id, origin_id)); | 3085 if (reader->snapshot_code()) { |
| 3086 // TODO(rmacnak): Reset fields in precompiled snapshots and assert |
| 3087 // this is unreachable. |
| 3088 } else { |
| 3089 result = SendPort::New(id, origin_id); |
| 3090 } |
3047 reader->AddBackRef(object_id, &result, kIsDeserialized); | 3091 reader->AddBackRef(object_id, &result, kIsDeserialized); |
3048 return result.raw(); | 3092 return result.raw(); |
3049 } | 3093 } |
3050 | 3094 |
3051 | 3095 |
3052 void RawSendPort::WriteTo(SnapshotWriter* writer, | 3096 void RawSendPort::WriteTo(SnapshotWriter* writer, |
3053 intptr_t object_id, | 3097 intptr_t object_id, |
3054 Snapshot::Kind kind) { | 3098 Snapshot::Kind kind) { |
3055 // Write out the serialization header value for this object. | 3099 // Write out the serialization header value for this object. |
3056 writer->WriteInlinedObjectHeader(object_id); | 3100 writer->WriteInlinedObjectHeader(object_id); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3253 // We do not allow objects with native fields in an isolate message. | 3297 // We do not allow objects with native fields in an isolate message. |
3254 writer->SetWriteException(Exceptions::kArgument, | 3298 writer->SetWriteException(Exceptions::kArgument, |
3255 "Illegal argument in isolate message" | 3299 "Illegal argument in isolate message" |
3256 " : (object is a UserTag)"); | 3300 " : (object is a UserTag)"); |
3257 } else { | 3301 } else { |
3258 UNREACHABLE(); | 3302 UNREACHABLE(); |
3259 } | 3303 } |
3260 } | 3304 } |
3261 | 3305 |
3262 } // namespace dart | 3306 } // namespace dart |
OLD | NEW |