libv8-node 16.10.0.0-arm64-darwin → 18.8.0.0-arm64-darwin

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libv8-node/paths.rb +1 -1
  3. data/lib/libv8/node/version.rb +3 -3
  4. data/vendor/v8/arm64-darwin/libv8/obj/libv8_monolith.a +0 -0
  5. data/vendor/v8/include/cppgc/allocation.h +100 -22
  6. data/vendor/v8/include/cppgc/cross-thread-persistent.h +114 -33
  7. data/vendor/v8/include/cppgc/default-platform.h +2 -10
  8. data/vendor/v8/include/cppgc/explicit-management.h +22 -4
  9. data/vendor/v8/include/cppgc/garbage-collected.h +15 -26
  10. data/vendor/v8/include/cppgc/heap-consistency.h +30 -0
  11. data/vendor/v8/include/cppgc/heap-state.h +12 -0
  12. data/vendor/v8/include/cppgc/heap.h +7 -2
  13. data/vendor/v8/include/cppgc/internal/api-constants.h +8 -0
  14. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +25 -14
  15. data/vendor/v8/include/cppgc/internal/finalizer-trait.h +4 -1
  16. data/vendor/v8/include/cppgc/internal/gc-info.h +90 -10
  17. data/vendor/v8/include/cppgc/internal/logging.h +3 -3
  18. data/vendor/v8/include/cppgc/internal/name-trait.h +11 -0
  19. data/vendor/v8/include/cppgc/internal/persistent-node.h +73 -29
  20. data/vendor/v8/include/cppgc/internal/pointer-policies.h +26 -15
  21. data/vendor/v8/include/cppgc/internal/write-barrier.h +62 -23
  22. data/vendor/v8/include/cppgc/liveness-broker.h +4 -1
  23. data/vendor/v8/include/cppgc/member.h +7 -2
  24. data/vendor/v8/include/cppgc/persistent.h +38 -33
  25. data/vendor/v8/include/cppgc/platform.h +4 -1
  26. data/vendor/v8/include/cppgc/prefinalizer.h +35 -12
  27. data/vendor/v8/include/cppgc/testing.h +9 -2
  28. data/vendor/v8/include/cppgc/type-traits.h +6 -13
  29. data/vendor/v8/include/cppgc/visitor.h +9 -7
  30. data/vendor/v8/include/libplatform/libplatform.h +0 -11
  31. data/vendor/v8/include/libplatform/v8-tracing.h +0 -1
  32. data/vendor/v8/include/v8-array-buffer.h +445 -0
  33. data/vendor/v8/include/v8-callbacks.h +397 -0
  34. data/vendor/v8/include/v8-container.h +129 -0
  35. data/vendor/v8/include/v8-context.h +407 -0
  36. data/vendor/v8/include/v8-cppgc.h +21 -128
  37. data/vendor/v8/include/v8-data.h +80 -0
  38. data/vendor/v8/include/v8-date.h +43 -0
  39. data/vendor/v8/include/v8-debug.h +168 -0
  40. data/vendor/v8/include/v8-embedder-heap.h +218 -0
  41. data/vendor/v8/include/v8-embedder-state-scope.h +51 -0
  42. data/vendor/v8/include/v8-exception.h +217 -0
  43. data/vendor/v8/include/v8-extension.h +62 -0
  44. data/vendor/v8/include/v8-external.h +37 -0
  45. data/vendor/v8/include/v8-fast-api-calls.h +172 -24
  46. data/vendor/v8/include/v8-forward.h +81 -0
  47. data/vendor/v8/include/v8-function-callback.h +475 -0
  48. data/vendor/v8/include/v8-function.h +125 -0
  49. data/vendor/v8/include/v8-initialization.h +315 -0
  50. data/vendor/v8/include/v8-inspector.h +56 -28
  51. data/vendor/v8/include/v8-internal.h +217 -55
  52. data/vendor/v8/include/v8-isolate.h +1709 -0
  53. data/vendor/v8/include/v8-json.h +47 -0
  54. data/vendor/v8/include/v8-local-handle.h +455 -0
  55. data/vendor/v8/include/v8-locker.h +149 -0
  56. data/vendor/v8/include/v8-maybe.h +137 -0
  57. data/vendor/v8/include/v8-memory-span.h +43 -0
  58. data/vendor/v8/include/v8-message.h +216 -0
  59. data/vendor/v8/include/v8-metrics.h +69 -16
  60. data/vendor/v8/include/v8-microtask-queue.h +152 -0
  61. data/vendor/v8/include/v8-microtask.h +28 -0
  62. data/vendor/v8/include/v8-object.h +775 -0
  63. data/vendor/v8/include/v8-persistent-handle.h +590 -0
  64. data/vendor/v8/include/v8-platform.h +400 -17
  65. data/vendor/v8/include/v8-primitive-object.h +118 -0
  66. data/vendor/v8/include/v8-primitive.h +866 -0
  67. data/vendor/v8/include/v8-profiler.h +88 -13
  68. data/vendor/v8/include/v8-promise.h +174 -0
  69. data/vendor/v8/include/v8-proxy.h +50 -0
  70. data/vendor/v8/include/v8-regexp.h +105 -0
  71. data/vendor/v8/include/v8-script.h +747 -0
  72. data/vendor/v8/include/v8-snapshot.h +196 -0
  73. data/vendor/v8/include/v8-statistics.h +217 -0
  74. data/vendor/v8/include/v8-template.h +1079 -0
  75. data/vendor/v8/include/v8-traced-handle.h +420 -0
  76. data/vendor/v8/include/v8-typed-array.h +282 -0
  77. data/vendor/v8/include/v8-unwinder-state.h +4 -3
  78. data/vendor/v8/include/v8-unwinder.h +132 -0
  79. data/vendor/v8/include/v8-util.h +7 -1
  80. data/vendor/v8/include/v8-value-serializer-version.h +1 -1
  81. data/vendor/v8/include/v8-value-serializer.h +279 -0
  82. data/vendor/v8/include/v8-value.h +526 -0
  83. data/vendor/v8/include/v8-version.h +4 -4
  84. data/vendor/v8/include/v8-wasm.h +257 -0
  85. data/vendor/v8/include/v8-weak-callback-info.h +87 -0
  86. data/vendor/v8/include/v8.h +41 -12601
  87. data/vendor/v8/include/v8config.h +102 -12
  88. metadata +47 -5
  89. data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +0 -30
