Chromium Code Reviews| 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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 133 reference.large_object_index() < seen_large_objects_index_; | 133 reference.large_object_index() < seen_large_objects_index_; |
| 134 } else if (chunk_index == completed_chunks_[space].length()) { | 134 } else if (chunk_index == completed_chunks_[space].length()) { |
| 135 return reference.chunk_offset() < pending_chunk_[space]; | 135 return reference.chunk_offset() < pending_chunk_[space]; |
| 136 } else { | 136 } else { |
| 137 return chunk_index < completed_chunks_[space].length() && | 137 return chunk_index < completed_chunks_[space].length() && |
| 138 reference.chunk_offset() < completed_chunks_[space][chunk_index]; | 138 reference.chunk_offset() < completed_chunks_[space][chunk_index]; |
| 139 } | 139 } |
| 140 } | 140 } |
| 141 #endif // DEBUG | 141 #endif // DEBUG |
| 142 | 142 |
| 143 bool Serializer::SerializeKnownObject(HeapObject* obj, HowToCode how_to_code, | 143 bool Serializer::SerializeHotObject(HeapObject* obj, HowToCode how_to_code, |
| 144 WhereToPoint where_to_point, int skip) { | 144 WhereToPoint where_to_point, int skip) { |
| 145 if (how_to_code == kPlain && where_to_point == kStartOfObject) { | 145 if (how_to_code == kPlain && where_to_point == kStartOfObject) { |
|
vogelheim
2016/06/23 13:39:14
[Feel free to ignore, since this is not even about
Yang
2016/06/24 06:00:58
Done.
| |
| 146 // Encode a reference to a hot object by its index in the working set. | 146 // Encode a reference to a hot object by its index in the working set. |
| 147 int index = hot_objects_.Find(obj); | 147 int index = hot_objects_.Find(obj); |
| 148 if (index != HotObjectsList::kNotFound) { | 148 if (index != HotObjectsList::kNotFound) { |
| 149 DCHECK(index >= 0 && index < kNumberOfHotObjects); | 149 DCHECK(index >= 0 && index < kNumberOfHotObjects); |
| 150 if (FLAG_trace_serializer) { | 150 if (FLAG_trace_serializer) { |
| 151 PrintF(" Encoding hot object %d:", index); | 151 PrintF(" Encoding hot object %d:", index); |
| 152 obj->ShortPrint(); | 152 obj->ShortPrint(); |
| 153 PrintF("\n"); | 153 PrintF("\n"); |
| 154 } | 154 } |
| 155 if (skip != 0) { | 155 if (skip != 0) { |
| 156 sink_.Put(kHotObjectWithSkip + index, "HotObjectWithSkip"); | 156 sink_.Put(kHotObjectWithSkip + index, "HotObjectWithSkip"); |
| 157 sink_.PutInt(skip, "HotObjectSkipDistance"); | 157 sink_.PutInt(skip, "HotObjectSkipDistance"); |
| 158 } else { | 158 } else { |
| 159 sink_.Put(kHotObject + index, "HotObject"); | 159 sink_.Put(kHotObject + index, "HotObject"); |
| 160 } | 160 } |
| 161 return true; | 161 return true; |
| 162 } | 162 } |
| 163 } | 163 } |
| 164 return false; | |
| 165 } | |
| 166 | |
| 167 bool Serializer::SerializeBackReference(HeapObject* obj, HowToCode how_to_code, | |
| 168 WhereToPoint where_to_point, int skip) { | |
| 164 SerializerReference reference = reference_map_.Lookup(obj); | 169 SerializerReference reference = reference_map_.Lookup(obj); |
| 165 if (reference.is_valid()) { | 170 if (reference.is_valid()) { |
| 166 // Encode the location of an already deserialized object in order to write | 171 // Encode the location of an already deserialized object in order to write |
| 167 // its location into a later object. We can encode the location as an | 172 // its location into a later object. We can encode the location as an |
| 168 // offset fromthe start of the deserialized objects or as an offset | 173 // offset fromthe start of the deserialized objects or as an offset |
| 169 // backwards from thecurrent allocation pointer. | 174 // backwards from thecurrent allocation pointer. |
| 170 if (reference.is_attached_reference()) { | 175 if (reference.is_attached_reference()) { |
| 171 FlushSkip(skip); | 176 FlushSkip(skip); |
| 172 if (FLAG_trace_serializer) { | 177 if (FLAG_trace_serializer) { |
| 173 PrintF(" Encoding attached reference %d\n", | 178 PrintF(" Encoding attached reference %d\n", |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 214 if (skip == 0) { | 219 if (skip == 0) { |
| 215 sink_.Put(kRootArrayConstants + root_index, "RootConstant"); | 220 sink_.Put(kRootArrayConstants + root_index, "RootConstant"); |
| 216 } else { | 221 } else { |
| 217 sink_.Put(kRootArrayConstantsWithSkip + root_index, "RootConstant"); | 222 sink_.Put(kRootArrayConstantsWithSkip + root_index, "RootConstant"); |
| 218 sink_.PutInt(skip, "SkipInPutRoot"); | 223 sink_.PutInt(skip, "SkipInPutRoot"); |
| 219 } | 224 } |
| 220 } else { | 225 } else { |
| 221 FlushSkip(skip); | 226 FlushSkip(skip); |
| 222 sink_.Put(kRootArray + how_to_code + where_to_point, "RootSerialization"); | 227 sink_.Put(kRootArray + how_to_code + where_to_point, "RootSerialization"); |
| 223 sink_.PutInt(root_index, "root_index"); | 228 sink_.PutInt(root_index, "root_index"); |
| 229 hot_objects_.Add(object); | |
| 224 } | 230 } |
| 225 } | 231 } |
| 226 | 232 |
| 227 void Serializer::PutSmi(Smi* smi) { | 233 void Serializer::PutSmi(Smi* smi) { |
| 228 sink_.Put(kOnePointerRawData, "Smi"); | 234 sink_.Put(kOnePointerRawData, "Smi"); |
| 229 byte* bytes = reinterpret_cast<byte*>(&smi); | 235 byte* bytes = reinterpret_cast<byte*>(&smi); |
| 230 for (int i = 0; i < kPointerSize; i++) sink_.Put(bytes[i], "Byte"); | 236 for (int i = 0; i < kPointerSize; i++) sink_.Put(bytes[i], "Byte"); |
| 231 } | 237 } |
| 232 | 238 |
| 233 void Serializer::PutBackReference(HeapObject* object, | 239 void Serializer::PutBackReference(HeapObject* object, |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 774 if (to_skip != 0 && return_skip == kIgnoringReturn) { | 780 if (to_skip != 0 && return_skip == kIgnoringReturn) { |
| 775 sink_->Put(kSkip, "Skip"); | 781 sink_->Put(kSkip, "Skip"); |
| 776 sink_->PutInt(to_skip, "SkipDistance"); | 782 sink_->PutInt(to_skip, "SkipDistance"); |
| 777 to_skip = 0; | 783 to_skip = 0; |
| 778 } | 784 } |
| 779 return to_skip; | 785 return to_skip; |
| 780 } | 786 } |
| 781 | 787 |
| 782 } // namespace internal | 788 } // namespace internal |
| 783 } // namespace v8 | 789 } // namespace v8 |
| OLD | NEW |