Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(516)

Side by Side Diff: src/snapshot/deserializer.cc

Issue 2801073006: Decouple root visitors from object visitors. (Closed)
Patch Set: rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/snapshot/deserializer.h ('k') | src/snapshot/partial-serializer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/deserializer.h" 5 #include "src/snapshot/deserializer.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/assembler-inl.h" 8 #include "src/assembler-inl.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/deoptimizer.h" 10 #include "src/deoptimizer.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 } 137 }
138 138
139 AddAttachedObject(global_proxy); 139 AddAttachedObject(global_proxy);
140 140
141 DisallowHeapAllocation no_gc; 141 DisallowHeapAllocation no_gc;
142 // Keep track of the code space start and end pointers in case new 142 // Keep track of the code space start and end pointers in case new
143 // code objects were unserialized 143 // code objects were unserialized
144 OldSpace* code_space = isolate_->heap()->code_space(); 144 OldSpace* code_space = isolate_->heap()->code_space();
145 Address start_address = code_space->top(); 145 Address start_address = code_space->top();
146 Object* root; 146 Object* root;
147 VisitPointer(&root); 147 VisitRootPointer(Root::kPartialSnapshotCache, &root);
148 DeserializeDeferredObjects(); 148 DeserializeDeferredObjects();
149 DeserializeEmbedderFields(embedder_fields_deserializer); 149 DeserializeEmbedderFields(embedder_fields_deserializer);
150 150
151 isolate->heap()->RegisterReservationsForBlackAllocation(reservations_); 151 isolate->heap()->RegisterReservationsForBlackAllocation(reservations_);
152 152
153 // There's no code deserialized here. If this assert fires then that's 153 // There's no code deserialized here. If this assert fires then that's
154 // changed and logging should be added to notify the profiler et al of the 154 // changed and logging should be added to notify the profiler et al of the
155 // new code, which also has to be flushed from instruction cache. 155 // new code, which also has to be flushed from instruction cache.
156 CHECK_EQ(start_address, code_space->top()); 156 CHECK_EQ(start_address, code_space->top());
157 return Handle<Object>(root, isolate); 157 return Handle<Object>(root, isolate);
158 } 158 }
159 159
160 MaybeHandle<HeapObject> Deserializer::DeserializeObject(Isolate* isolate) { 160 MaybeHandle<HeapObject> Deserializer::DeserializeObject(Isolate* isolate) {
161 Initialize(isolate); 161 Initialize(isolate);
162 if (!ReserveSpace()) { 162 if (!ReserveSpace()) {
163 return MaybeHandle<HeapObject>(); 163 return MaybeHandle<HeapObject>();
164 } else { 164 } else {
165 deserializing_user_code_ = true; 165 deserializing_user_code_ = true;
166 HandleScope scope(isolate); 166 HandleScope scope(isolate);
167 Handle<HeapObject> result; 167 Handle<HeapObject> result;
168 { 168 {
169 DisallowHeapAllocation no_gc; 169 DisallowHeapAllocation no_gc;
170 Object* root; 170 Object* root;
171 VisitPointer(&root); 171 VisitRootPointer(Root::kPartialSnapshotCache, &root);
172 DeserializeDeferredObjects(); 172 DeserializeDeferredObjects();
173 FlushICacheForNewCodeObjectsAndRecordEmbeddedObjects(); 173 FlushICacheForNewCodeObjectsAndRecordEmbeddedObjects();
174 result = Handle<HeapObject>(HeapObject::cast(root)); 174 result = Handle<HeapObject>(HeapObject::cast(root));
175 isolate->heap()->RegisterReservationsForBlackAllocation(reservations_); 175 isolate->heap()->RegisterReservationsForBlackAllocation(reservations_);
176 } 176 }
177 CommitPostProcessedObjects(isolate); 177 CommitPostProcessedObjects(isolate);
178 return scope.CloseAndEscape(result); 178 return scope.CloseAndEscape(result);
179 } 179 }
180 } 180 }
181 181
182 Deserializer::~Deserializer() { 182 Deserializer::~Deserializer() {
183 #ifdef DEBUG 183 #ifdef DEBUG
184 // Do not perform checks if we aborted deserialization. 184 // Do not perform checks if we aborted deserialization.
185 if (source_.position() == 0) return; 185 if (source_.position() == 0) return;
186 // Check that we only have padding bytes remaining. 186 // Check that we only have padding bytes remaining.
187 while (source_.HasMore()) CHECK_EQ(kNop, source_.Get()); 187 while (source_.HasMore()) CHECK_EQ(kNop, source_.Get());
188 for (int space = 0; space < kNumberOfPreallocatedSpaces; space++) { 188 for (int space = 0; space < kNumberOfPreallocatedSpaces; space++) {
189 int chunk_index = current_chunk_[space]; 189 int chunk_index = current_chunk_[space];
190 CHECK_EQ(reservations_[space].length(), chunk_index + 1); 190 CHECK_EQ(reservations_[space].length(), chunk_index + 1);
191 CHECK_EQ(reservations_[space][chunk_index].end, high_water_[space]); 191 CHECK_EQ(reservations_[space][chunk_index].end, high_water_[space]);
192 } 192 }
193 CHECK_EQ(allocated_maps_.length(), next_map_index_); 193 CHECK_EQ(allocated_maps_.length(), next_map_index_);
194 #endif // DEBUG 194 #endif // DEBUG
195 } 195 }
196 196
197 // This is called on the roots. It is the driver of the deserialization 197 // This is called on the roots. It is the driver of the deserialization
198 // process. It is also called on the body of each function. 198 // process. It is also called on the body of each function.
199 void Deserializer::VisitPointers(Object** start, Object** end) { 199 void Deserializer::VisitRootPointers(Root root, Object** start, Object** end) {
200 // The space must be new space. Any other space would cause ReadChunk to try 200 // The space must be new space. Any other space would cause ReadChunk to try
201 // to update the remembered using NULL as the address. 201 // to update the remembered using NULL as the address.
202 ReadData(start, end, NEW_SPACE, NULL); 202 ReadData(start, end, NEW_SPACE, NULL);
203 } 203 }
204 204
205 void Deserializer::Synchronize(VisitorSynchronization::SyncTag tag) { 205 void Deserializer::Synchronize(VisitorSynchronization::SyncTag tag) {
206 static const byte expected = kSynchronize; 206 static const byte expected = kSynchronize;
207 CHECK_EQ(expected, source_.Get()); 207 CHECK_EQ(expected, source_.Get());
208 } 208 }
209 209
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 910
911 default: 911 default:
912 CHECK(false); 912 CHECK(false);
913 } 913 }
914 } 914 }
915 CHECK_EQ(limit, current); 915 CHECK_EQ(limit, current);
916 return true; 916 return true;
917 } 917 }
918 } // namespace internal 918 } // namespace internal
919 } // namespace v8 919 } // namespace v8
OLDNEW
« no previous file with comments | « src/snapshot/deserializer.h ('k') | src/snapshot/partial-serializer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698