@@ -11,6 +11,7 @@
11
11
  #include "cppgc/heap-state.h"
12
12
  #include "cppgc/internal/api-constants.h"
13
13
  #include "cppgc/internal/atomic-entry-flag.h"
14
+ #include "cppgc/platform.h"
14
15
  #include "cppgc/sentinel-pointer.h"
15
16
  #include "cppgc/trace-trait.h"
16
17
  #include "v8config.h" // NOLINT(build/include_directory)
@@ -66,10 +67,8 @@ class V8_EXPORT WriteBarrier final {
66
67
  template <typename HeapHandleCallback>
67
68
  static V8_INLINE Type GetWriteBarrierType(const void* slot, Params& params,
68
69
  HeapHandleCallback callback);
69
-
70
- template <typename HeapHandleCallback>
71
- static V8_INLINE Type GetWriteBarrierTypeForExternallyReferencedObject(
72
- const void* value, Params& params, HeapHandleCallback callback);
70
+ // Returns the required write barrier for a given `value`.
71
+ static V8_INLINE Type GetWriteBarrierType(const void* value, Params& params);
73
72
 
74
73
  static V8_INLINE void DijkstraMarkingBarrier(const Params& params,
75
74
  const void* object);
@@ -81,9 +80,13 @@ class V8_EXPORT WriteBarrier final {
81
80
  #if defined(CPPGC_YOUNG_GENERATION)
82
81
  static V8_INLINE void GenerationalBarrier(const Params& params,
83
82
  const void* slot);
84
- #else // !CPPGC_YOUNG_GENERATION
83
+ static V8_INLINE void GenerationalBarrierForSourceObject(
84
+ const Params& params, const void* inner_pointer);
85
+ #else // !CPPGC_YOUNG_GENERATION
85
86
  static V8_INLINE void GenerationalBarrier(const Params& params,
86
87
  const void* slot) {}
88
+ static V8_INLINE void GenerationalBarrierForSourceObject(
89
+ const Params& params, const void* inner_pointer) {}
87
90
  #endif // CPPGC_YOUNG_GENERATION
88
91
 
89
92
  #if V8_ENABLE_CHECKS
@@ -121,8 +124,10 @@ class V8_EXPORT WriteBarrier final {
121
124
  #if defined(CPPGC_YOUNG_GENERATION)
122
125
  static CagedHeapLocalData& GetLocalData(HeapHandle&);
123
126
  static void GenerationalBarrierSlow(const CagedHeapLocalData& local_data,
124
- const AgeTable& ageTable,
127
+ const AgeTable& age_table,
125
128
  const void* slot, uintptr_t value_offset);
129
+ static void GenerationalBarrierForSourceObjectSlow(
130
+ const CagedHeapLocalData& local_data, const void* object);
126
131
  #endif // CPPGC_YOUNG_GENERATION
127
132
 
128
133
  static AtomicEntryFlag incremental_or_concurrent_marking_flag_;
@@ -147,9 +152,20 @@ class V8_EXPORT WriteBarrierTypeForCagedHeapPolicy final {
147
152
  return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
148
153
  }
149
154
 
155
+ template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
156
+ static V8_INLINE WriteBarrier::Type Get(const void* value,
157
+ WriteBarrier::Params& params,
158
+ HeapHandleCallback callback) {
159
+ return GetNoSlot(value, params, callback);
160
+ }
161
+
162
+ private:
163
+ WriteBarrierTypeForCagedHeapPolicy() = delete;
164
+
150
165
  template <typename HeapHandleCallback>
151
- static V8_INLINE WriteBarrier::Type GetForExternallyReferenced(
152
- const void* value, WriteBarrier::Params& params, HeapHandleCallback) {
166
+ static V8_INLINE WriteBarrier::Type GetNoSlot(const void* value,
167
+ WriteBarrier::Params& params,
168
+ HeapHandleCallback) {
153
169
  if (!TryGetCagedHeap(value, value, params)) {
154
170
  return WriteBarrier::Type::kNone;
155
171
  }
@@ -159,14 +175,14 @@ class V8_EXPORT WriteBarrierTypeForCagedHeapPolicy final {
159
175
  return SetAndReturnType<WriteBarrier::Type::kNone>(params);
160
176
  }
161
177
 
162
- private:
163
- WriteBarrierTypeForCagedHeapPolicy() = delete;
164
-
165
178
  template <WriteBarrier::ValueMode value_mode>
166
179
  struct ValueModeDispatch;
167
180
 
168
181
  static V8_INLINE bool TryGetCagedHeap(const void* slot, const void* value,
169
182
  WriteBarrier::Params& params) {
183
+ // TODO(chromium:1056170): Check if the null check can be folded in with
184
+ // the rest of the write barrier.
185
+ if (!value) return false;
170
186
  params.start = reinterpret_cast<uintptr_t>(value) &
171
187
  ~(api_constants::kCagedHeapReservationAlignment - 1);
172
188
  const uintptr_t slot_offset =
@@ -193,6 +209,11 @@ struct WriteBarrierTypeForCagedHeapPolicy::ValueModeDispatch<
193
209
  static V8_INLINE WriteBarrier::Type Get(const void* slot, const void* value,
194
210
  WriteBarrier::Params& params,
195
211
  HeapHandleCallback) {
212
+ #if !defined(CPPGC_YOUNG_GENERATION)
213
+ if (V8_LIKELY(!WriteBarrier::IsAnyIncrementalOrConcurrentMarking())) {
214
+ return SetAndReturnType<WriteBarrier::Type::kNone>(params);
215
+ }
216
+ #endif // !CPPGC_YOUNG_GENERATION
196
217
  bool within_cage = TryGetCagedHeap(slot, value, params);
197
218
  if (!within_cage) {
198
219
  return WriteBarrier::Type::kNone;
@@ -257,10 +278,10 @@ class V8_EXPORT WriteBarrierTypeForNonCagedHeapPolicy final {
257
278
  return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
258
279
  }
259
280
 
260
- template <typename HeapHandleCallback>
261
- static V8_INLINE WriteBarrier::Type GetForExternallyReferenced(
262
- const void* value, WriteBarrier::Params& params,
263
- HeapHandleCallback callback) {
281
+ template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
282
+ static V8_INLINE WriteBarrier::Type Get(const void* value,
283
+ WriteBarrier::Params& params,
284
+ HeapHandleCallback callback) {
264
285
  // The slot will never be used in `Get()` below.
265
286
  return Get<WriteBarrier::ValueMode::kValuePresent>(nullptr, value, params,
266
287
  callback);
@@ -287,7 +308,10 @@ struct WriteBarrierTypeForNonCagedHeapPolicy::ValueModeDispatch<
287
308
  HeapHandleCallback callback) {
288
309
  // The following check covers nullptr as well as sentinel pointer.
289
310
  if (object <= static_cast<void*>(kSentinelPointer)) {
290
- return WriteBarrier::Type::kNone;
311
+ return SetAndReturnType<WriteBarrier::Type::kNone>(params);
312
+ }
313
+ if (V8_LIKELY(!WriteBarrier::IsAnyIncrementalOrConcurrentMarking())) {
314
+ return SetAndReturnType<WriteBarrier::Type::kNone>(params);
291
315
  }
292
316
  if (IsMarking(object, &params.heap)) {
293
317
  return SetAndReturnType<WriteBarrier::Type::kMarking>(params);
@@ -331,12 +355,10 @@ WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
331
355
  }
332
356
 
333
357
  // static
334
- template <typename HeapHandleCallback>
335
- WriteBarrier::Type
336
- WriteBarrier::GetWriteBarrierTypeForExternallyReferencedObject(
337
- const void* value, Params& params, HeapHandleCallback callback) {
338
- return WriteBarrierTypePolicy::GetForExternallyReferenced(value, params,
339
- callback);
358
+ WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
359
+ const void* value, WriteBarrier::Params& params) {
360
+ return WriteBarrierTypePolicy::Get<ValueMode::kValuePresent>(value, params,
361
+ []() {});
340
362
  }
341
363
 
342
364
  // static
@@ -383,11 +405,28 @@ void WriteBarrier::GenerationalBarrier(const Params& params, const void* slot) {
383
405
  const AgeTable& age_table = local_data.age_table;
384
406
 
385
407
  // Bail out if the slot is in young generation.
386
- if (V8_LIKELY(age_table[params.slot_offset] == AgeTable::Age::kYoung)) return;
408
+ if (V8_LIKELY(age_table.GetAge(params.slot_offset) == AgeTable::Age::kYoung))
409
+ return;
387
410
 
388
411
  GenerationalBarrierSlow(local_data, age_table, slot, params.value_offset);
389
412
  }
390
413
 
414
+ // static
415
+ void WriteBarrier::GenerationalBarrierForSourceObject(
416
+ const Params& params, const void* inner_pointer) {
417
+ CheckParams(Type::kGenerational, params);
418
+
419
+ const CagedHeapLocalData& local_data = params.caged_heap();
420
+ const AgeTable& age_table = local_data.age_table;
421
+
422
+ // Assume that if the first element is in young generation, the whole range is
423
+ // in young generation.
424
+ if (V8_LIKELY(age_table.GetAge(params.slot_offset) == AgeTable::Age::kYoung))
425
+ return;
426
+
427
+ GenerationalBarrierForSourceObjectSlow(local_data, inner_pointer);
428
+ }
429
+
391
430
  #endif // !CPPGC_YOUNG_GENERATION
392
431
 
393
432
  } // namespace internal
@@ -44,7 +44,10 @@ class V8_EXPORT LivenessBroker final {
44
44
  public:
45
45
  template <typename T>
46
46
  bool IsHeapObjectAlive(const T* object) const {
47
- return object &&
47
+ // nullptr objects are considered alive to allow weakness to be used from
48
+ // stack while running into a conservative GC. Treating nullptr as dead
49
+ // would mean that e.g. custom collectins could not be strongified on stack.
50
+ return !object ||
48
51
  IsHeapObjectAliveImpl(
49
52
  TraceTrait<T>::GetTraceDescriptor(object).base_object_payload);
50
53
  }
@@ -26,7 +26,7 @@ class MemberBase {
26
26
  protected:
27
27
  struct AtomicInitializerTag {};
28
28
 
29
- MemberBase() = default;
29
+ MemberBase() : raw_(nullptr) {}
30
30
  explicit MemberBase(const void* value) : raw_(value) {}
31
31
  MemberBase(const void* value, AtomicInitializerTag) { SetRawAtomic(value); }
32
32
 
@@ -46,7 +46,10 @@ class MemberBase {
46
46
  void ClearFromGC() const { raw_ = nullptr; }
47
47
 
48
48
  private:
49
- mutable const void* raw_ = nullptr;
49
+ // All constructors initialize `raw_`. Do not add a default value here as it
50
+ // results in a non-atomic write on some builds, even when the atomic version
51
+ // of the constructor is used.
52
+ mutable const void* raw_;
50
53
  };
51
54
 
52
55
  // The basic class from which all Member classes are 'generated'.
@@ -218,6 +221,8 @@ class BasicMember final : private MemberBase, private CheckingPolicy {
218
221
 
219
222
  void ClearFromGC() const { MemberBase::ClearFromGC(); }
220
223
 
224
+ T* GetFromGC() const { return Get(); }
225
+
221
226
  friend class cppgc::Visitor;
222
227
  template <typename U>
223
228
  friend struct cppgc::TraceTrait;
@@ -41,11 +41,11 @@ class PersistentBase {
41
41
  node_ = nullptr;
42
42
  }
43
43
 
44
- private:
44
+ protected:
45
45
  mutable const void* raw_ = nullptr;
46
46
  mutable PersistentNode* node_ = nullptr;
47
47
 
48
- friend class PersistentRegion;
48
+ friend class PersistentRegionBase;
49
49
  };
50
50
 
51
51
  // The basic class from which all Persistent classes are generated.
@@ -118,10 +118,10 @@ class BasicPersistent final : public PersistentBase,
118
118
  template <typename U, typename MemberBarrierPolicy,
119
119
  typename MemberWeaknessTag, typename MemberCheckingPolicy,
120
120
  typename = std::enable_if_t<std::is_base_of<T, U>::value>>
121
- BasicPersistent(internal::BasicMember<U, MemberBarrierPolicy,
122
- MemberWeaknessTag, MemberCheckingPolicy>
123
- member,
124
- const SourceLocation& loc = SourceLocation::Current())
121
+ BasicPersistent(
122
+ const internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
123
+ MemberCheckingPolicy>& member,
124
+ const SourceLocation& loc = SourceLocation::Current())
125
125
  : BasicPersistent(member.Get(), loc) {}
126
126
 
127
127
  ~BasicPersistent() { Clear(); }
@@ -159,9 +159,8 @@ class BasicPersistent final : public PersistentBase,
159
159
  typename MemberWeaknessTag, typename MemberCheckingPolicy,
160
160
  typename = std::enable_if_t<std::is_base_of<T, U>::value>>
161
161
  BasicPersistent& operator=(
162
- internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
163
- MemberCheckingPolicy>
164
- member) {
162
+ const internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
163
+ MemberCheckingPolicy>& member) {
165
164
  return operator=(member.Get());
166
165
  }
167
166
 
@@ -259,6 +258,12 @@ class BasicPersistent final : public PersistentBase,
259
258
  }
260
259
  }
261
260
 
261
+ // Set Get() for details.
262
+ V8_CLANG_NO_SANITIZE("cfi-unrelated-cast")
263
+ T* GetFromGC() const {
264
+ return static_cast<T*>(const_cast<void*>(GetValue()));
265
+ }
266
+
262
267
  friend class cppgc::Visitor;
263
268
  };
264
269
 
@@ -286,12 +291,12 @@ template <typename T1, typename PersistentWeaknessPolicy,
286
291
  typename PersistentLocationPolicy, typename PersistentCheckingPolicy,
287
292
  typename T2, typename MemberWriteBarrierPolicy,
288
293
  typename MemberWeaknessTag, typename MemberCheckingPolicy>
289
- bool operator==(const BasicPersistent<T1, PersistentWeaknessPolicy,
290
- PersistentLocationPolicy,
291
- PersistentCheckingPolicy>& p,
292
- BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
293
- MemberCheckingPolicy>
294
- m) {
294
+ bool operator==(
295
+ const BasicPersistent<T1, PersistentWeaknessPolicy,
296
+ PersistentLocationPolicy, PersistentCheckingPolicy>&
297
+ p,
298
+ const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
299
+ MemberCheckingPolicy>& m) {
295
300
  return p.Get() == m.Get();
296
301
  }
297
302
 
@@ -299,12 +304,12 @@ template <typename T1, typename PersistentWeaknessPolicy,
299
304
  typename PersistentLocationPolicy, typename PersistentCheckingPolicy,
300
305
  typename T2, typename MemberWriteBarrierPolicy,
301
306
  typename MemberWeaknessTag, typename MemberCheckingPolicy>
302
- bool operator!=(const BasicPersistent<T1, PersistentWeaknessPolicy,
303
- PersistentLocationPolicy,
304
- PersistentCheckingPolicy>& p,
305
- BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
306
- MemberCheckingPolicy>
307
- m) {
307
+ bool operator!=(
308
+ const BasicPersistent<T1, PersistentWeaknessPolicy,
309
+ PersistentLocationPolicy, PersistentCheckingPolicy>&
310
+ p,
311
+ const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
312
+ MemberCheckingPolicy>& m) {
308
313
  return !(p == m);
309
314
  }
310
315
 
@@ -312,12 +317,12 @@ template <typename T1, typename MemberWriteBarrierPolicy,
312
317
  typename MemberWeaknessTag, typename MemberCheckingPolicy,
313
318
  typename T2, typename PersistentWeaknessPolicy,
314
319
  typename PersistentLocationPolicy, typename PersistentCheckingPolicy>
315
- bool operator==(BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
316
- MemberCheckingPolicy>
317
- m,
318
- const BasicPersistent<T1, PersistentWeaknessPolicy,
319
- PersistentLocationPolicy,
320
- PersistentCheckingPolicy>& p) {
320
+ bool operator==(
321
+ const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
322
+ MemberCheckingPolicy>& m,
323
+ const BasicPersistent<T1, PersistentWeaknessPolicy,
324
+ PersistentLocationPolicy, PersistentCheckingPolicy>&
325
+ p) {
321
326
  return m.Get() == p.Get();
322
327
  }
323
328
 
@@ -325,12 +330,12 @@ template <typename T1, typename MemberWriteBarrierPolicy,
325
330
  typename MemberWeaknessTag, typename MemberCheckingPolicy,
326
331
  typename T2, typename PersistentWeaknessPolicy,
327
332
  typename PersistentLocationPolicy, typename PersistentCheckingPolicy>
328
- bool operator!=(BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
329
- MemberCheckingPolicy>
330
- m,
331
- const BasicPersistent<T1, PersistentWeaknessPolicy,
332
- PersistentLocationPolicy,
333
- PersistentCheckingPolicy>& p) {
333
+ bool operator!=(
334
+ const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
335
+ MemberCheckingPolicy>& m,
336
+ const BasicPersistent<T1, PersistentWeaknessPolicy,
337
+ PersistentLocationPolicy, PersistentCheckingPolicy>&
338
+ p) {
334
339
  return !(m == p);
335
340
  }
336
341
 
@@ -7,6 +7,7 @@
7
7
 
8
8
  #include <memory>
9
9
 
10
+ #include "cppgc/source-location.h"
10
11
  #include "v8-platform.h" // NOLINT(build/include_directory)
11
12
  #include "v8config.h" // NOLINT(build/include_directory)
12
13
 
@@ -145,9 +146,11 @@ V8_EXPORT void ShutdownProcess();
145
146
 
146
147
  namespace internal {
147
148
 
148
- V8_EXPORT void Abort();
149
+ V8_EXPORT void Fatal(const std::string& reason = std::string(),
150
+ const SourceLocation& = SourceLocation::Current());
149
151
 
150
152
  } // namespace internal
153
+
151
154
  } // namespace cppgc
152
155
 
153
156
  #endif // INCLUDE_CPPGC_PLATFORM_H_
@@ -6,23 +6,17 @@
6
6
  #define INCLUDE_CPPGC_PREFINALIZER_H_
7
7
 
8
8
  #include "cppgc/internal/compiler-specific.h"
9
- #include "cppgc/internal/prefinalizer-handler.h"
10
9
  #include "cppgc/liveness-broker.h"
11
10
 
12
11
  namespace cppgc {
13
12
 
14
13
  namespace internal {
15
14
 
16
- template <typename T>
17
- class PrefinalizerRegistration final {
15
+ class V8_EXPORT PrefinalizerRegistration final {
18
16
  public:
19
- explicit PrefinalizerRegistration(T* self) {
20
- static_assert(sizeof(&T::InvokePreFinalizer) > 0,
21
- "USING_PRE_FINALIZER(T) must be defined.");
17
+ using Callback = bool (*)(const cppgc::LivenessBroker&, void*);
22
18
 
23
- cppgc::internal::PreFinalizerRegistrationDispatcher::RegisterPrefinalizer(
24
- {self, T::InvokePreFinalizer});
25
- }
19
+ PrefinalizerRegistration(void*, Callback);
26
20
 
27
21
  void* operator new(size_t, void* location) = delete;
28
22
  void* operator new(size_t) = delete;
@@ -30,6 +24,35 @@ class PrefinalizerRegistration final {
30
24
 
31
25
  } // namespace internal
32
26
 
27
+ /**
28
+ * Macro must be used in the private section of `Class` and registers a
29
+ * prefinalization callback `void Class::PreFinalizer()`. The callback is
30
+ * invoked on garbage collection after the collector has found an object to be
31
+ * dead.
32
+ *
33
+ * Callback properties:
34
+ * - The callback is invoked before a possible destructor for the corresponding
35
+ * object.
36
+ * - The callback may access the whole object graph, irrespective of whether
37
+ * objects are considered dead or alive.
38
+ * - The callback is invoked on the same thread as the object was created on.
39
+ *
40
+ * Example:
41
+ * \code
42
+ * class WithPrefinalizer : public GarbageCollected<WithPrefinalizer> {
43
+ * CPPGC_USING_PRE_FINALIZER(WithPrefinalizer, Dispose);
44
+ *
45
+ * public:
46
+ * void Trace(Visitor*) const {}
47
+ * void Dispose() { prefinalizer_called = true; }
48
+ * ~WithPrefinalizer() {
49
+ * // prefinalizer_called == true
50
+ * }
51
+ * private:
52
+ * bool prefinalizer_called = false;
53
+ * };
54
+ * \endcode
55
+ */
33
56
  #define CPPGC_USING_PRE_FINALIZER(Class, PreFinalizer) \
34
57
  public: \
35
58
  static bool InvokePreFinalizer(const cppgc::LivenessBroker& liveness_broker, \
@@ -38,13 +61,13 @@ class PrefinalizerRegistration final {
38
61
  "Only garbage collected objects can have prefinalizers"); \
39
62
  Class* self = static_cast<Class*>(object); \
40
63
  if (liveness_broker.IsHeapObjectAlive(self)) return false; \
41
- self->Class::PreFinalizer(); \
64
+ self->PreFinalizer(); \
42
65
  return true; \
43
66
  } \
44
67
  \
45
68
  private: \
46
- CPPGC_NO_UNIQUE_ADDRESS cppgc::internal::PrefinalizerRegistration<Class> \
47
- prefinalizer_dummy_{this}; \
69
+ CPPGC_NO_UNIQUE_ADDRESS cppgc::internal::PrefinalizerRegistration \
70
+ prefinalizer_dummy_{this, Class::InvokePreFinalizer}; \
48
71
  static_assert(true, "Force semicolon.")
49
72
 
50
73
  } // namespace cppgc
@@ -19,8 +19,13 @@ class HeapHandle;
19
19
  namespace testing {
20
20
 
21
21
  /**
22
- * Overrides the state of the stack with the provided value. Takes precedence
23
- * over other parameters that set the stack state. Must no be nested.
22
+ * Overrides the state of the stack with the provided value. Parameters passed
23
+ * to explicit garbage collection calls still take precedence. Must not be
24
+ * nested.
25
+ *
26
+ * This scope is useful to make the garbage collector consider the stack when
27
+ * tasks that invoke garbage collection (through the provided platform) contain
28
+ * interesting pointers on its stack.
24
29
  */
25
30
  class V8_EXPORT V8_NODISCARD OverrideEmbedderStackStateScope final {
26
31
  CPPGC_STACK_ALLOCATED();
@@ -93,6 +98,8 @@ class V8_EXPORT StandaloneTestingHeap final {
93
98
  HeapHandle& heap_handle_;
94
99
  };
95
100
 
101
+ V8_EXPORT bool IsHeapObjectOld(void*);
102
+
96
103
  } // namespace testing
97
104
  } // namespace cppgc
98
105
 
@@ -24,14 +24,6 @@ class StrongMemberTag;
24
24
  class UntracedMemberTag;
25
25
  class WeakMemberTag;
26
26
 
27
- // Pre-C++17 custom implementation of std::void_t.
28
- template <typename... Ts>
29
- struct make_void {
30
- typedef void type;
31
- };
32
- template <typename... Ts>
33
- using void_t = typename make_void<Ts...>::type;
34
-
35
27
  // Not supposed to be specialized by the user.
36
28
  template <typename T>
37
29
  struct IsWeak : std::false_type {};
@@ -42,7 +34,7 @@ template <typename T, typename = void>
42
34
  struct IsTraceMethodConst : std::false_type {};
43
35
 
44
36
  template <typename T>
45
- struct IsTraceMethodConst<T, void_t<decltype(std::declval<const T>().Trace(
37
+ struct IsTraceMethodConst<T, std::void_t<decltype(std::declval<const T>().Trace(
46
38
  std::declval<Visitor*>()))>> : std::true_type {
47
39
  };
48
40
 
@@ -53,7 +45,7 @@ struct IsTraceable : std::false_type {
53
45
 
54
46
  template <typename T>
55
47
  struct IsTraceable<
56
- T, void_t<decltype(std::declval<T>().Trace(std::declval<Visitor*>()))>>
48
+ T, std::void_t<decltype(std::declval<T>().Trace(std::declval<Visitor*>()))>>
57
49
  : std::true_type {
58
50
  // All Trace methods should be marked as const. If an object of type
59
51
  // 'T' is traceable then any object of type 'const T' should also
@@ -72,8 +64,8 @@ struct HasGarbageCollectedMixinTypeMarker : std::false_type {
72
64
 
73
65
  template <typename T>
74
66
  struct HasGarbageCollectedMixinTypeMarker<
75
- T,
76
- void_t<typename std::remove_const_t<T>::IsGarbageCollectedMixinTypeMarker>>
67
+ T, std::void_t<
68
+ typename std::remove_const_t<T>::IsGarbageCollectedMixinTypeMarker>>
77
69
  : std::true_type {
78
70
  static_assert(sizeof(T), "T must be fully defined");
79
71
  };
@@ -85,7 +77,8 @@ struct HasGarbageCollectedTypeMarker : std::false_type {
85
77
 
86
78
  template <typename T>
87
79
  struct HasGarbageCollectedTypeMarker<
88
- T, void_t<typename std::remove_const_t<T>::IsGarbageCollectedTypeMarker>>
80
+ T,
81
+ std::void_t<typename std::remove_const_t<T>::IsGarbageCollectedTypeMarker>>
89
82
  : std::true_type {
90
83
  static_assert(sizeof(T), "T must be fully defined");
91
84
  };
@@ -12,6 +12,7 @@
12
12
  #include "cppgc/internal/pointer-policies.h"
13
13
  #include "cppgc/liveness-broker.h"
14
14
  #include "cppgc/member.h"
15
+ #include "cppgc/sentinel-pointer.h"
15
16
  #include "cppgc/source-location.h"
16
17
  #include "cppgc/trace-trait.h"
17
18
  #include "cppgc/type-traits.h"
@@ -318,10 +319,10 @@ class V8_EXPORT Visitor {
318
319
  template <typename PointerType>
319
320
  static void HandleWeak(const LivenessBroker& info, const void* object) {
320
321
  const PointerType* weak = static_cast<const PointerType*>(object);
322
+ auto* raw_ptr = weak->GetFromGC();
321
323
  // Sentinel values are preserved for weak pointers.
322
- if (*weak == kSentinelPointer) return;
323
- const auto* raw = weak->Get();
324
- if (!info.IsHeapObjectAlive(raw)) {
324
+ if (raw_ptr == kSentinelPointer) return;
325
+ if (!info.IsHeapObjectAlive(raw_ptr)) {
325
326
  weak->ClearFromGC();
326
327
  }
327
328
  }
@@ -335,11 +336,11 @@ class V8_EXPORT Visitor {
335
336
  static_assert(internal::IsGarbageCollectedOrMixinType<PointeeType>::value,
336
337
  "Persistent's pointee type must be GarbageCollected or "
337
338
  "GarbageCollectedMixin");
338
- if (!p.Get()) {
339
+ auto* ptr = p.GetFromGC();
340
+ if (!ptr) {
339
341
  return;
340
342
  }
341
- VisitRoot(p.Get(), TraceTrait<PointeeType>::GetTraceDescriptor(p.Get()),
342
- loc);
343
+ VisitRoot(ptr, TraceTrait<PointeeType>::GetTraceDescriptor(ptr), loc);
343
344
  }
344
345
 
345
346
  template <
@@ -354,7 +355,8 @@ class V8_EXPORT Visitor {
354
355
  "GarbageCollectedMixin");
355
356
  static_assert(!internal::IsAllocatedOnCompactableSpace<PointeeType>::value,
356
357
  "Weak references to compactable objects are not allowed");
357
- VisitWeakRoot(p.Get(), TraceTrait<PointeeType>::GetTraceDescriptor(p.Get()),
358
+ auto* ptr = p.GetFromGC();
359
+ VisitWeakRoot(ptr, TraceTrait<PointeeType>::GetTraceDescriptor(ptr),
358
360
  &HandleWeak<WeakPersistent>, &p, loc);
359
361
  }
360
362
 
@@ -89,17 +89,6 @@ V8_PLATFORM_EXPORT void RunIdleTasks(v8::Platform* platform,
89
89
  v8::Isolate* isolate,
90
90
  double idle_time_in_seconds);
91
91
 
92
- /**
93
- * Attempts to set the tracing controller for the given platform.
94
- *
95
- * The |platform| has to be created using |NewDefaultPlatform|.
96
- *
97
- */
98
- V8_DEPRECATE_SOON("Access the DefaultPlatform directly")
99
- V8_PLATFORM_EXPORT void SetTracingController(
100
- v8::Platform* platform,
101
- v8::platform::tracing::TracingController* tracing_controller);
102
-
103
92
  /**
104
93
  * Notifies the given platform about the Isolate getting deleted soon. Has to be
105
94
  * called for all Isolates which are deleted - unless we're shutting down the
@@ -37,7 +37,6 @@ const int kTraceMaxNumArgs = 2;
37
37
  class V8_PLATFORM_EXPORT TraceObject {
38
38
  public:
39
39
  union ArgValue {
40
- V8_DEPRECATED("use as_uint ? true : false") bool as_bool;
41
40
  uint64_t as_uint;
42
41
  int64_t as_int;
43
42
  double as_double;