| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium 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 #ifndef TraceTraits_h | 5 #ifndef TraceTraits_h |
| 6 #define TraceTraits_h | 6 #define TraceTraits_h |
| 7 | 7 |
| 8 #include "platform/heap/GCInfo.h" | 8 #include "platform/heap/GCInfo.h" |
| 9 #include "platform/heap/Heap.h" | 9 #include "platform/heap/Heap.h" |
| 10 #include "platform/heap/InlinedGlobalMarkingVisitor.h" | 10 #include "platform/heap/InlinedGlobalMarkingVisitor.h" |
| (...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 // weak pointers. | 683 // weak pointers. |
| 684 // Corner case: If there is weakness on both the key and value side, | 684 // Corner case: If there is weakness on both the key and value side, |
| 685 // and there are also strong pointers on the both sides then we could | 685 // and there are also strong pointers on the both sides then we could |
| 686 // unexpectedly leak. The scenario is that the weak pointer on the key | 686 // unexpectedly leak. The scenario is that the weak pointer on the key |
| 687 // side is alive, which causes the strong pointer on the key side to be | 687 // side is alive, which causes the strong pointer on the key side to be |
| 688 // marked. If that then results in the object pointed to by the weak | 688 // marked. If that then results in the object pointed to by the weak |
| 689 // pointer on the value side being marked live, then the whole | 689 // pointer on the value side being marked live, then the whole |
| 690 // key-value entry is leaked. To avoid unexpected leaking, we disallow | 690 // key-value entry is leaked. To avoid unexpected leaking, we disallow |
| 691 // this case, but if you run into this assert, please reach out to Blink | 691 // this case, but if you run into this assert, please reach out to Blink |
| 692 // reviewers, and we may relax it. | 692 // reviewers, and we may relax it. |
| 693 const bool keyIsWeak = | 693 constexpr bool keyIsWeak = |
| 694 Traits::KeyTraits::weakHandlingFlag == WeakHandlingInCollections; | 694 Traits::KeyTraits::weakHandlingFlag == WeakHandlingInCollections; |
| 695 const bool valueIsWeak = | 695 constexpr bool valueIsWeak = |
| 696 Traits::ValueTraits::weakHandlingFlag == WeakHandlingInCollections; | 696 Traits::ValueTraits::weakHandlingFlag == WeakHandlingInCollections; |
| 697 const bool keyHasStrongRefs = | 697 const bool keyHasStrongRefs = |
| 698 IsTraceableInCollectionTrait<typename Traits::KeyTraits>::value; | 698 IsTraceableInCollectionTrait<typename Traits::KeyTraits>::value; |
| 699 const bool valueHasStrongRefs = | 699 const bool valueHasStrongRefs = |
| 700 IsTraceableInCollectionTrait<typename Traits::ValueTraits>::value; | 700 IsTraceableInCollectionTrait<typename Traits::ValueTraits>::value; |
| 701 static_assert( | 701 static_assert( |
| 702 !keyIsWeak || !valueIsWeak || !keyHasStrongRefs || !valueHasStrongRefs, | 702 !keyIsWeak || !valueIsWeak || !keyHasStrongRefs || !valueHasStrongRefs, |
| 703 "this configuration is disallowed to avoid unexpected leaks"); | 703 "this configuration is disallowed to avoid unexpected leaks"); |
| 704 if ((valueIsWeak && !keyIsWeak) || | 704 if ((valueIsWeak && !keyIsWeak) || |
| 705 (valueIsWeak && keyIsWeak && !valueHasStrongRefs)) { | 705 (valueIsWeak && keyIsWeak && !valueHasStrongRefs)) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 // since iterating over the hash table backing will find the whole | 791 // since iterating over the hash table backing will find the whole |
| 792 // chain. | 792 // chain. |
| 793 visitor->markNoTracing(node); | 793 visitor->markNoTracing(node); |
| 794 return false; | 794 return false; |
| 795 } | 795 } |
| 796 }; | 796 }; |
| 797 | 797 |
| 798 } // namespace WTF | 798 } // namespace WTF |
| 799 | 799 |
| 800 #endif | 800 #endif |
| OLD | NEW |