libv8-node 23.6.1.0-aarch64-linux → 24.1.0.0-aarch64-linux

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/libv8/node/version.rb +3 -3
  3. data/vendor/v8/aarch64-linux/libv8/obj/libv8_monolith.a +0 -0
  4. data/vendor/v8/include/cppgc/allocation.h +1 -2
  5. data/vendor/v8/include/cppgc/default-platform.h +3 -2
  6. data/vendor/v8/include/cppgc/heap-consistency.h +1 -1
  7. data/vendor/v8/include/cppgc/internal/api-constants.h +0 -17
  8. data/vendor/v8/include/cppgc/internal/base-page-handle.h +2 -4
  9. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +0 -4
  10. data/vendor/v8/include/cppgc/internal/caged-heap.h +0 -4
  11. data/vendor/v8/include/cppgc/internal/conditional-stack-allocated.h +41 -0
  12. data/vendor/v8/include/cppgc/internal/logging.h +3 -3
  13. data/vendor/v8/include/cppgc/internal/member-storage.h +63 -20
  14. data/vendor/v8/include/cppgc/internal/persistent-node.h +8 -3
  15. data/vendor/v8/include/cppgc/internal/pointer-policies.h +48 -11
  16. data/vendor/v8/include/cppgc/macros.h +21 -0
  17. data/vendor/v8/include/cppgc/member.h +70 -36
  18. data/vendor/v8/include/cppgc/name-provider.h +3 -0
  19. data/vendor/v8/include/cppgc/platform.h +11 -0
  20. data/vendor/v8/include/cppgc/type-traits.h +1 -0
  21. data/vendor/v8/include/cppgc/visitor.h +25 -1
  22. data/vendor/v8/include/libplatform/libplatform-export.h +2 -2
  23. data/vendor/v8/include/libplatform/v8-tracing.h +0 -1
  24. data/vendor/v8/include/v8-array-buffer.h +111 -34
  25. data/vendor/v8/include/v8-callbacks.h +84 -26
  26. data/vendor/v8/include/v8-context.h +7 -6
  27. data/vendor/v8/include/v8-cppgc.h +2 -1
  28. data/vendor/v8/include/v8-data.h +5 -0
  29. data/vendor/v8/include/v8-debug.h +11 -0
  30. data/vendor/v8/include/v8-embedder-heap.h +1 -32
  31. data/vendor/v8/include/v8-exception.h +2 -0
  32. data/vendor/v8/include/v8-external-memory-accounter.h +60 -0
  33. data/vendor/v8/include/v8-fast-api-calls.h +17 -175
  34. data/vendor/v8/include/v8-function-callback.h +4 -33
  35. data/vendor/v8/include/v8-function.h +7 -0
  36. data/vendor/v8/include/v8-handle-base.h +18 -0
  37. data/vendor/v8/include/v8-initialization.h +9 -1
  38. data/vendor/v8/include/v8-inspector.h +8 -4
  39. data/vendor/v8/include/v8-internal.h +477 -399
  40. data/vendor/v8/include/v8-isolate.h +218 -151
  41. data/vendor/v8/include/v8-local-handle.h +56 -28
  42. data/vendor/v8/include/v8-maybe.h +2 -1
  43. data/vendor/v8/include/v8-memory-span.h +149 -24
  44. data/vendor/v8/include/v8-message.h +9 -1
  45. data/vendor/v8/include/v8-metrics.h +10 -0
  46. data/vendor/v8/include/v8-object.h +7 -2
  47. data/vendor/v8/include/v8-persistent-handle.h +17 -17
  48. data/vendor/v8/include/v8-platform.h +48 -13
  49. data/vendor/v8/include/v8-primitive.h +131 -6
  50. data/vendor/v8/include/v8-profiler.h +13 -1
  51. data/vendor/v8/include/v8-proxy.h +0 -1
  52. data/vendor/v8/include/v8-regexp.h +0 -1
  53. data/vendor/v8/include/v8-sandbox.h +3 -3
  54. data/vendor/v8/include/v8-script.h +21 -3
  55. data/vendor/v8/include/v8-source-location.h +6 -1
  56. data/vendor/v8/include/v8-template.h +8 -2
  57. data/vendor/v8/include/v8-trace-categories.h +23 -0
  58. data/vendor/v8/include/v8-traced-handle.h +16 -17
  59. data/vendor/v8/include/v8-typed-array.h +6 -10
  60. data/vendor/v8/include/v8-unwinder-state.h +2 -3
  61. data/vendor/v8/include/v8-value-serializer-version.h +3 -3
  62. data/vendor/v8/include/v8-value.h +18 -0
  63. data/vendor/v8/include/v8-version.h +4 -4
  64. data/vendor/v8/include/v8-wasm.h +24 -0
  65. data/vendor/v8/include/v8-weak-callback-info.h +20 -12
  66. data/vendor/v8/include/v8.h +3 -3
  67. data/vendor/v8/include/v8config.h +34 -40
  68. metadata +5 -3
  69. data/vendor/v8/include/cppgc/ephemeron-pair.h +0 -30
