Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/gc_marker.h" | 5 #include "vm/gc_marker.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "vm/allocation.h" | 10 #include "vm/allocation.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 class MarkingVisitor : public ObjectPointerVisitor { | 121 class MarkingVisitor : public ObjectPointerVisitor { |
| 122 public: | 122 public: |
| 123 MarkingVisitor(Isolate* isolate, | 123 MarkingVisitor(Isolate* isolate, |
| 124 Heap* heap, | 124 Heap* heap, |
| 125 PageSpace* page_space, | 125 PageSpace* page_space, |
| 126 MarkingStack* marking_stack, | 126 MarkingStack* marking_stack, |
| 127 bool visit_function_code) | 127 bool visit_function_code) |
| 128 : ObjectPointerVisitor(isolate), | 128 : ObjectPointerVisitor(isolate), |
| 129 heap_(heap), | 129 heap_(heap), |
| 130 vm_heap_(Dart::vm_isolate()->heap()), | 130 vm_heap_(Dart::vm_isolate()->heap()), |
| 131 class_table_(isolate->class_table()), | |
| 131 page_space_(page_space), | 132 page_space_(page_space), |
| 132 marking_stack_(marking_stack), | 133 marking_stack_(marking_stack), |
| 133 visiting_old_object_(NULL), | 134 visiting_old_object_(NULL), |
| 134 visit_function_code_(visit_function_code) { | 135 visit_function_code_(visit_function_code) { |
| 135 ASSERT(heap_ != vm_heap_); | 136 ASSERT(heap_ != vm_heap_); |
| 136 } | 137 } |
| 137 | 138 |
| 138 MarkingStack* marking_stack() const { return marking_stack_; } | 139 MarkingStack* marking_stack() const { return marking_stack_; } |
| 139 | 140 |
| 140 void VisitPointers(RawObject** first, RawObject** last) { | 141 void VisitPointers(RawObject** first, RawObject** last) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 219 if (raw_obj->IsNewObject()) { | 220 if (raw_obj->IsNewObject()) { |
| 220 // TODO(iposva): Add consistency check. | 221 // TODO(iposva): Add consistency check. |
| 221 if ((visiting_old_object_ != NULL) && | 222 if ((visiting_old_object_ != NULL) && |
| 222 !visiting_old_object_->IsRemembered()) { | 223 !visiting_old_object_->IsRemembered()) { |
| 223 ASSERT(p != NULL); | 224 ASSERT(p != NULL); |
| 224 visiting_old_object_->SetRememberedBit(); | 225 visiting_old_object_->SetRememberedBit(); |
| 225 isolate()->store_buffer()->AddObjectGC(visiting_old_object_); | 226 isolate()->store_buffer()->AddObjectGC(visiting_old_object_); |
| 226 } | 227 } |
| 227 return; | 228 return; |
| 228 } | 229 } |
| 229 | 230 class_table_->UpdateLiveOld(raw_obj->GetClassId(), raw_obj->Size()); |
|
Ivan Posva
2014/01/17 06:53:16
We only need the size for variable size objects. I
Cutch
2014/01/17 18:37:59
Done.
| |
| 230 MarkAndPush(raw_obj); | 231 MarkAndPush(raw_obj); |
| 231 } | 232 } |
| 232 | 233 |
| 233 void DetachCode() { | 234 void DetachCode() { |
| 234 for (int i = 0; i < skipped_code_functions_.length(); i++) { | 235 for (int i = 0; i < skipped_code_functions_.length(); i++) { |
| 235 RawFunction* func = skipped_code_functions_[i]; | 236 RawFunction* func = skipped_code_functions_[i]; |
| 236 RawCode* code = func->ptr()->code_; | 237 RawCode* code = func->ptr()->code_; |
| 237 if (!code->IsMarked()) { | 238 if (!code->IsMarked()) { |
| 238 // If the code wasn't strongly visited through other references | 239 // If the code wasn't strongly visited through other references |
| 239 // after skipping the function's code pointer, then we disconnect the | 240 // after skipping the function's code pointer, then we disconnect the |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 250 String name; | 251 String name; |
| 251 name = func->ptr()->name_; | 252 name = func->ptr()->name_; |
| 252 OS::Print("Detaching code: %s\n", name.ToCString()); | 253 OS::Print("Detaching code: %s\n", name.ToCString()); |
| 253 } | 254 } |
| 254 } | 255 } |
| 255 } | 256 } |
| 256 } | 257 } |
| 257 | 258 |
| 258 Heap* heap_; | 259 Heap* heap_; |
| 259 Heap* vm_heap_; | 260 Heap* vm_heap_; |
| 261 ClassTable* class_table_; | |
| 260 PageSpace* page_space_; | 262 PageSpace* page_space_; |
| 261 MarkingStack* marking_stack_; | 263 MarkingStack* marking_stack_; |
| 262 RawObject* visiting_old_object_; | 264 RawObject* visiting_old_object_; |
| 263 typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet; | 265 typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet; |
| 264 DelaySet delay_set_; | 266 DelaySet delay_set_; |
| 265 const bool visit_function_code_; | 267 const bool visit_function_code_; |
| 266 GrowableArray<RawFunction*> skipped_code_functions_; | 268 GrowableArray<RawFunction*> skipped_code_functions_; |
| 267 | 269 |
| 268 DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitor); | 270 DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitor); |
| 269 }; | 271 }; |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 484 MarkingWeakVisitor mark_weak; | 486 MarkingWeakVisitor mark_weak; |
| 485 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); | 487 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); |
| 486 mark.Finalize(); | 488 mark.Finalize(); |
| 487 ProcessWeakTables(page_space); | 489 ProcessWeakTables(page_space); |
| 488 ProcessObjectIdTable(isolate); | 490 ProcessObjectIdTable(isolate); |
| 489 | 491 |
| 490 Epilogue(isolate, invoke_api_callbacks); | 492 Epilogue(isolate, invoke_api_callbacks); |
| 491 } | 493 } |
| 492 | 494 |
| 493 } // namespace dart | 495 } // namespace dart |
| OLD | NEW |