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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 // Check that no dependent maps have been added or added dependent maps have | 207 // Check that no dependent maps have been added or added dependent maps have |
208 // been rolled back or committed. | 208 // been rolled back or committed. |
209 for (int i = 0; i < DependentCode::kGroupCount; i++) { | 209 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
210 DCHECK_EQ(NULL, dependencies_[i]); | 210 DCHECK_EQ(NULL, dependencies_[i]); |
211 } | 211 } |
212 #endif // DEBUG | 212 #endif // DEBUG |
213 } | 213 } |
214 | 214 |
215 | 215 |
216 void CompilationInfo::CommitDependencies(Handle<Code> code) { | 216 void CompilationInfo::CommitDependencies(Handle<Code> code) { |
| 217 bool has_dependencies = false; |
| 218 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
| 219 has_dependencies |= |
| 220 dependencies_[i] != NULL && dependencies_[i]->length() > 0; |
| 221 } |
| 222 // Avoid creating a weak cell for code with no dependencies. |
| 223 if (!has_dependencies) return; |
| 224 |
| 225 AllowDeferredHandleDereference get_object_wrapper; |
| 226 Handle<WeakCell> cell = Code::WeakCellFor(code); |
217 for (int i = 0; i < DependentCode::kGroupCount; i++) { | 227 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
218 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; | 228 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; |
219 if (group_objects == NULL) continue; | 229 if (group_objects == NULL) continue; |
220 DCHECK(!object_wrapper_.is_null()); | 230 DCHECK(!object_wrapper_.is_null()); |
221 for (int j = 0; j < group_objects->length(); j++) { | 231 for (int j = 0; j < group_objects->length(); j++) { |
222 DependentCode::DependencyGroup group = | 232 DependentCode::DependencyGroup group = |
223 static_cast<DependentCode::DependencyGroup>(i); | 233 static_cast<DependentCode::DependencyGroup>(i); |
224 DependentCode* dependent_code = | 234 DependentCode* dependent_code = |
225 DependentCode::ForObject(group_objects->at(j), group); | 235 DependentCode::ForObject(group_objects->at(j), group); |
226 dependent_code->UpdateToFinishedCode(group, this, *code); | 236 dependent_code->UpdateToFinishedCode(group, *object_wrapper(), *cell); |
227 } | 237 } |
228 dependencies_[i] = NULL; // Zone-allocated, no need to delete. | 238 dependencies_[i] = NULL; // Zone-allocated, no need to delete. |
229 } | 239 } |
230 } | 240 } |
231 | 241 |
232 | 242 |
233 void CompilationInfo::RollbackDependencies() { | 243 void CompilationInfo::RollbackDependencies() { |
| 244 AllowDeferredHandleDereference get_object_wrapper; |
234 // Unregister from all dependent maps if not yet committed. | 245 // Unregister from all dependent maps if not yet committed. |
235 for (int i = 0; i < DependentCode::kGroupCount; i++) { | 246 for (int i = 0; i < DependentCode::kGroupCount; i++) { |
236 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; | 247 ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; |
237 if (group_objects == NULL) continue; | 248 if (group_objects == NULL) continue; |
238 for (int j = 0; j < group_objects->length(); j++) { | 249 for (int j = 0; j < group_objects->length(); j++) { |
239 DependentCode::DependencyGroup group = | 250 DependentCode::DependencyGroup group = |
240 static_cast<DependentCode::DependencyGroup>(i); | 251 static_cast<DependentCode::DependencyGroup>(i); |
241 DependentCode* dependent_code = | 252 DependentCode* dependent_code = |
242 DependentCode::ForObject(group_objects->at(j), group); | 253 DependentCode::ForObject(group_objects->at(j), group); |
243 dependent_code->RemoveCompilationInfo(group, this); | 254 dependent_code->RemoveCompilationInfo(group, *object_wrapper()); |
244 } | 255 } |
245 dependencies_[i] = NULL; // Zone-allocated, no need to delete. | 256 dependencies_[i] = NULL; // Zone-allocated, no need to delete. |
246 } | 257 } |
247 } | 258 } |
248 | 259 |
249 | 260 |
250 int CompilationInfo::num_parameters() const { | 261 int CompilationInfo::num_parameters() const { |
251 if (IsStub()) { | 262 if (IsStub()) { |
252 DCHECK(parameter_count_ > 0); | 263 DCHECK(parameter_count_ > 0); |
253 return parameter_count_; | 264 return parameter_count_; |
(...skipping 1329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1583 AllowHandleDereference allow_deref; | 1594 AllowHandleDereference allow_deref; |
1584 bool tracing_on = info()->IsStub() | 1595 bool tracing_on = info()->IsStub() |
1585 ? FLAG_trace_hydrogen_stubs | 1596 ? FLAG_trace_hydrogen_stubs |
1586 : (FLAG_trace_hydrogen && | 1597 : (FLAG_trace_hydrogen && |
1587 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); | 1598 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); |
1588 return (tracing_on && | 1599 return (tracing_on && |
1589 base::OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); | 1600 base::OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); |
1590 } | 1601 } |
1591 | 1602 |
1592 } } // namespace v8::internal | 1603 } } // namespace v8::internal |
OLD | NEW |