OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 | 8 |
9 #include "src/ast-numbering.h" | 9 #include "src/ast-numbering.h" |
10 #include "src/ast-this-access-visitor.h" | 10 #include "src/ast-this-access-visitor.h" |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 // Check that no dependent maps have been added or added dependent maps have | 214 // Check that no dependent maps have been added or added dependent maps have |
215 // been rolled back or committed. | 215 // been rolled back or committed. |
216 for (int i = 0; i < DependentCode::kGroupCount; i++) { | 216 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
217 DCHECK(!dependencies_[i]); | 217 DCHECK(!dependencies_[i]); |
218 } | 218 } |
219 #endif // DEBUG | 219 #endif // DEBUG |
220 } | 220 } |
221 | 221 |
222 | 222 |
223 void CompilationInfo::CommitDependencies(Handle<Code> code) { | 223 void CompilationInfo::CommitDependencies(Handle<Code> code) { |
| 224 bool has_dependencies = false; |
| 225 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
| 226 has_dependencies |= |
| 227 dependencies_[i] != NULL && dependencies_[i]->length() > 0; |
| 228 } |
| 229 // Avoid creating a weak cell for code with no dependencies. |
| 230 if (!has_dependencies) return; |
| 231 |
| 232 AllowDeferredHandleDereference get_object_wrapper; |
| 233 Handle<WeakCell> cell = Code::WeakCellFor(code); |
224 for (int i = 0; i < DependentCode::kGroupCount; i++) { | 234 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
225 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; | 235 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; |
226 if (group_objects == NULL) continue; | 236 if (group_objects == NULL) continue; |
227 DCHECK(!object_wrapper_.is_null()); | 237 DCHECK(!object_wrapper_.is_null()); |
228 for (int j = 0; j < group_objects->length(); j++) { | 238 for (int j = 0; j < group_objects->length(); j++) { |
229 DependentCode::DependencyGroup group = | 239 DependentCode::DependencyGroup group = |
230 static_cast<DependentCode::DependencyGroup>(i); | 240 static_cast<DependentCode::DependencyGroup>(i); |
231 DependentCode* dependent_code = | 241 DependentCode* dependent_code = |
232 DependentCode::ForObject(group_objects->at(j), group); | 242 DependentCode::ForObject(group_objects->at(j), group); |
233 dependent_code->UpdateToFinishedCode(group, this, *code); | 243 dependent_code->UpdateToFinishedCode(group, *object_wrapper(), *cell); |
234 } | 244 } |
235 dependencies_[i] = NULL; // Zone-allocated, no need to delete. | 245 dependencies_[i] = NULL; // Zone-allocated, no need to delete. |
236 } | 246 } |
237 } | 247 } |
238 | 248 |
239 | 249 |
240 void CompilationInfo::RollbackDependencies() { | 250 void CompilationInfo::RollbackDependencies() { |
| 251 AllowDeferredHandleDereference get_object_wrapper; |
241 // Unregister from all dependent maps if not yet committed. | 252 // Unregister from all dependent maps if not yet committed. |
242 for (int i = 0; i < DependentCode::kGroupCount; i++) { | 253 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
243 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; | 254 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; |
244 if (group_objects == NULL) continue; | 255 if (group_objects == NULL) continue; |
245 for (int j = 0; j < group_objects->length(); j++) { | 256 for (int j = 0; j < group_objects->length(); j++) { |
246 DependentCode::DependencyGroup group = | 257 DependentCode::DependencyGroup group = |
247 static_cast<DependentCode::DependencyGroup>(i); | 258 static_cast<DependentCode::DependencyGroup>(i); |
248 DependentCode* dependent_code = | 259 DependentCode* dependent_code = |
249 DependentCode::ForObject(group_objects->at(j), group); | 260 DependentCode::ForObject(group_objects->at(j), group); |
250 dependent_code->RemoveCompilationInfo(group, this); | 261 dependent_code->RemoveCompilationInfo(group, *object_wrapper()); |
251 } | 262 } |
252 dependencies_[i] = NULL; // Zone-allocated, no need to delete. | 263 dependencies_[i] = NULL; // Zone-allocated, no need to delete. |
253 } | 264 } |
254 } | 265 } |
255 | 266 |
256 | 267 |
257 int CompilationInfo::num_parameters() const { | 268 int CompilationInfo::num_parameters() const { |
258 if (IsStub()) { | 269 if (IsStub()) { |
259 DCHECK(parameter_count_ > 0); | 270 DCHECK(parameter_count_ > 0); |
260 return parameter_count_; | 271 return parameter_count_; |
(...skipping 1324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1585 } | 1596 } |
1586 | 1597 |
1587 | 1598 |
1588 #if DEBUG | 1599 #if DEBUG |
1589 void CompilationInfo::PrintAstForTesting() { | 1600 void CompilationInfo::PrintAstForTesting() { |
1590 PrintF("--- Source from AST ---\n%s\n", | 1601 PrintF("--- Source from AST ---\n%s\n", |
1591 PrettyPrinter(isolate(), zone()).PrintProgram(function())); | 1602 PrettyPrinter(isolate(), zone()).PrintProgram(function())); |
1592 } | 1603 } |
1593 #endif | 1604 #endif |
1594 } } // namespace v8::internal | 1605 } } // namespace v8::internal |
OLD | NEW |