@@ -38,9 +38,8 @@ class V8_TRIVIAL_ABI MemberBase {
38
38
 
39
39
  V8_INLINE MemberBase() = default;
40
40
  V8_INLINE explicit MemberBase(const void* value) : raw_(value) {}
41
- V8_INLINE MemberBase(const void* value, AtomicInitializerTag) {
42
- SetRawAtomic(value);
43
- }
41
+ V8_INLINE MemberBase(const void* value, AtomicInitializerTag)
42
+ : raw_(value, typename RawStorage::AtomicInitializerTag{}) {}
44
43
 
45
44
  V8_INLINE explicit MemberBase(RawStorage raw) : raw_(raw) {}
46
45
  V8_INLINE explicit MemberBase(std::nullptr_t) : raw_(nullptr) {}
@@ -87,7 +86,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
87
86
  V8_INLINE BasicMember(SentinelPointer s) : Base(s) {} // NOLINT
88
87
  V8_INLINE BasicMember(T* raw) : Base(raw) { // NOLINT
89
88
  InitializingWriteBarrier(raw);
90
- this->CheckPointer(Get());
89
+ CheckPointer(raw);
91
90
  }
92
91
  V8_INLINE BasicMember(T& raw) // NOLINT
93
92
  : BasicMember(&raw) {}
@@ -103,7 +102,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
103
102
  V8_INLINE BasicMember(T* raw, AtomicInitializerTag atomic)
104
103
  : Base(raw, atomic) {
105
104
  InitializingWriteBarrier(raw);
106
- this->CheckPointer(Get());
105
+ CheckPointer(raw);
107
106
  }
108
107
  V8_INLINE BasicMember(T& raw, AtomicInitializerTag atomic)
109
108
  : BasicMember(&raw, atomic) {}
@@ -117,7 +116,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
117
116
  // need to be adjusted.
118
117
  template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
119
118
  typename OtherCheckingPolicy,
120
- std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
119
+ std::enable_if_t<IsDecayedSameV<T, U>>* = nullptr>
121
120
  V8_INLINE BasicMember( // NOLINT
122
121
  const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
123
122
  OtherCheckingPolicy, StorageType>& other)
@@ -125,7 +124,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
125
124
 
126
125
  template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
127
126
  typename OtherCheckingPolicy,
128
- std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
127
+ std::enable_if_t<IsStrictlyBaseOfV<T, U>>* = nullptr>
129
128
  V8_INLINE BasicMember( // NOLINT
130
129
  const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
131
130
  OtherCheckingPolicy, StorageType>& other)
@@ -142,7 +141,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
142
141
  // need to be adjusted.
143
142
  template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
144
143
  typename OtherCheckingPolicy,
145
- std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
144
+ std::enable_if_t<IsDecayedSameV<T, U>>* = nullptr>
146
145
  V8_INLINE BasicMember(
147
146
  BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
148
147
  StorageType>&& other) noexcept
@@ -152,7 +151,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
152
151
 
153
152
  template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
154
153
  typename OtherCheckingPolicy,
155
- std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
154
+ std::enable_if_t<IsStrictlyBaseOfV<T, U>>* = nullptr>
156
155
  V8_INLINE BasicMember(
157
156
  BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
158
157
  StorageType>&& other) noexcept
@@ -183,10 +182,10 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
183
182
  V8_INLINE BasicMember& operator=(
184
183
  const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
185
184
  OtherCheckingPolicy, StorageType>& other) {
186
- if constexpr (internal::IsDecayedSameV<T, U>) {
185
+ if constexpr (IsDecayedSameV<T, U>) {
187
186
  return operator=(other.GetRawStorage());
188
187
  } else {
189
- static_assert(internal::IsStrictlyBaseOfV<T, U>);
188
+ static_assert(IsStrictlyBaseOfV<T, U>);
190
189
  return operator=(other.Get());
191
190
  }
192
191
  }
@@ -206,10 +205,10 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
206
205
  V8_INLINE BasicMember& operator=(
207
206
  BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
208
207
  StorageType>&& other) noexcept {
209
- if constexpr (internal::IsDecayedSameV<T, U>) {
208
+ if constexpr (IsDecayedSameV<T, U>) {
210
209
  operator=(other.GetRawStorage());
211
210
  } else {
212
- static_assert(internal::IsStrictlyBaseOfV<T, U>);
211
+ static_assert(IsStrictlyBaseOfV<T, U>);
213
212
  operator=(other.Get());
214
213
  }
215
214
  other.Clear();
@@ -231,7 +230,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
231
230
  V8_INLINE BasicMember& operator=(T* other) {
232
231
  Base::SetRawAtomic(other);
233
232
  AssigningWriteBarrier(other);
234
- this->CheckPointer(Get());
233
+ CheckPointer(other);
235
234
  return *this;
236
235
  }
237
236
 
@@ -270,9 +269,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
270
269
  return static_cast<T*>(const_cast<void*>(Base::GetRaw()));
271
270
  }
272
271
 
273
- V8_INLINE void Clear() {
274
- Base::SetRawStorageAtomic(RawStorage{});
275
- }
272
+ V8_INLINE void Clear() { Base::SetRawStorageAtomic(RawStorage{}); }
276
273
 
277
274
  V8_INLINE T* Release() {
278
275
  T* result = Get();
@@ -284,20 +281,18 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
284
281
  return reinterpret_cast<const T**>(Base::GetRawSlot());
285
282
  }
286
283
 
287
- V8_INLINE RawStorage GetRawStorage() const {
288
- return Base::GetRawStorage();
289
- }
284
+ V8_INLINE RawStorage GetRawStorage() const { return Base::GetRawStorage(); }
290
285
 
291
286
  private:
292
287
  V8_INLINE explicit BasicMember(RawStorage raw) : Base(raw) {
293
- InitializingWriteBarrier(Get());
294
- this->CheckPointer(Get());
288
+ InitializingWriteBarrier();
289
+ CheckPointer();
295
290
  }
296
291
 
297
292
  V8_INLINE BasicMember& operator=(RawStorage other) {
298
293
  Base::SetRawStorageAtomic(other);
299
294
  AssigningWriteBarrier();
300
- this->CheckPointer(Get());
295
+ CheckPointer();
301
296
  return *this;
302
297
  }
303
298
 
@@ -308,6 +303,10 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
308
303
  V8_INLINE void InitializingWriteBarrier(T* value) const {
309
304
  WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(), value);
310
305
  }
306
+ V8_INLINE void InitializingWriteBarrier() const {
307
+ WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(),
308
+ Base::GetRawStorage());
309
+ }
311
310
  V8_INLINE void AssigningWriteBarrier(T* value) const {
312
311
  WriteBarrierPolicy::template AssigningBarrier<
313
312
  StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(), value);
@@ -317,6 +316,12 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
317
316
  StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(),
318
317
  Base::GetRawStorage());
