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

Sign up to get free protection for your applications and to get access to all the features.
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;