Commit aa56ee4b authored by Omer Katz's avatar Omer Katz Committed by Commit Bot

heap: Don't create a new Member in TraceMayBeDeleted(WeakMember)

The static_cast from WeakMember to Member actually constructs a Member.
If this happens on a concurrent thread, it will fail during Member
creation in SaveCreationThreadState (creation_thread_state_ is nullptr).

Bug: 986235
Change-Id: I5d2edf3b714313a9d23663fb805f3bf8486e8f4e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2061248
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Reviewed-by: default avatarMichael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742139}
parent 8669233f
...@@ -379,7 +379,7 @@ struct TraceInCollectionTrait<kWeakHandling, blink::Member<T>, Traits> { ...@@ -379,7 +379,7 @@ struct TraceInCollectionTrait<kWeakHandling, blink::Member<T>, Traits> {
template <typename T, typename Traits> template <typename T, typename Traits>
struct TraceInCollectionTrait<kNoWeakHandling, blink::WeakMember<T>, Traits> { struct TraceInCollectionTrait<kNoWeakHandling, blink::WeakMember<T>, Traits> {
static bool Trace(blink::Visitor* visitor, blink::WeakMember<T>& t) { static bool Trace(blink::Visitor* visitor, blink::WeakMember<T>& t) {
visitor->TraceMaybeDeleted(static_cast<blink::Member<T>>(t)); visitor->TraceMaybeDeleted(t);
return false; return false;
} }
}; };
......
...@@ -108,12 +108,10 @@ class PLATFORM_EXPORT Visitor { ...@@ -108,12 +108,10 @@ class PLATFORM_EXPORT Visitor {
VisitRoot(const_cast<T*>(t), TraceDescriptorFor(t), location); VisitRoot(const_cast<T*>(t), TraceDescriptorFor(t), location);
} }
template <typename T, bool maybe_deleted = false> template <typename T>
void Trace(const Member<T>& t) { void Trace(const Member<T>& t) {
T* value = t.GetSafe(); T* value = t.GetSafe();
if (maybe_deleted && Member<T>::IsMemberHashTableDeletedValue(value))
return;
DCHECK(!Member<T>::IsMemberHashTableDeletedValue(value)); DCHECK(!Member<T>::IsMemberHashTableDeletedValue(value));
Trace(value); Trace(value);
...@@ -121,7 +119,23 @@ class PLATFORM_EXPORT Visitor { ...@@ -121,7 +119,23 @@ class PLATFORM_EXPORT Visitor {
template <typename T> template <typename T>
ALWAYS_INLINE void TraceMaybeDeleted(const Member<T>& t) { ALWAYS_INLINE void TraceMaybeDeleted(const Member<T>& t) {
Trace<T, true>(t); T* value = t.GetSafe();
if (Member<T>::IsMemberHashTableDeletedValue(value))
return;
Trace<T>(value);
}
// TraceMayBeDeleted strongifies WeakMembers.
template <typename T>
ALWAYS_INLINE void TraceMaybeDeleted(const WeakMember<T>& t) {
T* value = t.GetSafe();
if (WeakMember<T>::IsMemberHashTableDeletedValue(value))
return;
Trace<T>(value);
} }
// Fallback methods used only when we need to trace raw pointers of T. This is // Fallback methods used only when we need to trace raw pointers of T. This is
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment