libv8-node 18.13.0.0-x86_64-linux → 19.9.0.0-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libv8-node/location.rb +1 -1
  3. data/lib/libv8/node/version.rb +3 -3
  4. data/vendor/v8/include/cppgc/common.h +0 -1
  5. data/vendor/v8/include/cppgc/cross-thread-persistent.h +7 -8
  6. data/vendor/v8/include/cppgc/heap-consistency.h +46 -3
  7. data/vendor/v8/include/cppgc/heap-handle.h +43 -0
  8. data/vendor/v8/include/cppgc/heap-statistics.h +2 -2
  9. data/vendor/v8/include/cppgc/heap.h +3 -7
  10. data/vendor/v8/include/cppgc/internal/api-constants.h +11 -1
  11. data/vendor/v8/include/cppgc/internal/base-page-handle.h +45 -0
  12. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +40 -8
  13. data/vendor/v8/include/cppgc/internal/caged-heap.h +61 -0
  14. data/vendor/v8/include/cppgc/internal/gc-info.h +0 -1
  15. data/vendor/v8/include/cppgc/internal/member-storage.h +236 -0
  16. data/vendor/v8/include/cppgc/internal/name-trait.h +21 -6
  17. data/vendor/v8/include/cppgc/internal/persistent-node.h +11 -13
  18. data/vendor/v8/include/cppgc/internal/pointer-policies.h +28 -7
  19. data/vendor/v8/include/cppgc/internal/write-barrier.h +143 -101
  20. data/vendor/v8/include/cppgc/liveness-broker.h +8 -7
  21. data/vendor/v8/include/cppgc/member.h +364 -89
  22. data/vendor/v8/include/cppgc/name-provider.h +4 -4
  23. data/vendor/v8/include/cppgc/persistent.h +5 -9
  24. data/vendor/v8/include/cppgc/platform.h +2 -2
  25. data/vendor/v8/include/cppgc/sentinel-pointer.h +1 -1
  26. data/vendor/v8/include/cppgc/trace-trait.h +4 -0
  27. data/vendor/v8/include/cppgc/type-traits.h +9 -0
  28. data/vendor/v8/include/cppgc/visitor.h +89 -57
  29. data/vendor/v8/include/v8-callbacks.h +19 -5
  30. data/vendor/v8/include/v8-context.h +13 -8
  31. data/vendor/v8/include/v8-cppgc.h +12 -0
  32. data/vendor/v8/include/v8-date.h +5 -0
  33. data/vendor/v8/include/v8-embedder-heap.h +8 -3
  34. data/vendor/v8/include/v8-exception.h +1 -1
  35. data/vendor/v8/include/v8-fast-api-calls.h +46 -32
  36. data/vendor/v8/include/v8-function.h +8 -0
  37. data/vendor/v8/include/v8-initialization.h +23 -49
  38. data/vendor/v8/include/v8-inspector.h +13 -7
  39. data/vendor/v8/include/v8-internal.h +328 -123
  40. data/vendor/v8/include/v8-isolate.h +27 -42
  41. data/vendor/v8/include/v8-local-handle.h +5 -5
  42. data/vendor/v8/include/v8-locker.h +0 -11
  43. data/vendor/v8/include/v8-maybe.h +24 -1
  44. data/vendor/v8/include/v8-message.h +2 -4
  45. data/vendor/v8/include/v8-metrics.h +20 -38
  46. data/vendor/v8/include/v8-microtask-queue.h +1 -1
  47. data/vendor/v8/include/v8-object.h +8 -15
  48. data/vendor/v8/include/v8-persistent-handle.h +0 -2
  49. data/vendor/v8/include/v8-platform.h +54 -25
  50. data/vendor/v8/include/v8-primitive.h +8 -8
  51. data/vendor/v8/include/v8-profiler.h +84 -22
  52. data/vendor/v8/include/v8-regexp.h +2 -1
  53. data/vendor/v8/include/v8-script.h +62 -6
  54. data/vendor/v8/include/v8-template.h +13 -76
  55. data/vendor/v8/include/v8-unwinder-state.h +4 -4
  56. data/vendor/v8/include/v8-util.h +2 -4
  57. data/vendor/v8/include/v8-value-serializer.h +46 -23
  58. data/vendor/v8/include/v8-version.h +3 -3
  59. data/vendor/v8/include/v8-wasm.h +5 -62
  60. data/vendor/v8/include/v8-weak-callback-info.h +0 -7
  61. data/vendor/v8/include/v8config.h +280 -13
  62. data/vendor/v8/x86_64-linux/libv8/obj/libv8_monolith.a +0 -0
  63. metadata +9 -5
