OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/snapshot/serializer.h" | 5 #include "src/snapshot/serializer.h" |
6 | 6 |
7 #include "src/macro-assembler.h" | 7 #include "src/macro-assembler.h" |
8 #include "src/snapshot/natives.h" | 8 #include "src/snapshot/natives.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
89 | 89 |
90 void Serializer::SerializeDeferredObjects() { | 90 void Serializer::SerializeDeferredObjects() { |
91 while (deferred_objects_.length() > 0) { | 91 while (deferred_objects_.length() > 0) { |
92 HeapObject* obj = deferred_objects_.RemoveLast(); | 92 HeapObject* obj = deferred_objects_.RemoveLast(); |
93 ObjectSerializer obj_serializer(this, obj, sink_, kPlain, kStartOfObject); | 93 ObjectSerializer obj_serializer(this, obj, sink_, kPlain, kStartOfObject); |
94 obj_serializer.SerializeDeferred(); | 94 obj_serializer.SerializeDeferred(); |
95 } | 95 } |
96 sink_->Put(kSynchronize, "Finished with deferred objects"); | 96 sink_->Put(kSynchronize, "Finished with deferred objects"); |
97 } | 97 } |
98 | 98 |
99 bool Serializer::ShouldBeSkipped(Object** current) { | |
100 Object** roots = isolate()->heap()->roots_array_start(); | |
Michael Starzinger
2016/03/17 12:27:29
Woot! I love this, this was one of the last remain
| |
101 return current == &roots[Heap::kStoreBufferTopRootIndex] || | |
102 current == &roots[Heap::kStackLimitRootIndex] || | |
103 current == &roots[Heap::kRealStackLimitRootIndex]; | |
104 } | |
105 | |
106 void Serializer::VisitPointers(Object** start, Object** end) { | 99 void Serializer::VisitPointers(Object** start, Object** end) { |
107 for (Object** current = start; current < end; current++) { | 100 for (Object** current = start; current < end; current++) { |
108 if ((*current)->IsSmi()) { | 101 if ((*current)->IsSmi()) { |
109 sink_->Put(kOnePointerRawData, "Smi"); | 102 PutSmi(Smi::cast(*current)); |
110 for (int i = 0; i < kPointerSize; i++) { | |
111 sink_->Put(reinterpret_cast<byte*>(current)[i], "Byte"); | |
112 } | |
113 } else { | 103 } else { |
114 SerializeObject(HeapObject::cast(*current), kPlain, kStartOfObject, 0); | 104 SerializeObject(HeapObject::cast(*current), kPlain, kStartOfObject, 0); |
115 } | 105 } |
116 } | 106 } |
117 } | 107 } |
118 | 108 |
119 void Serializer::EncodeReservations( | 109 void Serializer::EncodeReservations( |
120 List<SerializedData::Reservation>* out) const { | 110 List<SerializedData::Reservation>* out) const { |
121 for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) { | 111 for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) { |
122 for (int j = 0; j < completed_chunks_[i].length(); j++) { | 112 for (int j = 0; j < completed_chunks_[i].length(); j++) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
233 sink_->Put(kRootArrayConstantsWithSkip + root_index, "RootConstant"); | 223 sink_->Put(kRootArrayConstantsWithSkip + root_index, "RootConstant"); |
234 sink_->PutInt(skip, "SkipInPutRoot"); | 224 sink_->PutInt(skip, "SkipInPutRoot"); |
235 } | 225 } |
236 } else { | 226 } else { |
237 FlushSkip(skip); | 227 FlushSkip(skip); |
238 sink_->Put(kRootArray + how_to_code + where_to_point, "RootSerialization"); | 228 sink_->Put(kRootArray + how_to_code + where_to_point, "RootSerialization"); |
239 sink_->PutInt(root_index, "root_index"); | 229 sink_->PutInt(root_index, "root_index"); |
240 } | 230 } |
241 } | 231 } |
242 | 232 |
233 void Serializer::PutSmi(Smi* smi) { | |
234 sink_->Put(kOnePointerRawData, "Smi"); | |
235 byte* bytes = reinterpret_cast<byte*>(&smi); | |
236 for (int i = 0; i < kPointerSize; i++) sink_->Put(bytes[i], "Byte"); | |
237 } | |
238 | |
243 void Serializer::PutBackReference(HeapObject* object, BackReference reference) { | 239 void Serializer::PutBackReference(HeapObject* object, BackReference reference) { |
244 DCHECK(BackReferenceIsAlreadyAllocated(reference)); | 240 DCHECK(BackReferenceIsAlreadyAllocated(reference)); |
245 sink_->PutInt(reference.reference(), "BackRefValue"); | 241 sink_->PutInt(reference.reference(), "BackRefValue"); |
246 hot_objects_.Add(object); | 242 hot_objects_.Add(object); |
247 } | 243 } |
248 | 244 |
249 int Serializer::PutAlignmentPrefix(HeapObject* object) { | 245 int Serializer::PutAlignmentPrefix(HeapObject* object) { |
250 AllocationAlignment alignment = object->RequiredAlignment(); | 246 AllocationAlignment alignment = object->RequiredAlignment(); |
251 if (alignment != kWordAligned) { | 247 if (alignment != kWordAligned) { |
252 DCHECK(1 <= alignment && alignment <= 3); | 248 DCHECK(1 <= alignment && alignment <= 3); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 code_address_map_ = new CodeAddressMap(isolate_); | 297 code_address_map_ = new CodeAddressMap(isolate_); |
302 } | 298 } |
303 | 299 |
304 Code* Serializer::CopyCode(Code* code) { | 300 Code* Serializer::CopyCode(Code* code) { |
305 code_buffer_.Rewind(0); // Clear buffer without deleting backing store. | 301 code_buffer_.Rewind(0); // Clear buffer without deleting backing store. |
306 int size = code->CodeSize(); | 302 int size = code->CodeSize(); |
307 code_buffer_.AddAll(Vector<byte>(code->address(), size)); | 303 code_buffer_.AddAll(Vector<byte>(code->address(), size)); |
308 return Code::cast(HeapObject::FromAddress(&code_buffer_.first())); | 304 return Code::cast(HeapObject::FromAddress(&code_buffer_.first())); |
309 } | 305 } |
310 | 306 |
307 bool Serializer::HasNotExceededFirstPageOfEachSpace() { | |
308 for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) { | |
309 if (!completed_chunks_[i].is_empty()) return false; | |
310 } | |
311 return true; | |
312 } | |
313 | |
311 void Serializer::ObjectSerializer::SerializePrologue(AllocationSpace space, | 314 void Serializer::ObjectSerializer::SerializePrologue(AllocationSpace space, |
312 int size, Map* map) { | 315 int size, Map* map) { |
313 if (serializer_->code_address_map_) { | 316 if (serializer_->code_address_map_) { |
314 const char* code_name = | 317 const char* code_name = |
315 serializer_->code_address_map_->Lookup(object_->address()); | 318 serializer_->code_address_map_->Lookup(object_->address()); |
316 LOG(serializer_->isolate_, | 319 LOG(serializer_->isolate_, |
317 CodeNameEvent(object_->address(), sink_->Position(), code_name)); | 320 CodeNameEvent(object_->address(), sink_->Position(), code_name)); |
318 LOG(serializer_->isolate_, | 321 LOG(serializer_->isolate_, |
319 SnapshotPositionEvent(object_, sink_->Position())); | 322 SnapshotPositionEvent(object_, sink_->Position())); |
320 } | 323 } |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
760 if (to_skip != 0 && return_skip == kIgnoringReturn) { | 763 if (to_skip != 0 && return_skip == kIgnoringReturn) { |
761 sink_->Put(kSkip, "Skip"); | 764 sink_->Put(kSkip, "Skip"); |
762 sink_->PutInt(to_skip, "SkipDistance"); | 765 sink_->PutInt(to_skip, "SkipDistance"); |
763 to_skip = 0; | 766 to_skip = 0; |
764 } | 767 } |
765 return to_skip; | 768 return to_skip; |
766 } | 769 } |
767 | 770 |
768 } // namespace internal | 771 } // namespace internal |
769 } // namespace v8 | 772 } // namespace v8 |
OLD | NEW |