319
318
  }
319
+ V8_INLINE void CheckPointer(T* value) {
320
+ CheckingPolicy::template CheckPointer<T>(value);
321
+ }
322
+ V8_INLINE void CheckPointer() {
323
+ CheckingPolicy::template CheckPointer<T>(Base::GetRawStorage());
324
+ }
320
325
 
321
326
  V8_INLINE void ClearFromGC() const { Base::ClearFromGC(); }
322
327
 
@@ -341,12 +346,11 @@ V8_INLINE bool operator==(
341
346
  StorageType>& member1,
342
347
  const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
343
348
  StorageType>& member2) {
344
- if constexpr (internal::IsDecayedSameV<T1, T2>) {
349
+ if constexpr (IsDecayedSameV<T1, T2>) {
345
350
  // Check compressed pointers if types are the same.
346
351
  return member1.GetRawStorage() == member2.GetRawStorage();
347
352
  } else {
348
- static_assert(internal::IsStrictlyBaseOfV<T1, T2> ||
349
- internal::IsStrictlyBaseOfV<T2, T1>);
353
+ static_assert(IsStrictlyBaseOfV<T1, T2> || IsStrictlyBaseOfV<T2, T1>);
350
354
  // Otherwise, check decompressed pointers.
351
355
  return member1.Get() == member2.Get();
352
356
  }
@@ -372,12 +376,12 @@ V8_INLINE bool operator==(
372
376
  StorageType>& member,
373
377
  U* raw) {
374
378
  // Never allow comparison with erased pointers.
375
- static_assert(!internal::IsDecayedSameV<void, U>);
379
+ static_assert(!IsDecayedSameV<void, U>);
376
380
 
377
- if constexpr (internal::IsDecayedSameV<T, U>) {
381
+ if constexpr (IsDecayedSameV<T, U>) {
378
382
  // Check compressed pointers if types are the same.
379
383
  return member.GetRawStorage() == StorageType(raw);
380
- } else if constexpr (internal::IsStrictlyBaseOfV<T, U>) {
384
+ } else if constexpr (IsStrictlyBaseOfV<T, U>) {
381
385
  // Cast the raw pointer to T, which may adjust the pointer.
382
386
  return member.GetRawStorage() == StorageType(static_cast<T*>(raw));
383
387
  } else {
@@ -494,7 +498,7 @@ V8_INLINE bool operator<(
494
498
  const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
495
499
  StorageType>& member2) {
496
500
  static_assert(
497
- internal::IsDecayedSameV<T1, T2>,
501
+ IsDecayedSameV<T1, T2>,
498
502
  "Comparison works only for same pointer type modulo cv-qualifiers");
499
503
  return member1.GetRawStorage() < member2.GetRawStorage();
500
504
  }
@@ -509,7 +513,7 @@ V8_INLINE bool operator<=(
509
513
  const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
510
514
  StorageType>& member2) {
511
515
  static_assert(
512
- internal::IsDecayedSameV<T1, T2>,
516
+ IsDecayedSameV<T1, T2>,
513
517
  "Comparison works only for same pointer type modulo cv-qualifiers");
514
518
  return member1.GetRawStorage() <= member2.GetRawStorage();
515
519
  }
@@ -524,7 +528,7 @@ V8_INLINE bool operator>(
524
528
  const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
525
529
  StorageType>& member2) {
526
530
  static_assert(
527
- internal::IsDecayedSameV<T1, T2>,
531
+ IsDecayedSameV<T1, T2>,
528
532
  "Comparison works only for same pointer type modulo cv-qualifiers");
529
533
  return member1.GetRawStorage() > member2.GetRawStorage();
530
534
  }
@@ -539,16 +543,15 @@ V8_INLINE bool operator>=(
539
543
  const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
540
544
  StorageType>& member2) {
541
545
  static_assert(
542
- internal::IsDecayedSameV<T1, T2>,
546
+ IsDecayedSameV<T1, T2>,
543
547
  "Comparison works only for same pointer type modulo cv-qualifiers");
544
548
  return member1.GetRawStorage() >= member2.GetRawStorage();
545
549
  }
546
550
 
547
551
  template <typename T, typename WriteBarrierPolicy, typename CheckingPolicy,
548
552
  typename StorageType>
549
- struct IsWeak<internal::BasicMember<T, WeakMemberTag, WriteBarrierPolicy,
550
- CheckingPolicy, StorageType>>
551
- : std::true_type {};
553
+ struct IsWeak<BasicMember<T, WeakMemberTag, WriteBarrierPolicy, CheckingPolicy,
554
+ StorageType>> : std::true_type {};
552
555
 
553
556
  } // namespace internal
554
557
 
@@ -626,4 +629,35 @@ static constexpr size_t kSizeofCompressedMember =
626
629
 
627
630
  } // namespace cppgc
628
631
 
632
+ // Mark `BasicMember<T>` and `T*` as having a common reference type of `T*` (the
633
+ // type to which both can be converted or bound). This makes them satisfy
634
+ // `std::equality_comparable`, which allows usage like the following:
635
+ // ```
636
+ // HeapVector<Member<T>> v;
637
+ // T* e;
638
+ // auto it = std::ranges::find(v, e);
639
+ // ```
640
+ // Without this, the `find()` call above would fail to compile with an error
641
+ // about being unable to invoke `std::ranges::equal_to()`.
642
+ template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
643
+ typename CheckingPolicy, typename StorageType,
644
+ template <typename> typename TQ, template <typename> typename UQ>
645
+ struct std::basic_common_reference<
646
+ cppgc::internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
647
+ CheckingPolicy, StorageType>,
648
+ T*, TQ, UQ> {
649
+ using type = T*;
650
+ };
651
+
652
+ template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
653
+ typename CheckingPolicy, typename StorageType,
654
+ template <typename> typename TQ, template <typename> typename UQ>
655
+ struct std::basic_common_reference<
656
+ T*,
657
+ cppgc::internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
658
+ CheckingPolicy, StorageType>,
659
+ TQ, UQ> {
660
+ using type = T*;
661
+ };
662
+
629
663
  #endif // INCLUDE_CPPGC_MEMBER_H_
@@ -55,6 +55,9 @@ class V8_EXPORT NameProvider {
55
55
  * Specifies a name for the garbage-collected object. Such names will never
56
56
  * be hidden, as they are explicitly specified by the user of this API.
57
57
  *
58
+ * Implementations of this function must not allocate garbage-collected
59
+ * objects or otherwise modify the cppgc heap.
60
+ *
58
61
  * V8 may call this function while generating a heap snapshot or at other
59
62
  * times. If V8 is currently generating a heap snapshot (according to
60
63
  * HeapProfiler::IsTakingSnapshot), then the returned string must stay alive
@@ -52,6 +52,15 @@ class V8_EXPORT Platform {
52
52
  * Foreground task runner that should be used by a Heap.
53
53
  */
54
54
  virtual std::shared_ptr<TaskRunner> GetForegroundTaskRunner() {
55
+ return GetForegroundTaskRunner(TaskPriority::kUserBlocking);
56
+ }
57
+
58
+ /**
59
+ * Returns a TaskRunner with a specific |priority| which can be used to post a
60
+ * task on the foreground thread.
61
+ */
62
+ virtual std::shared_ptr<TaskRunner> GetForegroundTaskRunner(
63
+ TaskPriority priority) {
55
64
  return nullptr;
56
65
  }
57
66
 
@@ -127,6 +136,8 @@ class V8_EXPORT Platform {
127
136
  virtual TracingController* GetTracingController();
128
137
  };
129
138
 
139
+ V8_EXPORT bool IsInitialized();
140
+
130
141
  /**
131
142
  * Process-global initialization of the garbage collector. Must be called before
132
143
  * creating a Heap.
@@ -9,6 +9,7 @@
9
9
  // against Oilpan types without including any other parts.
10
10
  #include <cstddef>
11
11
  #include <type_traits>
12
+ #include <utility>
12
13
 
13
14
  namespace cppgc {
14
15
 
@@ -8,12 +8,12 @@
8
8
  #include <type_traits>
9
9
 
10
10
  #include "cppgc/custom-space.h"
11
- #include "cppgc/ephemeron-pair.h"
12
11
  #include "cppgc/garbage-collected.h"
13
12
  #include "cppgc/internal/logging.h"
14
13
  #include "cppgc/internal/member-storage.h"
15
14
  #include "cppgc/internal/pointer-policies.h"
16
15
  #include "cppgc/liveness-broker.h"
16
+ #include "cppgc/macros.h"
17
17
  #include "cppgc/member.h"
18
18
  #include "cppgc/sentinel-pointer.h"
19
19
  #include "cppgc/source-location.h"
@@ -36,6 +36,25 @@ class VisitorFactory;
36
36
 
37
37
  using WeakCallback = void (*)(const LivenessBroker&, const void*);
38
38
 
39
+ /**
40
+ * An ephemeron pair is used to conditionally retain an object.
41
+ * The `value` will be kept alive only if the `key` is alive.
42
+ */
43
+ template <typename K, typename V>
44
+ struct EphemeronPair {
45
+ CPPGC_DISALLOW_NEW();
46
+
47
+ EphemeronPair(K* k, V* v) : key(k), value(v) {}
48
+ WeakMember<K> key;
49
+ Member<V> value;
50
+
51
+ void ClearValueIfKeyIsDead(const LivenessBroker& broker) {
52
+ if (!broker.IsHeapObjectAlive(key)) value = nullptr;
53
+ }
54
+
55
+ void Trace(Visitor* visitor) const;
56
+ };
57
+
39
58
  /**
40
59
  * Visitor passed to trace methods. All managed pointers must have called the
41
60
  * Visitor's trace method on them.
@@ -436,6 +455,11 @@ class V8_EXPORT Visitor {
436
455
  friend class internal::VisitorBase;
437
456
  };
438
457
 
458
+ template <typename K, typename V>
459
+ void EphemeronPair<K, V>::Trace(Visitor* visitor) const {
460
+ visitor->TraceEphemeron(key, value);
461
+ }
462
+
439
463
  namespace internal {
440
464
 
441
465
  class V8_EXPORT RootVisitor {
@@ -18,11 +18,11 @@
18
18
  #else // defined(_WIN32)
19
19
 
20
20
  // Setup for Linux shared library export.
21
- #ifdef BUILDING_V8_PLATFORM_SHARED
21
+ #if defined(BUILDING_V8_PLATFORM_SHARED) || USING_V8_PLATFORM_SHARED
22
22
  #define V8_PLATFORM_EXPORT __attribute__((visibility("default")))
23
23
  #else
24
24
  #define V8_PLATFORM_EXPORT
25
- #endif
25
+ #endif // defined(BUILDING_V8_PLATFORM_SHARED) || ...
26
26
 
27
27
  #endif // defined(_WIN32)
28
28
 
@@ -6,7 +6,6 @@
6
6
  #define V8_LIBPLATFORM_V8_TRACING_H_
7
7
 
8
8
  #include <atomic>
9
- #include <fstream>
10
9
  #include <memory>
11
10
  #include <unordered_set>
12
11
  #include <vector>
@@ -10,13 +10,20 @@
10
10
  #include <memory>
11
11
 
12
12
  #include "v8-local-handle.h" // NOLINT(build/include_directory)
13
+ #include "v8-memory-span.h" // NOLINT(build/include_directory)
13
14
  #include "v8-object.h" // NOLINT(build/include_directory)
15
+ #include "v8-platform.h" // NOLINT(build/include_directory)
14
16
  #include "v8config.h" // NOLINT(build/include_directory)
15
17
 
16
18
  namespace v8 {
17
19
 
18
20
  class SharedArrayBuffer;
19
21
 
22
+ #if defined(V8_COMPRESS_POINTERS) && \
23
+ !defined(V8_COMPRESS_POINTERS_IN_SHARED_CAGE)
24
+ class IsolateGroup;
25
+ #endif
26
+
20
27
  #ifndef V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT
21
28
  // Defined using gn arg `v8_array_buffer_internal_field_count`.
22
29
  #define V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT 2
@@ -24,6 +31,7 @@ class SharedArrayBuffer;
24
31
 
25
32
  enum class ArrayBufferCreationMode { kInternalized, kExternalized };
26
33
  enum class BackingStoreInitializationMode { kZeroInitialized, kUninitialized };
34
+ enum class BackingStoreOnFailureMode { kReturnNull, kOutOfMemory };
27
35
 
28
36
  /**
29
37
  * A wrapper around the backing store (i.e. the raw memory) of an array buffer.
@@ -83,18 +91,6 @@ class V8_EXPORT BackingStore : public v8::internal::BackingStoreBase {
83
91
  */
84
92
  void operator delete(void* ptr) { ::operator delete(ptr); }
85
93
 
86
- /**
87
- * Wrapper around ArrayBuffer::Allocator::Reallocate that preserves IsShared.
88
- * Assumes that the backing_store was allocated by the ArrayBuffer allocator
89
- * of the given isolate.
90
- */
91
- V8_DEPRECATED(
92
- "Reallocate is unsafe, please do not use. Please allocate a new "
93
- "BackingStore and copy instead.")
94
- static std::unique_ptr<BackingStore> Reallocate(
95
- v8::Isolate* isolate, std::unique_ptr<BackingStore> backing_store,
96
- size_t byte_length);
97
-
98
94
  /**
99
95
  * This callback is used only if the memory block for a BackingStore cannot be
100
96
  * allocated with an ArrayBuffer::Allocator. In such cases the destructor of
@@ -172,21 +168,13 @@ class V8_EXPORT ArrayBuffer : public Object {
172
168
  virtual void Free(void* data, size_t length) = 0;
173
169
 
174
170
  /**
175
- * Reallocate the memory block of size |old_length| to a memory block of
176
- * size |new_length| by expanding, contracting, or copying the existing
177
- * memory block. If |new_length| > |old_length|, then the new part of
178
- * the memory must be initialized to zeros. Return nullptr if reallocation
179
- * is not successful.
180
- *
181
- * The caller guarantees that the memory block was previously allocated
182
- * using Allocate or AllocateUninitialized.
183
- *
184
- * The default implementation allocates a new block and copies data.
171
+ * Returns a size_t that determines the largest ArrayBuffer that can be
172
+ * allocated. Override if your Allocator is more restrictive than the
173
+ * default. Will only be called once, and the value returned will be
174
+ * cached.
175
+ * Should not return a value that is larger than kMaxByteLength.
185
176
  */
186
- V8_DEPRECATED(
187
- "Reallocate is unsafe, please do not use. Please allocate new memory "
188
- "and copy instead.")
189
- virtual void* Reallocate(void* data, size_t old_length, size_t new_length);
177
+ virtual size_t MaxAllocationSize() const { return kMaxByteLength; }
190
178
 
191
179
  /**
192
180
  * ArrayBuffer allocation mode. kNormal is a malloc/free style allocation,
@@ -195,11 +183,37 @@ class V8_EXPORT ArrayBuffer : public Object {
195
183
  */
196
184
  enum class AllocationMode { kNormal, kReservation };
197
185
 
186
+ /**
187
+ * Returns page allocator used by this Allocator instance.
188
+ *
189
+ * When the sandbox used by Allocator it is expected that this returns
190
+ * sandbox's page allocator.
191
+ * Otherwise, it should return system page allocator.
192
+ */
193
+ virtual PageAllocator* GetPageAllocator() { return nullptr; }
194
+
195
+ #if defined(V8_COMPRESS_POINTERS) && \
196
+ !defined(V8_COMPRESS_POINTERS_IN_SHARED_CAGE)
198
197
  /**
199
198
  * Convenience allocator.
200
199
  *
201
200
  * When the sandbox is enabled, this allocator will allocate its backing
202
- * memory inside the sandbox. Otherwise, it will rely on malloc/free.
201
+ * memory inside the sandbox that belongs to passed isolate group.
202
+ * Otherwise, it will rely on malloc/free.
203
+ *
204
+ * Caller takes ownership, i.e. the returned object needs to be freed using
205
+ * |delete allocator| once it is no longer in use.
206
+ */
207
+ static Allocator* NewDefaultAllocator(const IsolateGroup& group);
208
+ #endif // defined(V8_COMPRESS_POINTERS) &&
209
+ // !defined(V8_COMPRESS_POINTERS_IN_SHARED_CAGE)
210
+
211
+ /**
212
+ * Convenience allocator.
213
+ *
214
+ * When the sandbox is enabled, this allocator will allocate its backing
215
+ * memory inside the default global sandbox. Otherwise, it will rely on
216
+ * malloc/free.
203
217
  *
204
218
  * Caller takes ownership, i.e. the returned object needs to be freed using
205
219
  * |delete allocator| once it is no longer in use.
@@ -217,6 +231,18 @@ class V8_EXPORT ArrayBuffer : public Object {
217
231
  */
218
232
  size_t MaxByteLength() const;
219
233
 
234
+ /**
235
+ * Attempt to create a new ArrayBuffer. Allocate |byte_length| bytes.
236
+ * Allocated memory will be owned by a created ArrayBuffer and
237
+ * will be deallocated when it is garbage-collected,
238
+ * unless the object is externalized. If allocation fails, the Maybe
239
+ * returned will be empty.
240
+ */
241
+ static MaybeLocal<ArrayBuffer> MaybeNew(
242
+ Isolate* isolate, size_t byte_length,
243
+ BackingStoreInitializationMode initialization_mode =
244
+ BackingStoreInitializationMode::kZeroInitialized);
245
+
220
246
  /**
221
247
  * Create a new ArrayBuffer. Allocate |byte_length| bytes, which are either
222
248
  * zero-initialized or uninitialized. Allocated memory will be owned by a
@@ -246,17 +272,25 @@ class V8_EXPORT ArrayBuffer : public Object {
246
272
  /**
247
273
  * Returns a new standalone BackingStore that is allocated using the array
248
274
  * buffer allocator of the isolate. The allocation can either be zero
249
- * intialized, or uninitialized. The result can be later passed to
275
+ * initialized, or uninitialized. The result can be later passed to
250
276
  * ArrayBuffer::New.
251
277
  *
252
278
  * If the allocator returns nullptr, then the function may cause GCs in the
253
- * given isolate and re-try the allocation. If GCs do not help, then the
279
+ * given isolate and re-try the allocation.
280
+ *
281
+ * If GCs do not help and on_failure is kOutOfMemory, then the
254
282
  * function will crash with an out-of-memory error.
283
+ *
284
+ * Otherwise if GCs do not help (or the allocation is too large for GCs to
285
+ * help) and on_failure is kReturnNull, then a null result is returned.
255
286
  */
256
287
  static std::unique_ptr<BackingStore> NewBackingStore(
257
288
  Isolate* isolate, size_t byte_length,
258
289
  BackingStoreInitializationMode initialization_mode =
259
- BackingStoreInitializationMode::kZeroInitialized);
290
+ BackingStoreInitializationMode::kZeroInitialized,
291
+ BackingStoreOnFailureMode on_failure =
292
+ BackingStoreOnFailureMode::kOutOfMemory);
293
+
260
294
  /**
261
295
  * Returns a new standalone BackingStore that takes over the ownership of
262
296
  * the given buffer. The destructor of the BackingStore invokes the given
@@ -354,9 +388,21 @@ class V8_EXPORT ArrayBuffer : public Object {
354
388
  V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT;
355
389
  static constexpr int kEmbedderFieldCount = kInternalFieldCount;
356
390
 
391
+ #if V8_ENABLE_SANDBOX
392
+ static constexpr size_t kMaxByteLength =
393
+ internal::kMaxSafeBufferSizeForSandbox;
394
+ #elif V8_HOST_ARCH_32_BIT
395
+ static constexpr size_t kMaxByteLength = std::numeric_limits<int>::max();
396
+ #else
397
+ // The maximum safe integer (2^53 - 1).
398
+ static constexpr size_t kMaxByteLength =
399
+ static_cast<size_t>((uint64_t{1} << 53) - 1);
400
+ #endif
401
+
357
402
  private:
358
403
  ArrayBuffer();
359
404
  static void CheckCast(Value* obj);
405
+ friend class TypedArray;
360
406
  };
361
407
 
362
408
  #ifndef V8_ARRAY_BUFFER_VIEW_INTERNAL_FIELD_COUNT
@@ -394,6 +440,16 @@ class V8_EXPORT ArrayBufferView : public Object {
394
440
  */
395
441
  size_t CopyContents(void* dest, size_t byte_length);
396
442
 
443
+ /**
444
+ * Returns the contents of the ArrayBufferView's buffer as a MemorySpan. If
445
+ * the contents are on the V8 heap, they get copied into `storage`. Otherwise
446
+ * a view into the off-heap backing store is returned. The provided storage
447
+ * should be at least as large as the maximum on-heap size of a TypedArray,
448
+ * was defined in gn with `typed_array_max_size_in_heap`. The default value is
449
+ * 64 bytes.
450
+ */
451
+ v8::MemorySpan<uint8_t> GetContents(v8::MemorySpan<uint8_t> storage);
452
+
397
453
  /**
398
454
  * Returns true if ArrayBufferView's backing ArrayBuffer has already been
399
455
  * allocated.
@@ -463,6 +519,18 @@ class V8_EXPORT SharedArrayBuffer : public Object {
463
519
  BackingStoreInitializationMode initialization_mode =
464
520
  BackingStoreInitializationMode::kZeroInitialized);
465
521
 
522
+ /**
523
+ * Create a new SharedArrayBuffer. Allocate |byte_length| bytes, which are
524
+ * either zero-initialized or uninitialized. Allocated memory will be owned by
525
+ * a created SharedArrayBuffer and will be deallocated when it is
526
+ * garbage-collected, unless the object is externalized. If allocation
527
+ * fails, the Maybe returned will be empty.
528
+ */
529
+ static MaybeLocal<SharedArrayBuffer> MaybeNew(
530
+ Isolate* isolate, size_t byte_length,
531
+ BackingStoreInitializationMode initialization_mode =
532
+ BackingStoreInitializationMode::kZeroInitialized);
533
+
466
534
  /**
467
535
  * Create a new SharedArrayBuffer with an existing backing store.
468
536
  * The created array keeps a reference to the backing store until the array
@@ -481,17 +549,26 @@ class V8_EXPORT SharedArrayBuffer : public Object {
481
549
  /**
482
550
  * Returns a new standalone BackingStore that is allocated using the array
483
551
  * buffer allocator of the isolate. The allocation can either be zero
484
- * intialized, or uninitialized. The result can be later passed to
552
+ * initialized, or uninitialized. The result can be later passed to
485
553
  * SharedArrayBuffer::New.
486
554
  *
487
555
  * If the allocator returns nullptr, then the function may cause GCs in the
488
- * given isolate and re-try the allocation. If GCs do not help, then the
489
- * function will crash with an out-of-memory error.
556
+ * given isolate and re-try the allocation.
557
+ *
558
+ * If on_failure is kOutOfMemory and GCs do not help, then the function will
559
+ * crash with an out-of-memory error.
560
+ *
561
+ * Otherwise, if on_failure is kReturnNull and GCs do not help (or the
562
+ * byte_length is so large that the allocation cannot succeed), then a null
563
+ * result is returned.
490
564
  */
491
565
  static std::unique_ptr<BackingStore> NewBackingStore(
492
566
  Isolate* isolate, size_t byte_length,
493
567
  BackingStoreInitializationMode initialization_mode =
494
- BackingStoreInitializationMode::kZeroInitialized);
568
+ BackingStoreInitializationMode::kZeroInitialized,
569
+ BackingStoreOnFailureMode on_failure =
570
+ BackingStoreOnFailureMode::kOutOfMemory);
571
+
495
572
  /**
496
573
  * Returns a new standalone BackingStore that takes over the ownership of
497
574
  * the given buffer. The destructor of the BackingStore invokes the given