@@ -194,6 +194,11 @@ enum RAILMode : unsigned {
194
194
  */
195
195
  enum class MemoryPressureLevel { kNone, kModerate, kCritical };
196
196
 
197
+ /**
198
+ * Indicator for the stack state.
199
+ */
200
+ using StackState = cppgc::EmbedderStackState;
201
+
197
202
  /**
198
203
  * Isolate represents an isolated instance of the V8 engine. V8 isolates have
199
204
  * completely separate states. Objects from one isolate must not be used in
@@ -211,6 +216,8 @@ class V8_EXPORT Isolate {
211
216
  CreateParams();
212
217
  ~CreateParams();
213
218
 
219
+ ALLOW_COPY_AND_MOVE_WITH_DEPRECATED_FIELDS(CreateParams)
220
+
214
221
  /**
215
222
  * Allows the host application to provide the address of a function that is
216
223
  * notified each time code is added, moved or removed.
@@ -287,12 +294,6 @@ class V8_EXPORT Isolate {
287
294
  */
288
295
  FatalErrorCallback fatal_error_callback = nullptr;
289
296
  OOMErrorCallback oom_error_callback = nullptr;
290
-
291
- /**
292
- * The following parameter is experimental and may change significantly.
293
- * This is currently for internal testing.
294
- */
295
- Isolate* experimental_attach_to_shared_isolate = nullptr;
296
297
  };
297
298
 
298
299
  /**
@@ -301,16 +302,18 @@ class V8_EXPORT Isolate {
301
302
  */
302
303
  class V8_EXPORT V8_NODISCARD Scope {
303
304
  public:
304
- explicit Scope(Isolate* isolate) : isolate_(isolate) { isolate->Enter(); }
305
+ explicit Scope(Isolate* isolate) : v8_isolate_(isolate) {
306
+ v8_isolate_->Enter();
307
+ }
305
308
 
306
- ~Scope() { isolate_->Exit(); }
309
+ ~Scope() { v8_isolate_->Exit(); }
307
310
 
308
311
  // Prevent copying of Scope objects.
309
312
  Scope(const Scope&) = delete;
310
313
  Scope& operator=(const Scope&) = delete;
311
314
 
312
315
  private:
313
- Isolate* const isolate_;
316
+ Isolate* const v8_isolate_;
314
317
  };
315
318
 
316
319
  /**
@@ -331,7 +334,7 @@ class V8_EXPORT Isolate {
331
334
 
332
335
  private:
333
336
  OnFailure on_failure_;
334
- Isolate* isolate_;
337
+ v8::Isolate* v8_isolate_;
335
338
 
336
339
  bool was_execution_allowed_assert_;
337
340
  bool was_execution_allowed_throws_;
@@ -353,7 +356,7 @@ class V8_EXPORT Isolate {
353
356
  const AllowJavascriptExecutionScope&) = delete;
354
357
 
355
358
  private:
356
- Isolate* isolate_;
359
+ Isolate* v8_isolate_;
357
360
  bool was_execution_allowed_assert_;
358
361
  bool was_execution_allowed_throws_;
359
362
  bool was_execution_allowed_dump_;
@@ -376,7 +379,7 @@ class V8_EXPORT Isolate {
376
379
  const SuppressMicrotaskExecutionScope&) = delete;
377
380
 
378
381
  private:
379
- internal::Isolate* const isolate_;
382
+ internal::Isolate* const i_isolate_;
380
383
  internal::MicrotaskQueue* const microtask_queue_;
381
384
  internal::Address previous_stack_height_;
382
385
 
@@ -389,7 +392,7 @@ class V8_EXPORT Isolate {
389
392
  */
