| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 ReadObject(space_number, dest_space, current); \ | 776 ReadObject(space_number, dest_space, current); \ |
| 777 emit_write_barrier = (space_number == NEW_SPACE && \ | 777 emit_write_barrier = (space_number == NEW_SPACE && \ |
| 778 source_space != NEW_SPACE && \ | 778 source_space != NEW_SPACE && \ |
| 779 source_space != CELL_SPACE); \ | 779 source_space != CELL_SPACE); \ |
| 780 } else { \ | 780 } else { \ |
| 781 Object* new_object = NULL; /* May not be a real Object pointer. */ \ | 781 Object* new_object = NULL; /* May not be a real Object pointer. */ \ |
| 782 if (where == kNewObject) { \ | 782 if (where == kNewObject) { \ |
| 783 ASSIGN_DEST_SPACE(space_number) \ | 783 ASSIGN_DEST_SPACE(space_number) \ |
| 784 ReadObject(space_number, dest_space, &new_object); \ | 784 ReadObject(space_number, dest_space, &new_object); \ |
| 785 } else if (where == kRootArray) { \ | 785 } else if (where == kRootArray) { \ |
| 786 if (source_space != CELL_SPACE && \ |
| 787 source_space != CODE_SPACE && \ |
| 788 source_space != OLD_DATA_SPACE) { \ |
| 789 emit_write_barrier = true; \ |
| 790 } \ |
| 786 int root_id = source_->GetInt(); \ | 791 int root_id = source_->GetInt(); \ |
| 787 new_object = isolate->heap()->roots_array_start()[root_id]; \ | 792 new_object = isolate->heap()->roots_array_start()[root_id]; \ |
| 788 } else if (where == kPartialSnapshotCache) { \ | 793 } else if (where == kPartialSnapshotCache) { \ |
| 794 if (source_space != CELL_SPACE && \ |
| 795 source_space != CODE_SPACE && \ |
| 796 source_space != OLD_DATA_SPACE) { \ |
| 797 emit_write_barrier = true; \ |
| 798 } \ |
| 789 int cache_index = source_->GetInt(); \ | 799 int cache_index = source_->GetInt(); \ |
| 790 new_object = isolate->serialize_partial_snapshot_cache() \ | 800 new_object = isolate->serialize_partial_snapshot_cache() \ |
| 791 [cache_index]; \ | 801 [cache_index]; \ |
| 792 } else if (where == kExternalReference) { \ | 802 } else if (where == kExternalReference) { \ |
| 793 int reference_id = source_->GetInt(); \ | 803 int reference_id = source_->GetInt(); \ |
| 794 Address address = external_reference_decoder_-> \ | 804 Address address = external_reference_decoder_-> \ |
| 795 Decode(reference_id); \ | 805 Decode(reference_id); \ |
| 796 new_object = reinterpret_cast<Object*>(address); \ | 806 new_object = reinterpret_cast<Object*>(address); \ |
| 797 } else if (where == kBackref) { \ | 807 } else if (where == kBackref) { \ |
| 798 emit_write_barrier = (space_number == NEW_SPACE && \ | 808 emit_write_barrier = (space_number == NEW_SPACE && \ |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 int size = source_->GetInt(); | 923 int size = source_->GetInt(); |
| 914 byte* raw_data_out = reinterpret_cast<byte*>(current); | 924 byte* raw_data_out = reinterpret_cast<byte*>(current); |
| 915 source_->CopyRaw(raw_data_out, size); | 925 source_->CopyRaw(raw_data_out, size); |
| 916 current = reinterpret_cast<Object**>(raw_data_out + size); | 926 current = reinterpret_cast<Object**>(raw_data_out + size); |
| 917 break; | 927 break; |
| 918 } | 928 } |
| 919 | 929 |
| 920 SIXTEEN_CASES(kRootArrayLowConstants) | 930 SIXTEEN_CASES(kRootArrayLowConstants) |
| 921 SIXTEEN_CASES(kRootArrayHighConstants) { | 931 SIXTEEN_CASES(kRootArrayHighConstants) { |
| 922 int root_id = RootArrayConstantFromByteCode(data); | 932 int root_id = RootArrayConstantFromByteCode(data); |
| 923 *current++ = isolate->heap()->roots_array_start()[root_id]; | 933 Object* object = isolate->heap()->roots_array_start()[root_id]; |
| 934 ASSERT(!isolate->heap()->InNewSpace(object)); |
| 935 *current++ = object; |
| 924 break; | 936 break; |
| 925 } | 937 } |
| 926 | 938 |
| 927 case kRepeat: { | 939 case kRepeat: { |
| 928 int repeats = source_->GetInt(); | 940 int repeats = source_->GetInt(); |
| 929 Object* object = current[-1]; | 941 Object* object = current[-1]; |
| 942 ASSERT(!isolate->heap()->InNewSpace(object)); |
| 930 for (int i = 0; i < repeats; i++) current[i] = object; | 943 for (int i = 0; i < repeats; i++) current[i] = object; |
| 931 current += repeats; | 944 current += repeats; |
| 932 break; | 945 break; |
| 933 } | 946 } |
| 934 | 947 |
| 948 STATIC_ASSERT(kRootArrayNumberOfConstantEncodings == |
| 949 Heap::kOldSpaceRoots); |
| 935 STATIC_ASSERT(kMaxRepeats == 12); | 950 STATIC_ASSERT(kMaxRepeats == 12); |
| 936 FOUR_CASES(kConstantRepeat) | 951 FOUR_CASES(kConstantRepeat) |
| 937 FOUR_CASES(kConstantRepeat + 4) | 952 FOUR_CASES(kConstantRepeat + 4) |
| 938 FOUR_CASES(kConstantRepeat + 8) { | 953 FOUR_CASES(kConstantRepeat + 8) { |
| 939 int repeats = RepeatsForCode(data); | 954 int repeats = RepeatsForCode(data); |
| 940 Object* object = current[-1]; | 955 Object* object = current[-1]; |
| 956 ASSERT(!isolate->heap()->InNewSpace(object)); |
| 941 for (int i = 0; i < repeats; i++) current[i] = object; | 957 for (int i = 0; i < repeats; i++) current[i] = object; |
| 942 current += repeats; | 958 current += repeats; |
| 943 break; | 959 break; |
| 944 } | 960 } |
| 945 | 961 |
| 946 // Deserialize a new object and write a pointer to it to the current | 962 // Deserialize a new object and write a pointer to it to the current |
| 947 // object. | 963 // object. |
| 948 ONE_PER_SPACE(kNewObject, kPlain, kStartOfObject) | 964 ONE_PER_SPACE(kNewObject, kPlain, kStartOfObject) |
| 949 // Support for direct instruction pointers in functions | 965 // Support for direct instruction pointers in functions |
| 950 ONE_PER_CODE_SPACE(kNewObject, kPlain, kFirstInstruction) | 966 ONE_PER_CODE_SPACE(kNewObject, kPlain, kFirstInstruction) |
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1418 | 1434 |
| 1419 | 1435 |
| 1420 void Serializer::ObjectSerializer::VisitPointers(Object** start, | 1436 void Serializer::ObjectSerializer::VisitPointers(Object** start, |
| 1421 Object** end) { | 1437 Object** end) { |
| 1422 Object** current = start; | 1438 Object** current = start; |
| 1423 while (current < end) { | 1439 while (current < end) { |
| 1424 while (current < end && (*current)->IsSmi()) current++; | 1440 while (current < end && (*current)->IsSmi()) current++; |
| 1425 if (current < end) OutputRawData(reinterpret_cast<Address>(current)); | 1441 if (current < end) OutputRawData(reinterpret_cast<Address>(current)); |
| 1426 | 1442 |
| 1427 while (current < end && !(*current)->IsSmi()) { | 1443 while (current < end && !(*current)->IsSmi()) { |
| 1444 HeapObject* current_contents = HeapObject::cast(*current); |
| 1445 int root_index = serializer_->RootIndex(current_contents); |
| 1446 // Repeats are not subject to the write barrier so there are only some |
| 1447 // objects that can be used in a repeat encoding. These are the early |
| 1448 // ones in the root array that are never in new space. |
| 1428 if (current != start && | 1449 if (current != start && |
| 1429 current[0] == current[-1] && | 1450 root_index != kInvalidRootIndex && |
| 1430 !HEAP->InNewSpace(*current)) { | 1451 root_index < kRootArrayNumberOfConstantEncodings && |
| 1452 current_contents == current[-1]) { |
| 1453 ASSERT(!HEAP->InNewSpace(current_contents)); |
| 1431 int repeat_count = 1; | 1454 int repeat_count = 1; |
| 1432 while (current < end - 1 && current[repeat_count] == current[0]) { | 1455 while (current < end - 1 && current[repeat_count] == current_contents) { |
| 1433 repeat_count++; | 1456 repeat_count++; |
| 1434 } | 1457 } |
| 1435 current += repeat_count; | 1458 current += repeat_count; |
| 1436 bytes_processed_so_far_ += repeat_count * kPointerSize; | 1459 bytes_processed_so_far_ += repeat_count * kPointerSize; |
| 1437 if (repeat_count > kMaxRepeats) { | 1460 if (repeat_count > kMaxRepeats) { |
| 1438 sink_->Put(kRepeat, "SerializeRepeats"); | 1461 sink_->Put(kRepeat, "SerializeRepeats"); |
| 1439 sink_->PutInt(repeat_count, "SerializeRepeats"); | 1462 sink_->PutInt(repeat_count, "SerializeRepeats"); |
| 1440 } else { | 1463 } else { |
| 1441 sink_->Put(CodeForRepeats(repeat_count), "SerializeRepeats"); | 1464 sink_->Put(CodeForRepeats(repeat_count), "SerializeRepeats"); |
| 1442 } | 1465 } |
| 1443 } else { | 1466 } else { |
| 1444 serializer_->SerializeObject(*current, kPlain, kStartOfObject); | 1467 serializer_->SerializeObject(current_contents, kPlain, kStartOfObject); |
| 1445 bytes_processed_so_far_ += kPointerSize; | 1468 bytes_processed_so_far_ += kPointerSize; |
| 1446 current++; | 1469 current++; |
| 1447 } | 1470 } |
| 1448 } | 1471 } |
| 1449 } | 1472 } |
| 1450 } | 1473 } |
| 1451 | 1474 |
| 1452 | 1475 |
| 1453 void Serializer::ObjectSerializer::VisitExternalReferences(Address* start, | 1476 void Serializer::ObjectSerializer::VisitExternalReferences(Address* start, |
| 1454 Address* end) { | 1477 Address* end) { |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1621 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); | 1644 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); |
| 1622 } | 1645 } |
| 1623 } | 1646 } |
| 1624 int allocation_address = fullness_[space]; | 1647 int allocation_address = fullness_[space]; |
| 1625 fullness_[space] = allocation_address + size; | 1648 fullness_[space] = allocation_address + size; |
| 1626 return allocation_address; | 1649 return allocation_address; |
| 1627 } | 1650 } |
| 1628 | 1651 |
| 1629 | 1652 |
| 1630 } } // namespace v8::internal | 1653 } } // namespace v8::internal |
| OLD | NEW |