libv8-node 22.7.0.4-x86_64-linux-musl → 24.1.0.0-x86_64-linux-musl

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/lib/libv8/node/version.rb +3 -3
  3. data/vendor/v8/include/cppgc/allocation.h +11 -13
  4. data/vendor/v8/include/cppgc/default-platform.h +3 -2
  5. data/vendor/v8/include/cppgc/garbage-collected.h +8 -0
  6. data/vendor/v8/include/cppgc/heap-consistency.h +1 -1
  7. data/vendor/v8/include/cppgc/heap-statistics.h +2 -0
  8. data/vendor/v8/include/cppgc/internal/api-constants.h +2 -14
  9. data/vendor/v8/include/cppgc/internal/base-page-handle.h +2 -4
  10. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +0 -4
  11. data/vendor/v8/include/cppgc/internal/caged-heap.h +0 -4
  12. data/vendor/v8/include/cppgc/internal/compiler-specific.h +9 -1
  13. data/vendor/v8/include/cppgc/internal/conditional-stack-allocated.h +41 -0
  14. data/vendor/v8/include/cppgc/internal/gc-info.h +12 -10
  15. data/vendor/v8/include/cppgc/internal/logging.h +3 -3
  16. data/vendor/v8/include/cppgc/internal/member-storage.h +69 -20
  17. data/vendor/v8/include/cppgc/internal/name-trait.h +5 -1
  18. data/vendor/v8/include/cppgc/internal/persistent-node.h +8 -3
  19. data/vendor/v8/include/cppgc/internal/pointer-policies.h +48 -11
  20. data/vendor/v8/include/cppgc/macros.h +21 -0
  21. data/vendor/v8/include/cppgc/member.h +70 -36
  22. data/vendor/v8/include/cppgc/name-provider.h +10 -0
  23. data/vendor/v8/include/cppgc/platform.h +11 -0
  24. data/vendor/v8/include/cppgc/type-traits.h +1 -0
  25. data/vendor/v8/include/cppgc/visitor.h +25 -1
  26. data/vendor/v8/include/libplatform/libplatform-export.h +2 -2
  27. data/vendor/v8/include/libplatform/v8-tracing.h +0 -1
  28. data/vendor/v8/include/v8-array-buffer.h +143 -46
  29. data/vendor/v8/include/v8-callbacks.h +94 -31
  30. data/vendor/v8/include/v8-context.h +48 -15
  31. data/vendor/v8/include/v8-cppgc.h +5 -56
  32. data/vendor/v8/include/v8-data.h +5 -0
  33. data/vendor/v8/include/v8-date.h +9 -0
  34. data/vendor/v8/include/v8-debug.h +11 -0
  35. data/vendor/v8/include/v8-embedder-heap.h +1 -29
  36. data/vendor/v8/include/v8-exception.h +72 -0
  37. data/vendor/v8/include/v8-external-memory-accounter.h +60 -0
  38. data/vendor/v8/include/v8-fast-api-calls.h +41 -206
  39. data/vendor/v8/include/v8-function-callback.h +190 -78
  40. data/vendor/v8/include/v8-function.h +11 -3
  41. data/vendor/v8/include/v8-handle-base.h +20 -2
  42. data/vendor/v8/include/v8-initialization.h +26 -1
  43. data/vendor/v8/include/v8-inspector.h +10 -3
  44. data/vendor/v8/include/v8-internal.h +638 -315
  45. data/vendor/v8/include/v8-isolate.h +275 -189
  46. data/vendor/v8/include/v8-local-handle.h +69 -42
  47. data/vendor/v8/include/v8-maybe.h +2 -1
  48. data/vendor/v8/include/v8-memory-span.h +149 -24
  49. data/vendor/v8/include/v8-message.h +9 -22
  50. data/vendor/v8/include/v8-metrics.h +14 -0
  51. data/vendor/v8/include/v8-microtask-queue.h +0 -5
  52. data/vendor/v8/include/v8-object.h +291 -37
  53. data/vendor/v8/include/v8-persistent-handle.h +17 -36
  54. data/vendor/v8/include/v8-platform.h +66 -45
  55. data/vendor/v8/include/v8-primitive.h +221 -5
  56. data/vendor/v8/include/v8-profiler.h +51 -2
  57. data/vendor/v8/include/v8-promise.h +2 -2
  58. data/vendor/v8/include/v8-proxy.h +0 -1
  59. data/vendor/v8/include/v8-regexp.h +0 -1
  60. data/vendor/v8/include/v8-sandbox.h +173 -0
  61. data/vendor/v8/include/v8-script.h +65 -17
  62. data/vendor/v8/include/v8-snapshot.h +38 -2
  63. data/vendor/v8/include/v8-source-location.h +6 -1
  64. data/vendor/v8/include/v8-template.h +111 -263
  65. data/vendor/v8/include/v8-trace-categories.h +23 -0
  66. data/vendor/v8/include/v8-traced-handle.h +20 -32
  67. data/vendor/v8/include/v8-typed-array.h +6 -10
  68. data/vendor/v8/include/v8-unwinder-state.h +2 -3
  69. data/vendor/v8/include/v8-unwinder.h +2 -1
  70. data/vendor/v8/include/v8-util.h +1 -117
  71. data/vendor/v8/include/v8-value-serializer-version.h +3 -3
  72. data/vendor/v8/include/v8-value.h +21 -2
  73. data/vendor/v8/include/v8-version.h +4 -4
  74. data/vendor/v8/include/v8-wasm.h +27 -0
  75. data/vendor/v8/include/v8-weak-callback-info.h +20 -12
  76. data/vendor/v8/include/v8.h +3 -3
  77. data/vendor/v8/include/v8config.h +83 -45
  78. data/vendor/v8/x86_64-linux-musl/libv8/obj/libv8_monolith.a +0 -0
  79. metadata +6 -3
  80. data/vendor/v8/include/cppgc/ephemeron-pair.h +0 -30
