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 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 } | 294 } |
295 return !raw_obj->IsMarked(); | 295 return !raw_obj->IsMarked(); |
296 } | 296 } |
297 | 297 |
298 | 298 |
299 class MarkingWeakVisitor : public HandleVisitor { | 299 class MarkingWeakVisitor : public HandleVisitor { |
300 public: | 300 public: |
301 MarkingWeakVisitor() { | 301 MarkingWeakVisitor() { |
302 } | 302 } |
303 | 303 |
304 void VisitHandle(uword addr) { | 304 void VisitHandle(uword addr, bool is_prologue_weak) { |
305 FinalizablePersistentHandle* handle = | 305 FinalizablePersistentHandle* handle = |
306 reinterpret_cast<FinalizablePersistentHandle*>(addr); | 306 reinterpret_cast<FinalizablePersistentHandle*>(addr); |
307 RawObject* raw_obj = handle->raw(); | 307 RawObject* raw_obj = handle->raw(); |
308 if (IsUnreachable(raw_obj)) { | 308 if (IsUnreachable(raw_obj)) { |
309 FinalizablePersistentHandle::Finalize(handle); | 309 FinalizablePersistentHandle::Finalize(handle, is_prologue_weak); |
310 } | 310 } |
311 } | 311 } |
312 | 312 |
313 private: | 313 private: |
314 DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor); | 314 DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor); |
315 }; | 315 }; |
316 | 316 |
317 | 317 |
318 void GCMarker::Prologue(Isolate* isolate, bool invoke_api_callbacks) { | 318 void GCMarker::Prologue(Isolate* isolate, bool invoke_api_callbacks) { |
319 if (invoke_api_callbacks) { | 319 if (invoke_api_callbacks) { |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 MarkingWeakVisitor mark_weak; | 497 MarkingWeakVisitor mark_weak; |
498 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); | 498 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); |
499 mark.Finalize(); | 499 mark.Finalize(); |
500 ProcessWeakTables(page_space); | 500 ProcessWeakTables(page_space); |
501 ProcessObjectIdTable(isolate); | 501 ProcessObjectIdTable(isolate); |
502 | 502 |
503 Epilogue(isolate, invoke_api_callbacks); | 503 Epilogue(isolate, invoke_api_callbacks); |
504 } | 504 } |
505 | 505 |
506 } // namespace dart | 506 } // namespace dart |
OLD | NEW |