390
393
  class V8_EXPORT V8_NODISCARD SafeForTerminationScope {
391
394
  public:
392
- explicit SafeForTerminationScope(v8::Isolate* isolate);
395
+ explicit SafeForTerminationScope(v8::Isolate* v8_isolate);
393
396
  ~SafeForTerminationScope();
394
397
 
395
398
  // Prevent copying of Scope objects.
@@ -397,7 +400,7 @@ class V8_EXPORT Isolate {
397
400
  SafeForTerminationScope& operator=(const SafeForTerminationScope&) = delete;
398
401
 
399
402
  private:
400
- internal::Isolate* isolate_;
403
+ internal::Isolate* i_isolate_;
401
404
  bool prev_value_;
402
405
  };
403
406
 
@@ -531,6 +534,9 @@ class V8_EXPORT Isolate {
531
534
  kInvalidatedMegaDOMProtector = 112,
532
535
  kFunctionPrototypeArguments = 113,
533
536
  kFunctionPrototypeCaller = 114,
537
+ kTurboFanOsrCompileStarted = 115,
538
+ kAsyncStackTaggingCreateTaskCall = 116,
539
+ kDurationFormat = 117,
534
540
 
535
541
  // If you add new values here, you'll also need to update Chromium's:
536
542
  // web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
@@ -636,9 +642,6 @@ class V8_EXPORT Isolate {
636
642
  * This specifies the callback called by the upcoming dynamic
637
643
  * import() language feature to load modules.
638
644
  */
639
- V8_DEPRECATED("Use HostImportModuleDynamicallyCallback")
640
- void SetHostImportModuleDynamicallyCallback(
641
- HostImportModuleDynamicallyWithImportAssertionsCallback callback);
642
645
  void SetHostImportModuleDynamicallyCallback(
643
646
  HostImportModuleDynamicallyCallback callback);
644
647
 
@@ -839,12 +842,6 @@ class V8_EXPORT Isolate {
839
842
  */
840
843
  int64_t AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes);
841
844
 
842
- /**
843
- * Returns the number of phantom handles without callbacks that were reset
844
- * by the garbage collector since the last call to this function.
845
- */
846
- size_t NumberOfPhantomHandleResetsSinceLastCall();
847
-
848
845
  /**
849
846
  * Returns heap profiler for this isolate. Will return NULL until the isolate
850
847
  * is initialized.
@@ -927,6 +924,7 @@ class V8_EXPORT Isolate {
927
924
  void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr);
928
925
  void RemoveGCPrologueCallback(GCCallback callback);
929
926
 
927
+ START_ALLOW_USE_DEPRECATED()
930
928
  /**
931
929
  * Sets the embedder heap tracer for the isolate.
932
930
  * SetEmbedderHeapTracer cannot be used simultaneously with AttachCppHeap.
@@ -938,6 +936,7 @@ class V8_EXPORT Isolate {
938
936
  * SetEmbedderHeapTracer.
939
937
  */
940
938
  EmbedderHeapTracer* GetEmbedderHeapTracer();
939
+ END_ALLOW_USE_DEPRECATED()
941
940
 
942
941
  /**
943
942
  * Sets an embedder roots handle that V8 should consider when performing
@@ -1163,9 +1162,8 @@ class V8_EXPORT Isolate {
1163
1162
  * LowMemoryNotification() instead to influence the garbage collection
1164
1163
  * schedule.
1165
1164
  */
1166
- void RequestGarbageCollectionForTesting(
1167
- GarbageCollectionType type,
1168
- EmbedderHeapTracer::EmbedderStackState stack_state);
1165
+ void RequestGarbageCollectionForTesting(GarbageCollectionType type,
1166
+ StackState stack_state);
1169
1167
 
1170
1168
  /**
1171
1169
  * Set the callback to invoke for logging event.
@@ -1523,15 +1521,15 @@ class V8_EXPORT Isolate {
1523
1521
 
1524
1522
  void SetWasmStreamingCallback(WasmStreamingCallback callback);
1525
1523
 
1524
+ void SetWasmAsyncResolvePromiseCallback(
1525
+ WasmAsyncResolvePromiseCallback callback);
1526
+
1526
1527
  void SetWasmLoadSourceMapCallback(WasmLoadSourceMapCallback callback);
1527
1528
 
1528
1529
  void SetWasmSimdEnabledCallback(WasmSimdEnabledCallback callback);
1529
1530
 
1530
1531
  void SetWasmExceptionsEnabledCallback(WasmExceptionsEnabledCallback callback);
1531
1532
 
1532
- void SetWasmDynamicTieringEnabledCallback(
1533
- WasmDynamicTieringEnabledCallback callback);
1534
-
1535
1533
  void SetSharedArrayBufferConstructorEnabledCallback(
1536
1534
  SharedArrayBufferConstructorEnabledCallback callback);
1537
1535
 
@@ -1598,19 +1596,6 @@ class V8_EXPORT Isolate {
1598
1596
  */
1599
1597
  void VisitExternalResources(ExternalResourceVisitor* visitor);
1600
1598
 
1601
- /**
1602
- * Iterates through all the persistent handles in the current isolate's heap
1603
- * that have class_ids.
1604
- */
1605
- void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);
1606
-
1607
- /**
1608
- * Iterates through all the persistent handles in the current isolate's heap
1609
- * that have class_ids and are weak to be marked as inactive if there is no
1610
- * pending activity for the handle.
1611
- */
1612
- void VisitWeakHandles(PersistentHandleVisitor* visitor);
1613
-
1614
1599
  /**
1615
1600
  * Check if this isolate is in use.
1616
1601
  * True if at least one thread Enter'ed this isolate.
@@ -86,7 +86,7 @@ class V8_EXPORT V8_NODISCARD HandleScope {
86
86
  static int NumberOfHandles(Isolate* isolate);
87
87
 
88
88
  V8_INLINE Isolate* GetIsolate() const {
89
- return reinterpret_cast<Isolate*>(isolate_);
89
+ return reinterpret_cast<Isolate*>(i_isolate_);
90
90
  }
91
91
 
92
92
  HandleScope(const HandleScope&) = delete;
@@ -97,7 +97,7 @@ class V8_EXPORT V8_NODISCARD HandleScope {
97
97
 
98
98
  void Initialize(Isolate* isolate);
99
99
 
100
- static internal::Address* CreateHandle(internal::Isolate* isolate,
100
+ static internal::Address* CreateHandle(internal::Isolate* i_isolate,
101
101
  internal::Address value);
102
102
 
103
103
  private:
@@ -108,7 +108,7 @@ class V8_EXPORT V8_NODISCARD HandleScope {
108
108
  void operator delete(void*, size_t);
109
109
  void operator delete[](void*, size_t);
110
110
 
111
- internal::Isolate* isolate_;
111
+ internal::Isolate* i_isolate_;
112
112
  internal::Address* prev_next_;
113
113
  internal::Address* prev_limit_;
114
114
 
@@ -354,7 +354,7 @@ class MaybeLocal {
354
354
 
355
355
  /**
356
356
  * Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
357
- * |false| is returned and |out| is left untouched.
357
+ * |false| is returned and |out| is assigned with nullptr.
358
358
  */
359
359
  template <class S>
360
360
  V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local<S>* out) const {
@@ -445,7 +445,7 @@ class V8_EXPORT V8_NODISCARD SealHandleScope {
445
445
  void operator delete(void*, size_t);
446
446
  void operator delete[](void*, size_t);
447
447
 
448
- internal::Isolate* const isolate_;
448
+ internal::Isolate* const i_isolate_;
449
449
  internal::Address* prev_limit_;
450
450
  int prev_sealed_level_;
451
451
  };
@@ -121,17 +121,6 @@ class V8_EXPORT Locker {
121
121
  */
122
122
  static bool IsLocked(Isolate* isolate);
123
123
 
124
- /**
125
- * Returns whether any v8::Locker has ever been used in this process.
126
- * TODO(cbruni, chromium:1240851): Fix locking checks on a per-thread basis.
127
- * The current implementation is quite confusing and leads to unexpected
128
- * results if anybody uses v8::Locker in the current process.
129
- */
130
- V8_DEPRECATE_SOON("This method will be removed.")
131
- static bool WasEverUsed();
132
- V8_DEPRECATED("Use WasEverUsed instead")
133
- static bool IsActive();
134
-
135
124
  // Disallow copying and assigning.
136
125
  Locker(const Locker&) = delete;
137
126
  void operator=(const Locker&) = delete;
@@ -5,6 +5,9 @@
5
5
  #ifndef INCLUDE_V8_MAYBE_H_
6
6
  #define INCLUDE_V8_MAYBE_H_
7
7
 
8
+ #include <type_traits>
9
+ #include <utility>
10
+
8
11
  #include "v8-internal.h" // NOLINT(build/include_directory)
9
12
  #include "v8config.h" // NOLINT(build/include_directory)
10
13
 
@@ -57,11 +60,20 @@ class Maybe {
57
60
  * Converts this Maybe<> to a value of type T. If this Maybe<> is
58
61
  * nothing (empty), V8 will crash the process.
59
62
  */
60
- V8_INLINE T FromJust() const {
63
+ V8_INLINE T FromJust() const& {
61
64
  if (V8_UNLIKELY(!IsJust())) api_internal::FromJustIsNothing();
62
65
  return value_;
63
66
  }
64
67
 
68
+ /**
69
+ * Converts this Maybe<> to a value of type T. If this Maybe<> is
70
+ * nothing (empty), V8 will crash the process.
71
+ */
72
+ V8_INLINE T FromJust() && {
73
+ if (V8_UNLIKELY(!IsJust())) api_internal::FromJustIsNothing();
74
+ return std::move(value_);
75
+ }
76
+
65
77
  /**
66
78
  * Converts this Maybe<> to a value of type T, using a default value if this
67
79
  * Maybe<> is nothing (empty).
@@ -82,6 +94,7 @@ class Maybe {
82
94
  private:
83
95
  Maybe() : has_value_(false) {}
84
96
  explicit Maybe(const T& t) : has_value_(true), value_(t) {}
97
+ explicit Maybe(T&& t) : has_value_(true), value_(std::move(t)) {}
85
98
 
86
99
  bool has_value_;
87
100
  T value_;
@@ -90,6 +103,8 @@ class Maybe {
90
103
  friend Maybe<U> Nothing();
91
104
  template <class U>
92
105
  friend Maybe<U> Just(const U& u);
106
+ template <class U, std::enable_if_t<!std::is_lvalue_reference_v<U>>*>
107
+ friend Maybe<U> Just(U&& u);
93
108
  };
94
109
 
95
110
  template <class T>
@@ -102,6 +117,14 @@ inline Maybe<T> Just(const T& t) {
102
117
  return Maybe<T>(t);
103
118
  }
104
119
 
120
+ // Don't use forwarding references here but instead use two overloads.
121
+ // Forwarding references only work when type deduction takes place, which is not
122
+ // the case for callsites such as Just<Type>(t).
123
+ template <class T, std::enable_if_t<!std::is_lvalue_reference_v<T>>* = nullptr>
124
+ inline Maybe<T> Just(T&& t) {
125
+ return Maybe<T>(std::move(t));
126
+ }
127
+
105
128
  // A template specialization of Maybe<T> for the case of T = void.
106
129
  template <>
107
130
  class Maybe<void> {
@@ -70,7 +70,7 @@ class V8_EXPORT ScriptOrigin {
70
70
  bool resource_is_opaque = false, bool is_wasm = false,
71
71
  bool is_module = false,
72
72
  Local<Data> host_defined_options = Local<Data>())
73
- : isolate_(isolate),
73
+ : v8_isolate_(isolate),
74
74
  resource_name_(resource_name),
75
75
  resource_line_offset_(resource_line_offset),
76
76
  resource_column_offset_(resource_column_offset),
@@ -87,14 +87,12 @@ class V8_EXPORT ScriptOrigin {
87
87
  V8_INLINE int ColumnOffset() const;
88
88
  V8_INLINE int ScriptId() const;
89
89
  V8_INLINE Local<Value> SourceMapUrl() const;
90
- V8_DEPRECATE_SOON("Use GetHostDefinedOptions")
91
- Local<PrimitiveArray> HostDefinedOptions() const;
92
90
  V8_INLINE Local<Data> GetHostDefinedOptions() const;
93
91
  V8_INLINE ScriptOriginOptions Options() const { return options_; }
94
92
 
95
93
  private:
96
94
  void VerifyHostDefinedOptions() const;
97
- Isolate* isolate_;
95
+ Isolate* v8_isolate_;
98
96
  Local<Value> resource_name_;
99
97
  int resource_line_offset_;
100
98
  int resource_column_offset_;
@@ -125,31 +125,10 @@ struct WasmModuleInstantiated {
125
125
  int64_t wall_clock_duration_in_us = -1;
126
126
  };
127
127
 
128
- struct WasmModuleTieredUp {
129
- bool lazy = false;
130
- size_t code_size_in_bytes = 0;
131
- int64_t wall_clock_duration_in_us = -1;
132
- int64_t cpu_duration_in_us = -1;
133
- };
134
-
135
128
  struct WasmModulesPerIsolate {
136
129
  size_t count = 0;
137
130
  };
138
131
 
139
- #define V8_MAIN_THREAD_METRICS_EVENTS(V) \
140
- V(GarbageCollectionFullCycle) \
141
- V(GarbageCollectionFullMainThreadIncrementalMark) \
142
- V(GarbageCollectionFullMainThreadBatchedIncrementalMark) \
143
- V(GarbageCollectionFullMainThreadIncrementalSweep) \
144
- V(GarbageCollectionFullMainThreadBatchedIncrementalSweep) \
145
- V(GarbageCollectionYoungCycle) \
146
- V(WasmModuleDecoded) \
147
- V(WasmModuleCompiled) \
148
- V(WasmModuleInstantiated) \
149
- V(WasmModuleTieredUp)
150
-
151
- #define V8_THREAD_SAFE_METRICS_EVENTS(V) V(WasmModulesPerIsolate)
152
-
153
132
  /**
154
133
  * This class serves as a base class for recording event-based metrics in V8.
155
134
  * There a two kinds of metrics, those which are expected to be thread-safe and
@@ -159,19 +138,6 @@ struct WasmModulesPerIsolate {
159
138
  * background thread, it will be delayed and executed by the foreground task
160
139
  * runner.
161
140
  *
162
- * The thread-safe events are listed in the V8_THREAD_SAFE_METRICS_EVENTS
163
- * macro above while the main thread event are listed in
164
- * V8_MAIN_THREAD_METRICS_EVENTS above. For the former, a virtual method
165
- * AddMainThreadEvent(const E& event, v8::Context::Token token) will be
166
- * generated and for the latter AddThreadSafeEvent(const E& event).
167
- *
168
- * Thread-safe events are not allowed to access the context and therefore do
169
- * not carry a context ID with them. These IDs can be generated using
170
- * Recorder::GetContextId() and the ID will be valid throughout the lifetime
171
- * of the isolate. It is not guaranteed that the ID will still resolve to
172
- * a valid context using Recorder::GetContext() at the time the metric is
173
- * recorded. In this case, an empty handle will be returned.
174
- *
175
141
  * The embedder is expected to call v8::Isolate::SetMetricsRecorder()
176
142
  * providing its implementation and have the virtual methods overwritten
177
143
  * for the events it cares about.
@@ -202,14 +168,30 @@ class V8_EXPORT Recorder {
202
168
 
203
169
  virtual ~Recorder() = default;
204
170
 
171
+ // Main thread events. Those are only triggered on the main thread, and hence
172
+ // can access the context.
205
173
  #define ADD_MAIN_THREAD_EVENT(E) \
206
- virtual void AddMainThreadEvent(const E& event, ContextId context_id) {}
207
- V8_MAIN_THREAD_METRICS_EVENTS(ADD_MAIN_THREAD_EVENT)
174
+ virtual void AddMainThreadEvent(const E&, ContextId) {}
175
+ ADD_MAIN_THREAD_EVENT(GarbageCollectionFullCycle)
176
+ ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadIncrementalMark)
177
+ ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadBatchedIncrementalMark)
178
+ ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadIncrementalSweep)
179
+ ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadBatchedIncrementalSweep)
180
+ ADD_MAIN_THREAD_EVENT(GarbageCollectionYoungCycle)
181
+ ADD_MAIN_THREAD_EVENT(WasmModuleDecoded)
182
+ ADD_MAIN_THREAD_EVENT(WasmModuleCompiled)
183
+ ADD_MAIN_THREAD_EVENT(WasmModuleInstantiated)
208
184
  #undef ADD_MAIN_THREAD_EVENT
209
185
 
186
+ // Thread-safe events are not allowed to access the context and therefore do
187
+ // not carry a context ID with them. These IDs can be generated using
188
+ // Recorder::GetContextId() and the ID will be valid throughout the lifetime
189
+ // of the isolate. It is not guaranteed that the ID will still resolve to
190
+ // a valid context using Recorder::GetContext() at the time the metric is
191
+ // recorded. In this case, an empty handle will be returned.
210
192
  #define ADD_THREAD_SAFE_EVENT(E) \
211
- virtual void AddThreadSafeEvent(const E& event) {}
212
- V8_THREAD_SAFE_METRICS_EVENTS(ADD_THREAD_SAFE_EVENT)
193
+ virtual void AddThreadSafeEvent(const E&) {}
194
+ ADD_THREAD_SAFE_EVENT(WasmModulesPerIsolate)
213
195
  #undef ADD_THREAD_SAFE_EVENT
214
196
 
215
197
  virtual void NotifyIsolateDisposal() {}
@@ -142,7 +142,7 @@ class V8_EXPORT V8_NODISCARD MicrotasksScope {
142
142
  MicrotasksScope& operator=(const MicrotasksScope&) = delete;
143
143
 
144
144
  private:
145
- internal::Isolate* const isolate_;
145
+ internal::Isolate* const i_isolate_;
146
146
  internal::MicrotaskQueue* const microtask_queue_;
147
147
  bool run_;
148
148
  };
@@ -594,8 +594,6 @@ class V8_EXPORT Object : public Value {
594
594
  /**
595
595
  * Returns the context in which the object was created.
596
596
  */
597
- V8_DEPRECATED("Use MaybeLocal<Context> GetCreationContext()")
598
- Local<Context> CreationContext();
599
597
  MaybeLocal<Context> GetCreationContext();
600
598
 
601
599
  /**
@@ -604,10 +602,6 @@ class V8_EXPORT Object : public Value {
604
602
  Local<Context> GetCreationContextChecked();
605
603
 
606
604
  /** Same as above, but works for Persistents */
607
- V8_DEPRECATED(
608
- "Use MaybeLocal<Context> GetCreationContext(const "
609
- "PersistentBase<Object>& object)")
610
- static Local<Context> CreationContext(const PersistentBase<Object>& object);
611
605
  V8_INLINE static MaybeLocal<Context> GetCreationContext(
612
606
  const PersistentBase<Object>& object) {
613
607
  return object.val_->GetCreationContext();
@@ -717,7 +711,7 @@ Local<Value> Object::GetInternalField(int index) {
717
711
  // Fast path: If the object is a plain JSObject, which is the common case, we
718
712
  // know where to find the internal fields and can return the value directly.
719
713
  int instance_type = I::GetInstanceType(obj);
720
- if (v8::internal::CanHaveInternalField(instance_type)) {
714
+ if (I::CanHaveInternalField(instance_type)) {
721
715
  int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
722
716
  A value = I::ReadRawField<A>(obj, offset);
723
717
  #ifdef V8_COMPRESS_POINTERS
@@ -742,14 +736,13 @@ void* Object::GetAlignedPointerFromInternalField(int index) {
742
736
  // Fast path: If the object is a plain JSObject, which is the common case, we
743
737
  // know where to find the internal fields and can return the value directly.
744
738
  auto instance_type = I::GetInstanceType(obj);
745
- if (v8::internal::CanHaveInternalField(instance_type)) {
746
- int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
747
- #ifdef V8_SANDBOXED_EXTERNAL_POINTERS
748
- offset += I::kEmbedderDataSlotRawPayloadOffset;
749
- #endif
750
- internal::Isolate* isolate = I::GetIsolateForSandbox(obj);
751
- A value = I::ReadExternalPointerField(
752
- isolate, obj, offset, internal::kEmbedderDataSlotPayloadTag);
739
+ if (I::CanHaveInternalField(instance_type)) {
740
+ int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index) +
741
+ I::kEmbedderDataSlotExternalPointerOffset;
742
+ Isolate* isolate = I::GetIsolateForSandbox(obj);
743
+ A value =
744
+ I::ReadExternalPointerField<internal::kEmbedderDataSlotPayloadTag>(
745
+ isolate, obj, offset);
753
746
  return reinterpret_cast<void*>(value);
754
747
  }
755
748
  #endif
@@ -169,8 +169,6 @@ class PersistentBase {
169
169
  * Turns this handle into a weak phantom handle without finalization callback.
170
170
  * The handle will be reset automatically when the garbage collector detects
171
171
  * that the object is no longer reachable.
172
- * A related function Isolate::NumberOfPhantomHandleResetsSinceLastCall
173
- * returns how many phantom handles were reset by the garbage collector.
174
172
  */
175
173
  V8_INLINE void SetWeak();
176
174
 
@@ -158,9 +158,10 @@ class TaskRunner {
158
158
  class JobDelegate {
159
159
  public:
160
160
  /**
161
- * Returns true if this thread should return from the worker task on the
161
+ * Returns true if this thread *must* return from the worker task on the
162
162
  * current thread ASAP. Workers should periodically invoke ShouldYield (or
163
163
  * YieldIfNeeded()) as often as is reasonable.
164
+ * After this method returned true, ShouldYield must not be called again.
164
165
  */
165
166
  virtual bool ShouldYield() = 0;
166
167
 
@@ -429,6 +430,17 @@ class PageAllocator {
429
430
  virtual bool SetPermissions(void* address, size_t length,
430
431
  Permission permissions) = 0;
431
432
 
433
+ /**
434
+ * Recommits discarded pages in the given range with given permissions.
435
+ * Discarded pages must be recommitted with their original permissions
436
+ * before they are used again.
437
+ */
438
+ virtual bool RecommitPages(void* address, size_t length,
439
+ Permission permissions) {
440
+ // TODO(v8:12797): make it pure once it's implemented on Chromium side.
441
+ return false;
442
+ }
443
+
432
444
  /**
433
445
  * Frees memory in the given [address, address + size) range. address and size
434
446
  * should be operating system page-aligned. The next write to this
@@ -698,6 +710,10 @@ class VirtualAddressSpace {
698
710
  /**
699
711
  * Sets permissions of all allocated pages in the given range.
700
712
  *
713
+ * This operation can fail due to OOM, in which case false is returned. If
714
+ * the operation fails for a reason other than OOM, this function will
715
+ * terminate the process as this implies a bug in the client.
716
+ *
701
717
  * \param address The start address of the range. Must be aligned to
702
718
  * page_size().
703
719
  *
@@ -706,7 +722,7 @@ class VirtualAddressSpace {
706
722
  *
707
723
  * \param permissions The new permissions for the range.
708
724
  *
709
- * \returns true on success, false otherwise.
725
+ * \returns true on success, false on OOM.
710
726
  */
711
727
  virtual V8_WARN_UNUSED_RESULT bool SetPagePermissions(
712
728
  Address address, size_t size, PagePermissions permissions) = 0;
@@ -820,6 +836,24 @@ class VirtualAddressSpace {
820
836
  // takes a command enum as parameter.
821
837
  //
822
838
 
839
+ /**
840
+ * Recommits discarded pages in the given range with given permissions.
841
+ * Discarded pages must be recommitted with their original permissions
842
+ * before they are used again.
843
+ *
844
+ * \param address The start address of the range. Must be aligned to
845
+ * page_size().
846
+ *
847
+ * \param size The size in bytes of the range. Must be a multiple
848
+ * of page_size().
849
+ *
850
+ * \param permissions The permissions for the range that the pages must have.
851
+ *
852
+ * \returns true on success, false otherwise.
853
+ */
854
+ virtual V8_WARN_UNUSED_RESULT bool RecommitPages(
855
+ Address address, size_t size, PagePermissions permissions) = 0;
856
+
823
857
  /**
824
858
  * Frees memory in the given [address, address + size) range. address and
825
859
  * size should be aligned to the page_size(). The next write to this memory
@@ -890,10 +924,7 @@ class Platform {
890
924
  /**
891
925
  * Allows the embedder to manage memory page allocations.
892
926
  */
893
- virtual PageAllocator* GetPageAllocator() {
894
- // TODO(bbudge) Make this abstract after all embedders implement this.
895
- return nullptr;
896
- }
927
+ virtual PageAllocator* GetPageAllocator() = 0;
897
928
 
898
929
  /**
899
930
  * Allows the embedder to specify a custom allocator used for zones.
@@ -910,21 +941,7 @@ class Platform {
910
941
  * error.
911
942
  * Embedder overrides of this function must NOT call back into V8.
912
943
  */
913
- virtual void OnCriticalMemoryPressure() {
914
- // TODO(bbudge) Remove this when embedders override the following method.
915
- // See crbug.com/634547.
916
- }
917
-
918
- /**
919
- * Enables the embedder to respond in cases where V8 can't allocate large
920
- * memory regions. The |length| parameter is the amount of memory needed.
921
- * Returns true if memory is now available. Returns false if no memory could
922
- * be made available. V8 will retry allocations until this method returns
923
- * false.
924
- *
925
- * Embedder overrides of this function must NOT call back into V8.
926
- */
927
- virtual bool OnCriticalMemoryPressure(size_t length) { return false; }
944
+ virtual void OnCriticalMemoryPressure() {}
928
945
 
929
946
  /**
930
947
  * Gets the number of worker threads used by
@@ -1022,16 +1039,28 @@ class Platform {
1022
1039
  * thread (A=>B/B=>A deadlock) and [2] JobTask::Run or
1023
1040
  * JobTask::GetMaxConcurrency may be invoked synchronously from JobHandle
1024
1041
  * (B=>JobHandle::foo=>B deadlock).
1042
+ */
1043
+ virtual std::unique_ptr<JobHandle> PostJob(
1044
+ TaskPriority priority, std::unique_ptr<JobTask> job_task) {
1045
+ auto handle = CreateJob(priority, std::move(job_task));
1046
+ handle->NotifyConcurrencyIncrease();
1047
+ return handle;
1048
+ }
1049
+
1050
+ /**
1051
+ * Creates and returns a JobHandle associated with a Job. Unlike PostJob(),
1052
+ * this doesn't immediately schedules |worker_task| to run; the Job is then
1053
+ * scheduled by calling either NotifyConcurrencyIncrease() or Join().
1025
1054
  *
1026
- * A sufficient PostJob() implementation that uses the default Job provided in
1027
- * libplatform looks like:
1028
- * std::unique_ptr<JobHandle> PostJob(
1055
+ * A sufficient CreateJob() implementation that uses the default Job provided
1056
+ * in libplatform looks like:
1057
+ * std::unique_ptr<JobHandle> CreateJob(
1029
1058
  * TaskPriority priority, std::unique_ptr<JobTask> job_task) override {
1030
1059
  * return v8::platform::NewDefaultJobHandle(
1031
1060
  * this, priority, std::move(job_task), NumberOfWorkerThreads());
1032
1061
  * }
1033
1062
  */
1034
- virtual std::unique_ptr<JobHandle> PostJob(
1063
+ virtual std::unique_ptr<JobHandle> CreateJob(
1035
1064
  TaskPriority priority, std::unique_ptr<JobTask> job_task) = 0;
1036
1065
 
1037
1066
  /**