V8  latest master commit
V8 is Google's open source JavaScript engine
pointer-policies.h
Go to the documentation of this file.
1 // Copyright 2020 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef INCLUDE_CPPGC_INTERNAL_POINTER_POLICIES_H_
6 #define INCLUDE_CPPGC_INTERNAL_POINTER_POLICIES_H_
7 
8 #include <cstdint>
9 #include <type_traits>
10 
11 #include "cppgc/source-location.h"
12 #include "v8config.h" // NOLINT(build/include_directory)
13 
14 namespace cppgc {
15 namespace internal {
16 
17 class PersistentRegion;
18 
19 // Tags to distinguish between strong and weak member types.
20 class StrongMemberTag;
21 class WeakMemberTag;
22 class UntracedMemberTag;
23 
25  static void InitializingBarrier(const void*, const void*) {
26  // Since in initializing writes the source object is always white, having no
27  // barrier doesn't break the tri-color invariant.
28  }
29  static void AssigningBarrier(const void*, const void*) {
30  // TODO(chromium:1056170): Add actual implementation.
31  }
32 };
33 
35  static void InitializingBarrier(const void*, const void*) {}
36  static void AssigningBarrier(const void*, const void*) {}
37 };
38 
40  protected:
42  void CheckPointer(const void* ptr);
43 
44  private:
45  void* impl_;
46 };
47 
49  protected:
50  void CheckPointer(const void* raw) {}
51 };
52 
53 #if V8_ENABLE_CHECKS
54 using DefaultCheckingPolicy = EnabledCheckingPolicy;
55 #else
57 #endif
58 
60  public:
61  constexpr const SourceLocation& Location() const { return location_; }
62 
63  protected:
64  constexpr explicit KeepLocationPolicy(const SourceLocation& location)
65  : location_(location) {}
66 
67  // KeepLocationPolicy must not copy underlying source locations.
68  KeepLocationPolicy(const KeepLocationPolicy&) = delete;
70 
71  // Location of the original moved from object should be preserved.
74 
75  private:
76  SourceLocation location_;
77 };
78 
80  public:
81  constexpr SourceLocation Location() const { return {}; }
82 
83  protected:
84  constexpr explicit IgnoreLocationPolicy(const SourceLocation&) {}
85 };
86 
87 #if CPPGC_SUPPORTS_OBJECT_NAMES
88 using DefaultLocationPolicy = KeepLocationPolicy;
89 #else
91 #endif
92 
94  using IsStrongPersistent = std::true_type;
95 
96  static V8_EXPORT PersistentRegion& GetPersistentRegion(void* object);
97 };
98 
100  using IsStrongPersistent = std::false_type;
101 
102  static V8_EXPORT PersistentRegion& GetPersistentRegion(void* object);
103 };
104 
105 // Persistent/Member forward declarations.
106 template <typename T, typename WeaknessPolicy,
107  typename LocationPolicy = DefaultLocationPolicy,
108  typename CheckingPolicy = DefaultCheckingPolicy>
110 template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
111  typename CheckingPolicy = DefaultCheckingPolicy>
113 
114 // Special tag type used to denote some sentinel member. The semantics of the
115 // sentinel is defined by the embedder.
117  template <typename T>
118  operator T*() const { // NOLINT
119  static constexpr intptr_t kSentinelValue = -1;
120  return reinterpret_cast<T*>(kSentinelValue);
121  }
122  // Hidden friends.
123  friend bool operator==(SentinelPointer, SentinelPointer) { return true; }
124  friend bool operator!=(SentinelPointer, SentinelPointer) { return false; }
125 };
126 
127 } // namespace internal
128 
130 
131 } // namespace cppgc
132 
133 #endif // INCLUDE_CPPGC_INTERNAL_POINTER_POLICIES_H_
cppgc::internal::IgnoreLocationPolicy::Location
constexpr SourceLocation Location() const
Definition: pointer-policies.h:81
cppgc::SourceLocation
Definition: source-location.h:28
cppgc::internal::WeakPersistentPolicy
Definition: pointer-policies.h:99
cppgc::internal::SentinelPointer
Definition: pointer-policies.h:116
cppgc::internal::DijkstraWriteBarrierPolicy
Definition: pointer-policies.h:24
cppgc::internal::DisabledCheckingPolicy
Definition: pointer-policies.h:48
cppgc::internal::StrongPersistentPolicy::GetPersistentRegion
static V8_EXPORT PersistentRegion & GetPersistentRegion(void *object)
cppgc::internal::StrongPersistentPolicy::IsStrongPersistent
std::true_type IsStrongPersistent
Definition: pointer-policies.h:94
cppgc::internal::EnabledCheckingPolicy
Definition: pointer-policies.h:39
cppgc::internal::DefaultLocationPolicy
IgnoreLocationPolicy DefaultLocationPolicy
Definition: pointer-policies.h:90
cppgc::internal::NoWriteBarrierPolicy::AssigningBarrier
static void AssigningBarrier(const void *, const void *)
Definition: pointer-policies.h:36
cppgc::internal::BasicPersistent
Definition: pointer-policies.h:109
cppgc
Definition: allocation.h:18
cppgc::internal::WeakPersistentPolicy::GetPersistentRegion
static V8_EXPORT PersistentRegion & GetPersistentRegion(void *object)
v8config.h
cppgc::internal::SentinelPointer::operator==
friend bool operator==(SentinelPointer, SentinelPointer)
Definition: pointer-policies.h:123
cppgc::internal::KeepLocationPolicy::Location
constexpr const SourceLocation & Location() const
Definition: pointer-policies.h:61
V8_EXPORT
#define V8_EXPORT
Definition: v8config.h:467
cppgc::internal::BasicMember
Definition: pointer-policies.h:112
cppgc::internal::DijkstraWriteBarrierPolicy::InitializingBarrier
static void InitializingBarrier(const void *, const void *)
Definition: pointer-policies.h:25
cppgc::internal::SentinelPointer::operator!=
friend bool operator!=(SentinelPointer, SentinelPointer)
Definition: pointer-policies.h:124
cppgc::internal::KeepLocationPolicy::operator=
KeepLocationPolicy & operator=(const KeepLocationPolicy &)=delete
cppgc::internal::PersistentRegion
Definition: persistent-node.h:70
cppgc::internal::DefaultCheckingPolicy
DisabledCheckingPolicy DefaultCheckingPolicy
Definition: pointer-policies.h:56
cppgc::internal::WeakPersistentPolicy::IsStrongPersistent
std::false_type IsStrongPersistent
Definition: pointer-policies.h:100
cppgc::internal::DisabledCheckingPolicy::CheckPointer
void CheckPointer(const void *raw)
Definition: pointer-policies.h:50
cppgc::internal::KeepLocationPolicy::KeepLocationPolicy
constexpr KeepLocationPolicy(const SourceLocation &location)
Definition: pointer-policies.h:64
cppgc::internal::DijkstraWriteBarrierPolicy::AssigningBarrier
static void AssigningBarrier(const void *, const void *)
Definition: pointer-policies.h:29
cppgc::kSentinelPointer
constexpr internal::SentinelPointer kSentinelPointer
Definition: pointer-policies.h:129
cppgc::internal::KeepLocationPolicy
Definition: pointer-policies.h:59
cppgc::internal::NoWriteBarrierPolicy::InitializingBarrier
static void InitializingBarrier(const void *, const void *)
Definition: pointer-policies.h:35
cppgc::internal::NoWriteBarrierPolicy
Definition: pointer-policies.h:34
cppgc::internal::IgnoreLocationPolicy
Definition: pointer-policies.h:79
cppgc::internal::StrongPersistentPolicy
Definition: pointer-policies.h:93
source-location.h
cppgc::internal::IgnoreLocationPolicy::IgnoreLocationPolicy
constexpr IgnoreLocationPolicy(const SourceLocation &)
Definition: pointer-policies.h:84