695a449032
Ephemerons are based around WeakMember which may just be null at the time the pair is considered for liveness. Bail out of marking for null keys, as they write barrier would anyways make the value strong when marking the key. Bug: chromium:1056170 Change-Id: If8775a370824b88fc67fa479a0c0893985fbf5f4 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2692571 Reviewed-by: Omer Katz <omerkatz@chromium.org> Commit-Queue: Michael Lippautz <mlippautz@chromium.org> Cr-Commit-Position: refs/heads/master@{#72714}
31 lines
804 B
C++
31 lines
804 B
C++
// Copyright 2020 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef INCLUDE_CPPGC_EPHEMERON_PAIR_H_
|
|
#define INCLUDE_CPPGC_EPHEMERON_PAIR_H_
|
|
|
|
#include "cppgc/liveness-broker.h"
|
|
#include "cppgc/member.h"
|
|
|
|
namespace cppgc {
|
|
|
|
/**
|
|
* An ephemeron pair is used to conditionally retain an object.
|
|
* The `value` will be kept alive only if the `key` is alive.
|
|
*/
|
|
template <typename K, typename V>
|
|
struct EphemeronPair {
|
|
EphemeronPair(K* k, V* v) : key(k), value(v) {}
|
|
WeakMember<K> key;
|
|
Member<V> value;
|
|
|
|
void ClearValueIfKeyIsDead(const LivenessBroker& broker) {
|
|
if (!broker.IsHeapObjectAlive(key)) value = nullptr;
|
|
}
|
|
};
|
|
|
|
} // namespace cppgc
|
|
|
|
#endif // INCLUDE_CPPGC_EPHEMERON_PAIR_H_
|