@@ -51,8 +51,6 @@ class Isolate;
51
51
  class Object;
52
52
  template <class F1, class F2, class F3>
53
53
  class PersistentValueMapBase;
54
- template <class F1, class F2>
55
- class PersistentValueVector;
56
54
  class Primitive;
57
55
  class Private;
58
56
  template <class F>
@@ -152,11 +150,11 @@ class V8_EXPORT V8_NODISCARD HandleScope {
152
150
 
153
151
  /**
154
152
  * A base class for local handles.
155
- * Its implementation depends on whether direct local support is enabled.
153
+ * Its implementation depends on whether direct handle support is enabled.
156
154
  * When it is, a local handle contains a direct pointer to the referenced
157
155
  * object, otherwise it contains an indirect pointer.
158
156
  */
159
- #ifdef V8_ENABLE_DIRECT_LOCAL
157
+ #ifdef V8_ENABLE_DIRECT_HANDLE
160
158
 
161
159
  template <typename T>
162
160
  class LocalBase : public api_internal::DirectHandleBase {
@@ -181,11 +179,17 @@ class LocalBase : public api_internal::DirectHandleBase {
181
179
  }
182
180
 
183
181
  V8_INLINE static LocalBase<T> FromSlot(internal::Address* slot) {
182
+ if (slot == nullptr) return LocalBase<T>();
184
183
  return LocalBase<T>(*slot);
185
184
  }
185
+
186
+ V8_INLINE static LocalBase<T> FromRepr(
187
+ internal::ValueHelper::InternalRepresentationType repr) {
188
+ return LocalBase<T>(repr);
189
+ }
186
190
  };
187
191
 
188
- #else // !V8_ENABLE_DIRECT_LOCAL
192
+ #else // !V8_ENABLE_DIRECT_HANDLE
189
193
 
190
194
  template <typename T>
191
195
  class LocalBase : public api_internal::IndirectHandleBase {
@@ -215,9 +219,14 @@ class LocalBase : public api_internal::IndirectHandleBase {
215
219
  V8_INLINE static LocalBase<T> FromSlot(internal::Address* slot) {
216
220
  return LocalBase<T>(slot);
217
221
  }
222
+
223
+ V8_INLINE static LocalBase<T> FromRepr(
224
+ internal::ValueHelper::InternalRepresentationType repr) {
225
+ return LocalBase<T>(repr);
226
+ }
218
227
  };
219
228
 
220
- #endif // V8_ENABLE_DIRECT_LOCAL
229
+ #endif // V8_ENABLE_DIRECT_HANDLE
221
230
 
222
231
  /**
223
232
  * An object reference managed by the v8 garbage collector.
@@ -257,17 +266,19 @@ class V8_TRIVIAL_ABI Local : public LocalBase<T>,
257
266
  #endif
258
267
  {
259
268
  public:
269
+ /**
270
+ * Default constructor: Returns an empty handle.
271
+ */
260
272
  V8_INLINE Local() = default;
261
273
 
274
+ /**
275
+ * Constructor for handling automatic up casting.
276
+ * Ex. Local<Object> can be passed when Local<Value> is expected but not
277
+ * the other way round.
278
+ */
262
279
  template <class S>
263
- V8_INLINE Local(Local<S> that) : LocalBase<T>(that) {
264
- /**
265
- * This check fails when trying to convert between incompatible
266
- * handles. For example, converting from a Local<String> to a
267
- * Local<Number>.
268
- */
269
- static_assert(std::is_base_of<T, S>::value, "type check");
270
- }
280
+ requires std::is_base_of_v<T, S>
281
+ V8_INLINE Local(Local<S> that) : LocalBase<T>(that) {}
271
282
 
272
283
  V8_INLINE T* operator->() const { return this->template value<T>(); }
273
284
 
@@ -307,7 +318,7 @@ class V8_TRIVIAL_ABI Local : public LocalBase<T>,
307
318
  /**
308
319
  * Cast a handle to a subclass, e.g. Local<Value> to Local<Object>.
309
320
  * This is only valid if the handle actually refers to a value of the
310
- * target type.
321
+ * target type or if the handle is empty.
311
322
  */
312
323
  template <class S>
313
324
  V8_INLINE static Local<T> Cast(Local<S> that) {
@@ -323,7 +334,7 @@ class V8_TRIVIAL_ABI Local : public LocalBase<T>,
323
334
  /**
324
335
  * Calling this is equivalent to Local<S>::Cast().
325
336
  * In particular, this is only valid if the handle actually refers to a value
326
- * of the target type.
337
+ * of the target type or if the handle is empty.
327
338
  */
328
339
  template <class S>
329
340
  V8_INLINE Local<S> As() const {
@@ -382,8 +393,6 @@ class V8_TRIVIAL_ABI Local : public LocalBase<T>,
382
393
  friend class InternalEscapableScope;
383
394
  template <class F1, class F2, class F3>
384
395
  friend class PersistentValueMapBase;
385
- template <class F1, class F2>
386
- friend class PersistentValueVector;
387
396
  template <class F>
388
397
  friend class ReturnValue;
389
398
  template <class F>
@@ -400,17 +409,22 @@ class V8_TRIVIAL_ABI Local : public LocalBase<T>,
400
409
 
401
410
  V8_INLINE explicit Local(const LocalBase<T>& other) : LocalBase<T>(other) {}
402
411
 
412
+ V8_INLINE static Local<T> FromRepr(
413
+ internal::ValueHelper::InternalRepresentationType repr) {
414
+ return Local<T>(LocalBase<T>::FromRepr(repr));
415
+ }
416
+
403
417
  V8_INLINE static Local<T> FromSlot(internal::Address* slot) {
404
418
  return Local<T>(LocalBase<T>::FromSlot(slot));
405
419
  }
406
420
 
407
- #ifdef V8_ENABLE_DIRECT_LOCAL
421
+ #ifdef V8_ENABLE_DIRECT_HANDLE
408
422
  friend class TypecheckWitness;
409
423
 
410
424
  V8_INLINE static Local<T> FromAddress(internal::Address ptr) {
411
425
  return Local<T>(LocalBase<T>(ptr));
412
426
  }
413
- #endif // V8_ENABLE_DIRECT_LOCAL
427
+ #endif // V8_ENABLE_DIRECT_HANDLE
414
428
 
415
429
  V8_INLINE static Local<T> New(Isolate* isolate, internal::Address value) {
416
430
  return Local<T>(LocalBase<T>::New(isolate, value));
@@ -438,17 +452,18 @@ class V8_TRIVIAL_ABI LocalUnchecked : public Local<T> {
438
452
  #if defined(V8_ENABLE_LOCAL_OFF_STACK_CHECK) && V8_HAS_ATTRIBUTE_TRIVIAL_ABI
439
453
  // In this case, the check is also enforced in the copy constructor and we
440
454
  // need to suppress it.
441
- LocalUnchecked(const LocalUnchecked& other)
455
+ LocalUnchecked(
456
+ const LocalUnchecked& other) noexcept // NOLINT(runtime/explicit)
442
457
  : Local<T>(other, Local<T>::do_not_check) {}
443
- LocalUnchecked& operator=(const LocalUnchecked&) = default;
458
+ LocalUnchecked& operator=(const LocalUnchecked&) noexcept = default;
444
459
  #endif
445
460
 
446
461
  // Implicit conversion from Local.
447
- LocalUnchecked(const Local<T>& other) // NOLINT(runtime/explicit)
462
+ LocalUnchecked(const Local<T>& other) noexcept // NOLINT(runtime/explicit)
448
463
  : Local<T>(other, Local<T>::do_not_check) {}
449
464
  };
450
465
 
451
- #ifdef V8_ENABLE_DIRECT_LOCAL
466
+ #ifdef V8_ENABLE_DIRECT_HANDLE
452
467
  // Off-stack allocated direct locals must be registered as strong roots.
453
468
  // For off-stack indirect locals, this is not necessary.
454
469
 
@@ -459,9 +474,9 @@ class StrongRootAllocator<LocalUnchecked<T>> : public StrongRootAllocatorBase {
459
474
  static_assert(std::is_standard_layout_v<value_type>);
460
475
  static_assert(sizeof(value_type) == sizeof(Address));
461
476
 
462
- explicit StrongRootAllocator(Heap* heap) : StrongRootAllocatorBase(heap) {}
463
- explicit StrongRootAllocator(v8::Isolate* isolate)
464
- : StrongRootAllocatorBase(isolate) {}
477
+ template <typename HeapOrIsolateT>
478
+ explicit StrongRootAllocator(HeapOrIsolateT* heap_or_isolate)
479
+ : StrongRootAllocatorBase(heap_or_isolate) {}
465
480
  template <typename U>
466
481
  StrongRootAllocator(const StrongRootAllocator<U>& other) noexcept
467
482
  : StrongRootAllocatorBase(other) {}
@@ -473,7 +488,7 @@ class StrongRootAllocator<LocalUnchecked<T>> : public StrongRootAllocatorBase {
473
488
  return deallocate_impl(reinterpret_cast<Address*>(p), n);
474
489
  }
475
490
  };
476
- #endif // V8_ENABLE_DIRECT_LOCAL
491
+ #endif // V8_ENABLE_DIRECT_HANDLE
477
492
  } // namespace internal
478
493
 
479
494
  template <typename T>
@@ -481,7 +496,7 @@ class LocalVector {
481
496
  private:
482
497
  using element_type = internal::LocalUnchecked<T>;
483
498
 
484
- #ifdef V8_ENABLE_DIRECT_LOCAL
499
+ #ifdef V8_ENABLE_DIRECT_HANDLE
485
500
  using allocator_type = internal::StrongRootAllocator<element_type>;
486
501
 
487
502
  static allocator_type make_allocator(Isolate* isolate) noexcept {
@@ -493,7 +508,7 @@ class LocalVector {
493
508
  static allocator_type make_allocator(Isolate* isolate) noexcept {
494
509
  return allocator_type();
495
510
  }
496
- #endif // V8_ENABLE_DIRECT_LOCAL
511
+ #endif // V8_ENABLE_DIRECT_HANDLE
497
512
 
498
513
  using vector_type = std::vector<element_type, allocator_type>;
499
514
 
@@ -560,13 +575,18 @@ class LocalVector {
560
575
 
561
576
  LocalVector<T>& operator=(std::initializer_list<Local<T>> init) {
562
577
  backing_.clear();
578
+ backing_.reserve(init.size());
563
579
  backing_.insert(backing_.end(), init.begin(), init.end());
564
580
  return *this;
565
581
  }
566
582
 
567
583
  void push_back(const Local<T>& x) { backing_.push_back(x); }
568
584
  void pop_back() { backing_.pop_back(); }
569
- void emplace_back(const Local<T>& x) { backing_.emplace_back(x); }
585
+
586
+ template <typename... Args>
587
+ void emplace_back(Args&&... args) {
588
+ backing_.push_back(value_type{std::forward<Args>(args)...});
589
+ }
570
590
 
571
591
  void clear() noexcept { backing_.clear(); }
572
592
  void resize(size_t n) { backing_.resize(n); }
@@ -614,9 +634,22 @@ using Handle = Local<T>;
614
634
  template <class T>
615
635
  class MaybeLocal {
616
636
  public:
617
- V8_INLINE MaybeLocal() : local_() {}
637
+ /**
638
+ * Default constructor: Returns an empty handle.
639
+ */
640
+ V8_INLINE MaybeLocal() = default;
641
+ /**
642
+ * Implicitly construct MaybeLocal from Local.
643
+ */
618
644
  template <class S>
645
+ requires std::is_base_of_v<T, S>
619
646
  V8_INLINE MaybeLocal(Local<S> that) : local_(that) {}
647
+ /**
648
+ * Implicitly up-cast MaybeLocal<S> to MaybeLocal<T> if T is a base of S.
649
+ */
650
+ template <class S>
651
+ requires std::is_base_of_v<T, S>
652
+ V8_INLINE MaybeLocal(MaybeLocal<S> that) : local_(that.local_) {}
620
653
 
621
654
  V8_INLINE bool IsEmpty() const { return local_.IsEmpty(); }
622
655
 
@@ -651,23 +684,17 @@ class MaybeLocal {
651
684
  /**
652
685
  * Cast a handle to a subclass, e.g. MaybeLocal<Value> to MaybeLocal<Object>.
653
686
  * This is only valid if the handle actually refers to a value of the target
654
- * type.
687
+ * type or if the handle is empty.
655
688
  */
656
689
  template <class S>
657
690
  V8_INLINE static MaybeLocal<T> Cast(MaybeLocal<S> that) {
658
- #ifdef V8_ENABLE_CHECKS
659
- // If we're going to perform the type check then we have to check
660
- // that the handle isn't empty before doing the checked cast.
661
- if (that.IsEmpty()) return MaybeLocal<T>();
662
- T::Cast(that.local_.template value<S>());
663
- #endif
664
- return MaybeLocal<T>(that.local_);
691
+ return MaybeLocal<T>{Local<T>::Cast(that.local_)};
665
692
  }
666
693
 
667
694
  /**
668
695
  * Calling this is equivalent to MaybeLocal<S>::Cast().
669
696
  * In particular, this is only valid if the handle actually refers to a value
670
- * of the target type.
697
+ * of the target type or if the handle is empty.
671
698
  */
672
699
  template <class S>
673
700
  V8_INLINE MaybeLocal<S> As() const {
@@ -716,7 +743,7 @@ class V8_EXPORT V8_NODISCARD EscapableHandleScope
716
743
  V8_INLINE ~EscapableHandleScope() = default;
717
744
  template <class T>
718
745
  V8_INLINE Local<T> Escape(Local<T> value) {
719
- #ifdef V8_ENABLE_DIRECT_LOCAL
746
+ #ifdef V8_ENABLE_DIRECT_HANDLE
720
747
  return value;
721
748
  #else
722
749
  if (value.IsEmpty()) return value;
@@ -8,6 +8,7 @@
8
8
  #include <type_traits>
9
9
  #include <utility>
10
10
 
11
+ #include "cppgc/internal/conditional-stack-allocated.h" // NOLINT(build/include_directory)
11
12
  #include "v8-internal.h" // NOLINT(build/include_directory)
12
13
  #include "v8config.h" // NOLINT(build/include_directory)
13
14
 
@@ -29,7 +30,7 @@ V8_EXPORT void FromJustIsNothing();
29
30
  * "Nothing" value is returned.
30
31
  */
31
32
  template <class T>
32
- class Maybe {
33
+ class Maybe : public cppgc::internal::ConditionalStackAllocatedBase<T> {
33
34
  public:
34
35
  V8_INLINE bool IsNothing() const { return !has_value_; }
35
36
  V8_INLINE bool IsJust() const { return has_value_; }
@@ -8,11 +8,46 @@
8
8
  #include <stddef.h>
9
9
 
10
10
  #include <array>
11
+ #include <cstddef>
11
12
  #include <iterator>
12
13
  #include <type_traits>
13
14
 
14
15
  #include "v8config.h" // NOLINT(build/include_directory)
15
16
 
17
+ // TODO(pkasting): Use <compare>/spaceship unconditionally after dropping
18
+ // support for old libstdc++ versions.
19
+ #if __has_include(<version>)
20
+ #include <version>
21
+ #endif
22
+ #if defined(__cpp_lib_three_way_comparison) && \
23
+ __cpp_lib_three_way_comparison >= 201711L
24
+ #define V8_HAVE_SPACESHIP_OPERATOR 1
25
+ #else
26
+ #define V8_HAVE_SPACESHIP_OPERATOR 0
27
+ #endif
28
+
29
+ // TODO(pkasting): Make this block unconditional after dropping support for old
30
+ // libstdc++ versions.
31
+ #if __has_include(<ranges>)
32
+ #include <ranges>
33
+
34
+ namespace v8 {
35
+
36
+ template <typename T>
37
+ class V8_EXPORT MemorySpan;
38
+
39
+ } // namespace v8
40
+
41
+ // Mark `MemorySpan` as satisfying the `view` and `borrowed_range` concepts.
42
+ // This should be done before the definition of `MemorySpan`, so that any
43
+ // inlined calls to range functionality use the correct specializations.
44
+ template <typename T>
45
+ inline constexpr bool std::ranges::enable_view<v8::MemorySpan<T>> = true;
46
+ template <typename T>
47
+ inline constexpr bool std::ranges::enable_borrowed_range<v8::MemorySpan<T>> =
48
+ true;
49
+ #endif
50
+
16
51
  namespace v8 {
17
52
 
18
53
  /**
@@ -53,13 +88,13 @@ class V8_EXPORT MemorySpan {
53
88
  is_compatible_iterator<It>::value;
54
89
 
55
90
  template <typename U>
56
- static constexpr U* to_address(U* p) noexcept {
91
+ [[nodiscard]] static constexpr U* to_address(U* p) noexcept {
57
92
  return p;
58
93
  }
59
94
 
60
95
  template <typename It,
61
96
  typename = std::void_t<decltype(std::declval<It&>().operator->())>>
62
- static constexpr auto to_address(It it) noexcept {
97
+ [[nodiscard]] static constexpr auto to_address(It it) noexcept {
63
98
  return it.operator->();
64
99
  }
65
100
 
@@ -108,50 +143,139 @@ class V8_EXPORT MemorySpan {
108
143
  : data_(a.data()), size_{N} {}
109
144
 
110
145
  /** Returns a pointer to the beginning of the buffer. */
111
- constexpr T* data() const { return data_; }
146
+ [[nodiscard]] constexpr T* data() const { return data_; }
112
147
  /** Returns the number of elements that the buffer holds. */
113
- constexpr size_t size() const { return size_; }
148
+ [[nodiscard]] constexpr size_t size() const { return size_; }
114
149
 
115
- constexpr T& operator[](size_t i) const { return data_[i]; }
150
+ [[nodiscard]] constexpr T& operator[](size_t i) const { return data_[i]; }
116
151
 
117
152
  /** Returns true if the buffer is empty. */
118
- constexpr bool empty() const { return size() == 0; }
153
+ [[nodiscard]] constexpr bool empty() const { return size() == 0; }
119
154
 
120
155
  class Iterator {
121
156
  public:
122
- using iterator_category = std::forward_iterator_tag;
123
- using value_type = T;
124
157
  using difference_type = std::ptrdiff_t;
158
+ using value_type = T;
125
159
  using pointer = value_type*;
126
160
  using reference = value_type&;
161
+ using iterator_category = std::random_access_iterator_tag;
162
+ // There seems to be no feature-test macro covering this, so use the
163
+ // presence of `<ranges>` as a crude proxy, since it was added to the
164
+ // standard as part of the Ranges papers.
165
+ // TODO(pkasting): Add this unconditionally after dropping support for old
166
+ // libstdc++ versions.
167
+ #if __has_include(<ranges>)
168
+ using iterator_concept = std::contiguous_iterator_tag;
169
+ #endif
170
+
171
+ // Required to satisfy `std::semiregular<>`.
172
+ constexpr Iterator() = default;
173
+
174
+ [[nodiscard]] friend constexpr bool operator==(const Iterator& a,
175
+ const Iterator& b) {
176
+ // TODO(pkasting): Replace this body with `= default` after dropping
177
+ // support for old gcc versions.
178
+ return a.ptr_ == b.ptr_;
179
+ }
180
+ #if V8_HAVE_SPACESHIP_OPERATOR
181
+ [[nodiscard]] friend constexpr auto operator<=>(const Iterator&,
182
+ const Iterator&) = default;
183
+ #else
184
+ // Assume that if spaceship isn't present, operator rewriting might not be
185
+ // either.
186
+ [[nodiscard]] friend constexpr bool operator!=(const Iterator& a,
187
+ const Iterator& b) {
188
+ return a.ptr_ != b.ptr_;
189
+ }
127
190
 
128
- T& operator*() const { return *ptr_; }
129
- T* operator->() const { return ptr_; }
130
-
131
- bool operator==(Iterator other) const { return ptr_ == other.ptr_; }
132
- bool operator!=(Iterator other) const { return !(*this == other); }
191
+ [[nodiscard]] friend constexpr bool operator<(const Iterator& a,
192
+ const Iterator& b) {
193
+ return a.ptr_ < b.ptr_;
194
+ }
195
+ [[nodiscard]] friend constexpr bool operator<=(const Iterator& a,
196
+ const Iterator& b) {
197
+ return a.ptr_ <= b.ptr_;
198
+ }
199
+ [[nodiscard]] friend constexpr bool operator>(const Iterator& a,
200
+ const Iterator& b) {
201
+ return a.ptr_ > b.ptr_;
202
+ }
203
+ [[nodiscard]] friend constexpr bool operator>=(const Iterator& a,
204
+ const Iterator& b) {
205
+ return a.ptr_ >= b.ptr_;
206
+ }
207
+ #endif
133
208
 
134
- Iterator& operator++() {
209
+ constexpr Iterator& operator++() {
135
210
  ++ptr_;
136
211
  return *this;
137
212
  }
138
213
 
139
- Iterator operator++(int) {
140
- Iterator temp(*this);
141
- ++(*this);
214
+ constexpr Iterator operator++(int) {
215
+ Iterator temp = *this;
216
+ ++*this;
142
217
  return temp;
143
218
  }
144
219
 
220
+ constexpr Iterator& operator--() {
221
+ --ptr_;
222
+ return *this;
223
+ }
224
+
225
+ constexpr Iterator operator--(int) {
226
+ Iterator temp = *this;
227
+ --*this;
228
+ return temp;
229
+ }
230
+
231
+ constexpr Iterator& operator+=(difference_type rhs) {
232
+ ptr_ += rhs;
233
+ return *this;
234
+ }
235
+
236
+ [[nodiscard]] friend constexpr Iterator operator+(Iterator lhs,
237
+ difference_type rhs) {
238
+ lhs += rhs;
239
+ return lhs;
240
+ }
241
+
242
+ [[nodiscard]] friend constexpr Iterator operator+(difference_type lhs,
243
+ const Iterator& rhs) {
244
+ return rhs + lhs;
245
+ }
246
+
247
+ constexpr Iterator& operator-=(difference_type rhs) {
248
+ ptr_ -= rhs;
249
+ return *this;
250
+ }
251
+
252
+ [[nodiscard]] friend constexpr Iterator operator-(Iterator lhs,
253
+ difference_type rhs) {
254
+ lhs -= rhs;
255
+ return lhs;
256
+ }
257
+
258
+ [[nodiscard]] friend constexpr difference_type operator-(
259
+ const Iterator& lhs, const Iterator& rhs) {
260
+ return lhs.ptr_ - rhs.ptr_;
261
+ }
262
+
263
+ [[nodiscard]] constexpr reference operator*() const { return *ptr_; }
264
+ [[nodiscard]] constexpr pointer operator->() const { return ptr_; }
265
+ [[nodiscard]] constexpr reference operator[](size_t offset) const {
266
+ return ptr_[offset];
267
+ }
268
+
145
269
  private:
146
270
  friend class MemorySpan<T>;
147
271
 
148
- explicit Iterator(T* ptr) : ptr_(ptr) {}
272
+ constexpr explicit Iterator(T* ptr) : ptr_(ptr) {}
149
273
 
150
274
  T* ptr_ = nullptr;
151
275
  };
152
276
 
153
- Iterator begin() const { return Iterator(data_); }
154
- Iterator end() const { return Iterator(data_ + size_); }
277
+ [[nodiscard]] Iterator begin() const { return Iterator(data_); }
278
+ [[nodiscard]] Iterator end() const { return Iterator(data_ + size_); }
155
279
 
156
280
  private:
157
281
  T* data_ = nullptr;
@@ -171,25 +295,26 @@ class V8_EXPORT MemorySpan {
171
295
 
172
296
  namespace detail {
173
297
  template <class T, std::size_t N, std::size_t... I>
174
- constexpr std::array<std::remove_cv_t<T>, N> to_array_lvalue_impl(
298
+ [[nodiscard]] constexpr std::array<std::remove_cv_t<T>, N> to_array_lvalue_impl(
175
299
  T (&a)[N], std::index_sequence<I...>) {
176
300
  return {{a[I]...}};
177
301
  }
178
302
 
179
303
  template <class T, std::size_t N, std::size_t... I>
180
- constexpr std::array<std::remove_cv_t<T>, N> to_array_rvalue_impl(
304
+ [[nodiscard]] constexpr std::array<std::remove_cv_t<T>, N> to_array_rvalue_impl(
181
305
  T (&&a)[N], std::index_sequence<I...>) {
182
306
  return {{std::move(a[I])...}};
183
307
  }
184
308
  } // namespace detail
185
309
 
186
310
  template <class T, std::size_t N>
187
- constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N]) {
311
+ [[nodiscard]] constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N]) {
188
312
  return detail::to_array_lvalue_impl(a, std::make_index_sequence<N>{});
189
313
  }
190
314
 
191
315
  template <class T, std::size_t N>
192
- constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&&a)[N]) {
316
+ [[nodiscard]] constexpr std::array<std::remove_cv_t<T>, N> to_array(
317
+ T (&&a)[N]) {
193
318
  return detail::to_array_rvalue_impl(std::move(a),
194
319
  std::make_index_sequence<N>{});
195
320
  }
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include <iosfwd>
11
11
 
12
+ #include "v8-callbacks.h" // NOLINT(build/include_directory)
12
13
  #include "v8-local-handle.h" // NOLINT(build/include_directory)
13
14
  #include "v8-maybe.h" // NOLINT(build/include_directory)
14
15
  #include "v8-primitive.h" // NOLINT(build/include_directory)
@@ -61,27 +62,6 @@ class ScriptOriginOptions {
61
62
  */
62
63
  class V8_EXPORT ScriptOrigin {
63
64
  public:
64
- V8_DEPRECATE_SOON("Use constructor without the isolate.")
65
- V8_INLINE ScriptOrigin(Isolate* isolate, Local<Value> resource_name,
66
- int resource_line_offset = 0,
67
- int resource_column_offset = 0,
68
- bool resource_is_shared_cross_origin = false,
69
- int script_id = -1,
70
- Local<Value> source_map_url = Local<Value>(),
71
- bool resource_is_opaque = false, bool is_wasm = false,
72
- bool is_module = false,
73
- Local<Data> host_defined_options = Local<Data>())
74
- : resource_name_(resource_name),
75
- resource_line_offset_(resource_line_offset),
76
- resource_column_offset_(resource_column_offset),
77
- options_(resource_is_shared_cross_origin, resource_is_opaque, is_wasm,
78
- is_module),
79
- script_id_(script_id),
80
- source_map_url_(source_map_url),
81
- host_defined_options_(host_defined_options) {
82
- VerifyHostDefinedOptions();
83
- }
84
-
85
65
  V8_INLINE ScriptOrigin(Local<Value> resource_name,
86
66
  int resource_line_offset = 0,
87
67
  int resource_column_offset = 0,
@@ -206,7 +186,14 @@ class V8_EXPORT Message {
206
186
  bool IsSharedCrossOrigin() const;
207
187
  bool IsOpaque() const;
208
188
 
209
- static void PrintCurrentStackTrace(Isolate* isolate, std::ostream& out);
189
+ /**
190
+ * If provided, the callback can be used to selectively include
191
+ * or redact frames based on their script names. (true to include a frame)
192
+ */
193
+ static void PrintCurrentStackTrace(
194
+ Isolate* isolate, std::ostream& out,
195
+ PrintCurrentStackTraceFilterCallback should_include_frame_callback =
196
+ nullptr);
210
197
 
211
198
  static const int kNoLineNumberInfo = 0;
212
199
  static const int kNoColumnInfo = 0;
@@ -8,9 +8,11 @@
8
8
  #include <stddef.h>
9
9
  #include <stdint.h>
10
10
 
11
+ #include <optional>
11
12
  #include <vector>
12
13
 
13
14
  #include "v8-internal.h" // NOLINT(build/include_directory)
15
+ #include "v8-isolate.h" // NOLINT(build/include_directory)
14
16
  #include "v8-local-handle.h" // NOLINT(build/include_directory)
15
17
  #include "v8config.h" // NOLINT(build/include_directory)
16
18
 
@@ -37,6 +39,10 @@ struct GarbageCollectionSizes {
37
39
 
38
40
  struct GarbageCollectionFullCycle {
39
41
  int reason = -1;
42
+ // The priority of the isolate during the GC cycle. A nullopt value denotes a
43
+ // mixed priority cycle, meaning the Isolate's priority was changed while the
44
+ // cycle was in progress.
45
+ std::optional<v8::Isolate::Priority> priority = std::nullopt;
40
46
  GarbageCollectionPhases total;
41
47
  GarbageCollectionPhases total_cpp;
42
48
  GarbageCollectionPhases main_thread;
@@ -55,6 +61,10 @@ struct GarbageCollectionFullCycle {
55
61
  double efficiency_cpp_in_bytes_per_us = -1.0;
56
62
  double main_thread_efficiency_in_bytes_per_us = -1.0;
57
63
  double main_thread_efficiency_cpp_in_bytes_per_us = -1.0;
64
+ double collection_weight_in_percent = -1.0;
65
+ double collection_weight_cpp_in_percent = -1.0;
66
+ double main_thread_collection_weight_in_percent = -1.0;
67
+ double main_thread_collection_weight_cpp_in_percent = -1.0;
58
68
  int64_t incremental_marking_start_stop_wall_clock_duration_in_us = -1;
59
69
  };
60
70
 
@@ -82,6 +92,10 @@ using GarbageCollectionFullMainThreadBatchedIncrementalSweep =
82
92
 
83
93
  struct GarbageCollectionYoungCycle {
84
94
  int reason = -1;
95
+ // The priority of the isolate during the GC cycle. A nullopt value denotes a
96
+ // mixed priority cycle, meaning the Isolate's priority was changed while the
97
+ // cycle was in progress.
98
+ std::optional<v8::Isolate::Priority> priority = std::nullopt;
85
99
  int64_t total_wall_clock_duration_in_us = -1;
86
100
  int64_t main_thread_wall_clock_duration_in_us = -1;
87
101
  double collection_rate_in_percent = -1.0;
@@ -118,11 +118,6 @@ class V8_EXPORT V8_NODISCARD MicrotasksScope {
118
118
  public:
119
119
  enum Type { kRunMicrotasks, kDoNotRunMicrotasks };
120
120
 
121
- V8_DEPRECATE_SOON(
122
- "May be incorrect if context was created with non-default microtask "
123
- "queue")
124
- MicrotasksScope(Isolate* isolate, Type type);
125
-
126
121
  MicrotasksScope(Local<Context> context, Type type);
127
122
  MicrotasksScope(Isolate* isolate, MicrotaskQueue* microtask_queue, Type type);
128
123
  ~MicrotasksScope();