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

Side by Side Diff: Source/platform/heap/Visitor.h

Issue 824513004: ASSERT that Visitor::mark is only called when inGC() (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: haraken Created 5 years, 11 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 // the argument to get the TraceTrait. By default, the mark method 337 // the argument to get the TraceTrait. By default, the mark method
338 // of the TraceTrait just calls the virtual two-argument mark method on this 338 // of the TraceTrait just calls the virtual two-argument mark method on this
339 // visitor, where the second argument is the static trace method of the trai t. 339 // visitor, where the second argument is the static trace method of the trai t.
340 template<typename T> 340 template<typename T>
341 void mark(T* t) 341 void mark(T* t)
342 { 342 {
343 if (!t) 343 if (!t)
344 return; 344 return;
345 #if ENABLE(ASSERT) 345 #if ENABLE(ASSERT)
346 TraceTrait<T>::checkGCInfo(t); 346 TraceTrait<T>::checkGCInfo(t);
347 Derived::fromHelper(this)->checkMarkingAllowed();
347 #endif 348 #endif
348 TraceTrait<T>::mark(Derived::fromHelper(this), t); 349 TraceTrait<T>::mark(Derived::fromHelper(this), t);
349 350
350 STATIC_ASSERT_IS_GARBAGE_COLLECTED(T, "attempted to mark non garbage col lected object"); 351 STATIC_ASSERT_IS_GARBAGE_COLLECTED(T, "attempted to mark non garbage col lected object");
351 } 352 }
352 353
353 // Member version of the one-argument templated trace method. 354 // Member version of the one-argument templated trace method.
354 template<typename T> 355 template<typename T>
355 void trace(const Member<T>& t) 356 void trace(const Member<T>& t)
356 { 357 {
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 m_hostName = name; 626 m_hostName = name;
626 } 627 }
627 #endif 628 #endif
628 629
629 inline bool canTraceEagerly() const { return m_traceDepth < kMaxEagerTraceDe pth; } 630 inline bool canTraceEagerly() const { return m_traceDepth < kMaxEagerTraceDe pth; }
630 inline void incrementTraceDepth() { m_traceDepth++; } 631 inline void incrementTraceDepth() { m_traceDepth++; }
631 inline void decrementTraceDepth() { ASSERT(m_traceDepth > 0); m_traceDepth-- ; } 632 inline void decrementTraceDepth() { ASSERT(m_traceDepth > 0); m_traceDepth-- ; }
632 633
633 inline bool isGlobalMarkingVisitor() const { return m_isGlobalMarkingVisitor ; } 634 inline bool isGlobalMarkingVisitor() const { return m_isGlobalMarkingVisitor ; }
634 635
636 #if ENABLE(ASSERT)
637 virtual void setAllowMarkingForHashTableWeakProcessing(bool) { }
638 #endif
639
635 protected: 640 protected:
636 explicit Visitor(VisitorType type) 641 explicit Visitor(VisitorType type)
637 : m_isGlobalMarkingVisitor(type == GlobalMarkingVisitorType) 642 : m_isGlobalMarkingVisitor(type == GlobalMarkingVisitorType)
638 { 643 {
639 m_traceDepth = 0; 644 m_traceDepth = 0;
640 } 645 }
641 646
642 virtual void registerWeakCellWithCallback(void**, WeakPointerCallback) = 0; 647 virtual void registerWeakCellWithCallback(void**, WeakPointerCallback) = 0;
643 #if ENABLE(GC_PROFILE_MARKING) 648 #if ENABLE(GC_PROFILE_MARKING)
644 virtual void recordObjectGraphEdge(const void*) 649 virtual void recordObjectGraphEdge(const void*)
645 { 650 {
646 ASSERT_NOT_REACHED(); 651 ASSERT_NOT_REACHED();
647 } 652 }
648 653
649 void* m_hostObject; 654 void* m_hostObject;
650 String m_hostName; 655 String m_hostName;
651 #endif 656 #endif
652 657
658 #if ENABLE(ASSERT)
659 virtual void checkMarkingAllowed() { }
660 #endif
661
653 private: 662 private:
654 static Visitor* fromHelper(VisitorHelper<Visitor>* helper) { return static_c ast<Visitor*>(helper); } 663 static Visitor* fromHelper(VisitorHelper<Visitor>* helper) { return static_c ast<Visitor*>(helper); }
655 664
656 // The maximum depth of eager, unrolled trace() calls that is 665 // The maximum depth of eager, unrolled trace() calls that is
657 // considered safe and allowed. 666 // considered safe and allowed.
658 const int kMaxEagerTraceDepth = 100; 667 const int kMaxEagerTraceDepth = 100;
659 668
660 static int m_traceDepth; 669 static int m_traceDepth;
661 bool m_isGlobalMarkingVisitor; 670 bool m_isGlobalMarkingVisitor;
662 }; 671 };
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 struct GCInfoTrait { 930 struct GCInfoTrait {
922 static size_t index() 931 static size_t index()
923 { 932 {
924 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index(); 933 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index();
925 } 934 }
926 }; 935 };
927 936
928 } 937 }
929 938
930 #endif 939 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698