libv8-node 15.14.0.1-aarch64-linux-musl → 18.8.0.0-aarch64-linux-musl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libv8-node/location.rb +1 -1
  3. data/ext/libv8-node/paths.rb +5 -1
  4. data/lib/libv8/node/version.rb +3 -3
  5. data/vendor/v8/{out.gn → aarch64-linux-musl}/libv8/obj/libv8_monolith.a +0 -0
  6. data/vendor/v8/include/cppgc/allocation.h +184 -47
  7. data/vendor/v8/include/cppgc/common.h +9 -6
  8. data/vendor/v8/include/cppgc/cross-thread-persistent.h +465 -0
  9. data/vendor/v8/include/cppgc/custom-space.h +37 -2
  10. data/vendor/v8/include/cppgc/default-platform.h +40 -49
  11. data/vendor/v8/include/cppgc/ephemeron-pair.h +30 -0
  12. data/vendor/v8/include/cppgc/explicit-management.h +100 -0
  13. data/vendor/v8/include/cppgc/garbage-collected.h +19 -29
  14. data/vendor/v8/include/cppgc/heap-consistency.h +266 -0
  15. data/vendor/v8/include/cppgc/heap-state.h +82 -0
  16. data/vendor/v8/include/cppgc/heap-statistics.h +120 -0
  17. data/vendor/v8/include/cppgc/heap.h +73 -6
  18. data/vendor/v8/include/cppgc/internal/api-constants.h +11 -3
  19. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +27 -15
  20. data/vendor/v8/include/cppgc/internal/compiler-specific.h +2 -2
  21. data/vendor/v8/include/cppgc/internal/finalizer-trait.h +4 -1
  22. data/vendor/v8/include/cppgc/internal/gc-info.h +124 -13
  23. data/vendor/v8/include/cppgc/internal/logging.h +3 -3
  24. data/vendor/v8/include/cppgc/internal/name-trait.h +122 -0
  25. data/vendor/v8/include/cppgc/internal/persistent-node.h +116 -16
  26. data/vendor/v8/include/cppgc/internal/pointer-policies.h +84 -32
  27. data/vendor/v8/include/cppgc/internal/write-barrier.h +392 -35
  28. data/vendor/v8/include/cppgc/liveness-broker.h +11 -2
  29. data/vendor/v8/include/cppgc/macros.h +2 -0
  30. data/vendor/v8/include/cppgc/member.h +91 -26
  31. data/vendor/v8/include/cppgc/name-provider.h +65 -0
  32. data/vendor/v8/include/cppgc/object-size-trait.h +58 -0
  33. data/vendor/v8/include/cppgc/persistent.h +70 -41
  34. data/vendor/v8/include/cppgc/platform.h +52 -26
  35. data/vendor/v8/include/cppgc/prefinalizer.h +36 -13
  36. data/vendor/v8/include/cppgc/process-heap-statistics.h +36 -0
  37. data/vendor/v8/include/cppgc/sentinel-pointer.h +32 -0
  38. data/vendor/v8/include/cppgc/source-location.h +2 -1
  39. data/vendor/v8/include/cppgc/testing.h +106 -0
  40. data/vendor/v8/include/cppgc/trace-trait.h +8 -3
  41. data/vendor/v8/include/cppgc/type-traits.h +163 -32
  42. data/vendor/v8/include/cppgc/visitor.h +194 -28
  43. data/vendor/v8/include/libplatform/libplatform.h +11 -11
  44. data/vendor/v8/include/libplatform/v8-tracing.h +2 -1
  45. data/vendor/v8/include/v8-array-buffer.h +445 -0
  46. data/vendor/v8/include/v8-callbacks.h +397 -0
  47. data/vendor/v8/include/v8-container.h +129 -0
  48. data/vendor/v8/include/v8-context.h +407 -0
  49. data/vendor/v8/include/v8-cppgc.h +151 -159
  50. data/vendor/v8/include/v8-data.h +80 -0
  51. data/vendor/v8/include/v8-date.h +43 -0
  52. data/vendor/v8/include/v8-debug.h +168 -0
  53. data/vendor/v8/include/v8-embedder-heap.h +218 -0
  54. data/vendor/v8/include/v8-embedder-state-scope.h +51 -0
  55. data/vendor/v8/include/v8-exception.h +217 -0
  56. data/vendor/v8/include/v8-extension.h +62 -0
  57. data/vendor/v8/include/v8-external.h +37 -0
  58. data/vendor/v8/include/v8-fast-api-calls.h +703 -152
  59. data/vendor/v8/include/v8-forward.h +81 -0
  60. data/vendor/v8/include/v8-function-callback.h +475 -0
  61. data/vendor/v8/include/v8-function.h +125 -0
  62. data/vendor/v8/include/v8-initialization.h +315 -0
  63. data/vendor/v8/include/v8-inspector.h +76 -27
  64. data/vendor/v8/include/v8-internal.h +285 -51
  65. data/vendor/v8/include/v8-isolate.h +1709 -0
  66. data/vendor/v8/include/v8-json.h +47 -0
  67. data/vendor/v8/include/v8-local-handle.h +455 -0
  68. data/vendor/v8/include/v8-locker.h +149 -0
  69. data/vendor/v8/include/v8-maybe.h +137 -0
  70. data/vendor/v8/include/v8-memory-span.h +43 -0
  71. data/vendor/v8/include/v8-message.h +216 -0
  72. data/vendor/v8/include/v8-metrics.h +131 -9
  73. data/vendor/v8/include/v8-microtask-queue.h +152 -0
  74. data/vendor/v8/include/v8-microtask.h +28 -0
  75. data/vendor/v8/include/v8-object.h +775 -0
  76. data/vendor/v8/include/v8-persistent-handle.h +590 -0
  77. data/vendor/v8/include/v8-platform.h +433 -25
  78. data/vendor/v8/include/v8-primitive-object.h +118 -0
  79. data/vendor/v8/include/v8-primitive.h +866 -0
  80. data/vendor/v8/include/v8-profiler.h +149 -10
  81. data/vendor/v8/include/v8-promise.h +174 -0
  82. data/vendor/v8/include/v8-proxy.h +50 -0
  83. data/vendor/v8/include/v8-regexp.h +105 -0
  84. data/vendor/v8/include/v8-script.h +747 -0
  85. data/vendor/v8/include/v8-snapshot.h +196 -0
  86. data/vendor/v8/include/v8-statistics.h +217 -0
  87. data/vendor/v8/include/v8-template.h +1079 -0
  88. data/vendor/v8/include/v8-traced-handle.h +420 -0
  89. data/vendor/v8/include/v8-typed-array.h +282 -0
  90. data/vendor/v8/include/v8-unwinder-state.h +31 -0
  91. data/vendor/v8/include/v8-unwinder.h +132 -0
  92. data/vendor/v8/include/v8-util.h +8 -2
  93. data/vendor/v8/include/v8-value-serializer-version.h +1 -1
  94. data/vendor/v8/include/v8-value-serializer.h +279 -0
  95. data/vendor/v8/include/v8-value.h +526 -0
  96. data/vendor/v8/include/v8-version.h +4 -4
  97. data/vendor/v8/include/v8-wasm.h +257 -0
  98. data/vendor/v8/include/v8-weak-callback-info.h +87 -0
  99. data/vendor/v8/include/v8.h +41 -12051
  100. data/vendor/v8/include/v8config.h +142 -21
  101. metadata +64 -10
  102. data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +0 -30
  103. data/vendor/v8/include/cppgc/internal/process-heap.h +0 -34
@@ -0,0 +1,1709 @@
1
+ // Copyright 2021 the V8 project authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ #ifndef INCLUDE_V8_ISOLATE_H_
6
+ #define INCLUDE_V8_ISOLATE_H_
7
+
8
+ #include <stddef.h>
9
+ #include <stdint.h>
10
+
11
+ #include <memory>
12
+ #include <utility>
13
+
14
+ #include "cppgc/common.h"
15
+ #include "v8-array-buffer.h" // NOLINT(build/include_directory)
16
+ #include "v8-callbacks.h" // NOLINT(build/include_directory)
17
+ #include "v8-data.h" // NOLINT(build/include_directory)
18
+ #include "v8-debug.h" // NOLINT(build/include_directory)
19
+ #include "v8-embedder-heap.h" // NOLINT(build/include_directory)
20
+ #include "v8-function-callback.h" // NOLINT(build/include_directory)
21
+ #include "v8-internal.h" // NOLINT(build/include_directory)
22
+ #include "v8-local-handle.h" // NOLINT(build/include_directory)
23
+ #include "v8-microtask.h" // NOLINT(build/include_directory)
24
+ #include "v8-persistent-handle.h" // NOLINT(build/include_directory)
25
+ #include "v8-primitive.h" // NOLINT(build/include_directory)
26
+ #include "v8-statistics.h" // NOLINT(build/include_directory)
27
+ #include "v8-unwinder.h" // NOLINT(build/include_directory)
28
+ #include "v8config.h" // NOLINT(build/include_directory)
29
+
30
+ namespace v8 {
31
+
32
+ class CppHeap;
33
+ class HeapProfiler;
34
+ class MicrotaskQueue;
35
+ class StartupData;
36
+ class ScriptOrModule;
37
+ class SharedArrayBuffer;
38
+
39
+ namespace internal {
40
+ class MicrotaskQueue;
41
+ class ThreadLocalTop;
42
+ } // namespace internal
43
+
44
+ namespace metrics {
45
+ class Recorder;
46
+ } // namespace metrics
47
+
48
+ /**
49
+ * A set of constraints that specifies the limits of the runtime's memory use.
50
+ * You must set the heap size before initializing the VM - the size cannot be
51
+ * adjusted after the VM is initialized.
52
+ *
53
+ * If you are using threads then you should hold the V8::Locker lock while
54
+ * setting the stack limit and you must set a non-default stack limit separately
55
+ * for each thread.
56
+ *
57
+ * The arguments for set_max_semi_space_size, set_max_old_space_size,
58
+ * set_max_executable_size, set_code_range_size specify limits in MB.
59
+ *
60
+ * The argument for set_max_semi_space_size_in_kb is in KB.
61
+ */
62
+ class V8_EXPORT ResourceConstraints {
63
+ public:
64
+ /**
65
+ * Configures the constraints with reasonable default values based on the
66
+ * provided heap size limit. The heap size includes both the young and
67
+ * the old generation.
68
+ *
69
+ * \param initial_heap_size_in_bytes The initial heap size or zero.
70
+ * By default V8 starts with a small heap and dynamically grows it to
71
+ * match the set of live objects. This may lead to ineffective
72
+ * garbage collections at startup if the live set is large.
73
+ * Setting the initial heap size avoids such garbage collections.
74
+ * Note that this does not affect young generation garbage collections.
75
+ *
76
+ * \param maximum_heap_size_in_bytes The hard limit for the heap size.
77
+ * When the heap size approaches this limit, V8 will perform series of
78
+ * garbage collections and invoke the NearHeapLimitCallback. If the garbage
79
+ * collections do not help and the callback does not increase the limit,
80
+ * then V8 will crash with V8::FatalProcessOutOfMemory.
81
+ */
82
+ void ConfigureDefaultsFromHeapSize(size_t initial_heap_size_in_bytes,
83
+ size_t maximum_heap_size_in_bytes);
84
+
85
+ /**
86
+ * Configures the constraints with reasonable default values based on the
87
+ * capabilities of the current device the VM is running on.
88
+ *
89
+ * \param physical_memory The total amount of physical memory on the current
90
+ * device, in bytes.
91
+ * \param virtual_memory_limit The amount of virtual memory on the current
92
+ * device, in bytes, or zero, if there is no limit.
93
+ */
94
+ void ConfigureDefaults(uint64_t physical_memory,
95
+ uint64_t virtual_memory_limit);
96
+
97
+ /**
98
+ * The address beyond which the VM's stack may not grow.
99
+ */
100
+ uint32_t* stack_limit() const { return stack_limit_; }
101
+ void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
102
+
103
+ /**
104
+ * The amount of virtual memory reserved for generated code. This is relevant
105
+ * for 64-bit architectures that rely on code range for calls in code.
106
+ *
107
+ * When V8_COMPRESS_POINTERS_IN_SHARED_CAGE is defined, there is a shared
108
+ * process-wide code range that is lazily initialized. This value is used to
109
+ * configure that shared code range when the first Isolate is
110
+ * created. Subsequent Isolates ignore this value.
111
+ */
112
+ size_t code_range_size_in_bytes() const { return code_range_size_; }
113
+ void set_code_range_size_in_bytes(size_t limit) { code_range_size_ = limit; }
114
+
115
+ /**
116
+ * The maximum size of the old generation.
117
+ * When the old generation approaches this limit, V8 will perform series of
118
+ * garbage collections and invoke the NearHeapLimitCallback.
119
+ * If the garbage collections do not help and the callback does not
120
+ * increase the limit, then V8 will crash with V8::FatalProcessOutOfMemory.
121
+ */
122
+ size_t max_old_generation_size_in_bytes() const {
123
+ return max_old_generation_size_;
124
+ }
125
+ void set_max_old_generation_size_in_bytes(size_t limit) {
126
+ max_old_generation_size_ = limit;
127
+ }
128
+
129
+ /**
130
+ * The maximum size of the young generation, which consists of two semi-spaces
131
+ * and a large object space. This affects frequency of Scavenge garbage
132
+ * collections and should be typically much smaller that the old generation.
133
+ */
134
+ size_t max_young_generation_size_in_bytes() const {
135
+ return max_young_generation_size_;
136
+ }
137
+ void set_max_young_generation_size_in_bytes(size_t limit) {
138
+ max_young_generation_size_ = limit;
139
+ }
140
+
141
+ size_t initial_old_generation_size_in_bytes() const {
142
+ return initial_old_generation_size_;
143
+ }
144
+ void set_initial_old_generation_size_in_bytes(size_t initial_size) {
145
+ initial_old_generation_size_ = initial_size;
146
+ }
147
+
148
+ size_t initial_young_generation_size_in_bytes() const {
149
+ return initial_young_generation_size_;
150
+ }
151
+ void set_initial_young_generation_size_in_bytes(size_t initial_size) {
152
+ initial_young_generation_size_ = initial_size;
153
+ }
154
+
155
+ private:
156
+ static constexpr size_t kMB = 1048576u;
157
+ size_t code_range_size_ = 0;
158
+ size_t max_old_generation_size_ = 0;
159
+ size_t max_young_generation_size_ = 0;
160
+ size_t initial_old_generation_size_ = 0;
161
+ size_t initial_young_generation_size_ = 0;
162
+ uint32_t* stack_limit_ = nullptr;
163
+ };
164
+
165
+ /**
166
+ * Option flags passed to the SetRAILMode function.
167
+ * See documentation https://developers.google.com/web/tools/chrome-devtools/
168
+ * profile/evaluate-performance/rail
169
+ */
170
+ enum RAILMode : unsigned {
171
+ // Response performance mode: In this mode very low virtual machine latency
172
+ // is provided. V8 will try to avoid JavaScript execution interruptions.
173
+ // Throughput may be throttled.
174
+ PERFORMANCE_RESPONSE,
175
+ // Animation performance mode: In this mode low virtual machine latency is
176
+ // provided. V8 will try to avoid as many JavaScript execution interruptions
177
+ // as possible. Throughput may be throttled. This is the default mode.
178
+ PERFORMANCE_ANIMATION,
179
+ // Idle performance mode: The embedder is idle. V8 can complete deferred work
180
+ // in this mode.
181
+ PERFORMANCE_IDLE,
182
+ // Load performance mode: In this mode high throughput is provided. V8 may
183
+ // turn off latency optimizations.
184
+ PERFORMANCE_LOAD
185
+ };
186
+
187
+ /**
188
+ * Memory pressure level for the MemoryPressureNotification.
189
+ * kNone hints V8 that there is no memory pressure.
190
+ * kModerate hints V8 to speed up incremental garbage collection at the cost of
191
+ * of higher latency due to garbage collection pauses.
192
+ * kCritical hints V8 to free memory as soon as possible. Garbage collection
193
+ * pauses at this level will be large.
194
+ */
195
+ enum class MemoryPressureLevel { kNone, kModerate, kCritical };
196
+
197
+ /**
198
+ * Isolate represents an isolated instance of the V8 engine. V8 isolates have
199
+ * completely separate states. Objects from one isolate must not be used in
200
+ * other isolates. The embedder can create multiple isolates and use them in
201
+ * parallel in multiple threads. An isolate can be entered by at most one
202
+ * thread at any given time. The Locker/Unlocker API must be used to
203
+ * synchronize.
204
+ */
205
+ class V8_EXPORT Isolate {
206
+ public:
207
+ /**
208
+ * Initial configuration parameters for a new Isolate.
209
+ */
210
+ struct V8_EXPORT CreateParams {
211
+ CreateParams();
212
+ ~CreateParams();
213
+
214
+ /**
215
+ * Allows the host application to provide the address of a function that is
216
+ * notified each time code is added, moved or removed.
217
+ */
218
+ JitCodeEventHandler code_event_handler = nullptr;
219
+
220
+ /**
221
+ * ResourceConstraints to use for the new Isolate.
222
+ */
223
+ ResourceConstraints constraints;
224
+
225
+ /**
226
+ * Explicitly specify a startup snapshot blob. The embedder owns the blob.
227
+ * The embedder *must* ensure that the snapshot is from a trusted source.
228
+ */
229
+ StartupData* snapshot_blob = nullptr;
230
+
231
+ /**
232
+ * Enables the host application to provide a mechanism for recording
233
+ * statistics counters.
234
+ */
235
+ CounterLookupCallback counter_lookup_callback = nullptr;
236
+
237
+ /**
238
+ * Enables the host application to provide a mechanism for recording
239
+ * histograms. The CreateHistogram function returns a
240
+ * histogram which will later be passed to the AddHistogramSample
241
+ * function.
242
+ */
243
+ CreateHistogramCallback create_histogram_callback = nullptr;
244
+ AddHistogramSampleCallback add_histogram_sample_callback = nullptr;
245
+
246
+ /**
247
+ * The ArrayBuffer::Allocator to use for allocating and freeing the backing
248
+ * store of ArrayBuffers.
249
+ *
250
+ * If the shared_ptr version is used, the Isolate instance and every
251
+ * |BackingStore| allocated using this allocator hold a std::shared_ptr
252
+ * to the allocator, in order to facilitate lifetime
253
+ * management for the allocator instance.
254
+ */
255
+ ArrayBuffer::Allocator* array_buffer_allocator = nullptr;
256
+ std::shared_ptr<ArrayBuffer::Allocator> array_buffer_allocator_shared;
257
+
258
+ /**
259
+ * Specifies an optional nullptr-terminated array of raw addresses in the
260
+ * embedder that V8 can match against during serialization and use for
261
+ * deserialization. This array and its content must stay valid for the
262
+ * entire lifetime of the isolate.
263
+ */
264
+ const intptr_t* external_references = nullptr;
265
+
266
+ /**
267
+ * Whether calling Atomics.wait (a function that may block) is allowed in
268
+ * this isolate. This can also be configured via SetAllowAtomicsWait.
269
+ */
270
+ bool allow_atomics_wait = true;
271
+
272
+ /**
273
+ * Termination is postponed when there is no active SafeForTerminationScope.
274
+ */
275
+ bool only_terminate_in_safe_scope = false;
276
+
277
+ /**
278
+ * The following parameters describe the offsets for addressing type info
279
+ * for wrapped API objects and are used by the fast C API
280
+ * (for details see v8-fast-api-calls.h).
281
+ */
282
+ int embedder_wrapper_type_index = -1;
283
+ int embedder_wrapper_object_index = -1;
284
+
285
+ /**
286
+ * Callbacks to invoke in case of fatal or OOM errors.
287
+ */
288
+ FatalErrorCallback fatal_error_callback = nullptr;
289
+ 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
+
298
+ /**
299
+ * Stack-allocated class which sets the isolate for all operations
300
+ * executed within a local scope.
301
+ */
302
+ class V8_EXPORT V8_NODISCARD Scope {
303
+ public:
304
+ explicit Scope(Isolate* isolate) : isolate_(isolate) { isolate->Enter(); }
305
+
306
+ ~Scope() { isolate_->Exit(); }
307
+
308
+ // Prevent copying of Scope objects.
309
+ Scope(const Scope&) = delete;
310
+ Scope& operator=(const Scope&) = delete;
311
+
312
+ private:
313
+ Isolate* const isolate_;
314
+ };
315
+
316
+ /**
317
+ * Assert that no Javascript code is invoked.
318
+ */
319
+ class V8_EXPORT V8_NODISCARD DisallowJavascriptExecutionScope {
320
+ public:
321
+ enum OnFailure { CRASH_ON_FAILURE, THROW_ON_FAILURE, DUMP_ON_FAILURE };
322
+
323
+ DisallowJavascriptExecutionScope(Isolate* isolate, OnFailure on_failure);
324
+ ~DisallowJavascriptExecutionScope();
325
+
326
+ // Prevent copying of Scope objects.
327
+ DisallowJavascriptExecutionScope(const DisallowJavascriptExecutionScope&) =
328
+ delete;
329
+ DisallowJavascriptExecutionScope& operator=(
330
+ const DisallowJavascriptExecutionScope&) = delete;
331
+
332
+ private:
333
+ OnFailure on_failure_;
334
+ Isolate* isolate_;
335
+
336
+ bool was_execution_allowed_assert_;
337
+ bool was_execution_allowed_throws_;
338
+ bool was_execution_allowed_dump_;
339
+ };
340
+
341
+ /**
342
+ * Introduce exception to DisallowJavascriptExecutionScope.
343
+ */
344
+ class V8_EXPORT V8_NODISCARD AllowJavascriptExecutionScope {
345
+ public:
346
+ explicit AllowJavascriptExecutionScope(Isolate* isolate);
347
+ ~AllowJavascriptExecutionScope();
348
+
349
+ // Prevent copying of Scope objects.
350
+ AllowJavascriptExecutionScope(const AllowJavascriptExecutionScope&) =
351
+ delete;
352
+ AllowJavascriptExecutionScope& operator=(
353
+ const AllowJavascriptExecutionScope&) = delete;
354
+
355
+ private:
356
+ Isolate* isolate_;
357
+ bool was_execution_allowed_assert_;
358
+ bool was_execution_allowed_throws_;
359
+ bool was_execution_allowed_dump_;
360
+ };
361
+
362
+ /**
363
+ * Do not run microtasks while this scope is active, even if microtasks are
364
+ * automatically executed otherwise.
365
+ */
366
+ class V8_EXPORT V8_NODISCARD SuppressMicrotaskExecutionScope {
367
+ public:
368
+ explicit SuppressMicrotaskExecutionScope(
369
+ Isolate* isolate, MicrotaskQueue* microtask_queue = nullptr);
370
+ ~SuppressMicrotaskExecutionScope();
371
+
372
+ // Prevent copying of Scope objects.
373
+ SuppressMicrotaskExecutionScope(const SuppressMicrotaskExecutionScope&) =
374
+ delete;
375
+ SuppressMicrotaskExecutionScope& operator=(
376
+ const SuppressMicrotaskExecutionScope&) = delete;
377
+
378
+ private:
379
+ internal::Isolate* const isolate_;
380
+ internal::MicrotaskQueue* const microtask_queue_;
381
+ internal::Address previous_stack_height_;
382
+
383
+ friend class internal::ThreadLocalTop;
384
+ };
385
+
386
+ /**
387
+ * This scope allows terminations inside direct V8 API calls and forbid them
388
+ * inside any recursive API calls without explicit SafeForTerminationScope.
389
+ */
390
+ class V8_EXPORT V8_NODISCARD SafeForTerminationScope {
391
+ public:
392
+ explicit SafeForTerminationScope(v8::Isolate* isolate);
393
+ ~SafeForTerminationScope();
394
+
395
+ // Prevent copying of Scope objects.
396
+ SafeForTerminationScope(const SafeForTerminationScope&) = delete;
397
+ SafeForTerminationScope& operator=(const SafeForTerminationScope&) = delete;
398
+
399
+ private:
400
+ internal::Isolate* isolate_;
401
+ bool prev_value_;
402
+ };
403
+
404
+ /**
405
+ * Types of garbage collections that can be requested via
406
+ * RequestGarbageCollectionForTesting.
407
+ */
408
+ enum GarbageCollectionType {
409
+ kFullGarbageCollection,
410
+ kMinorGarbageCollection
411
+ };
412
+
413
+ /**
414
+ * Features reported via the SetUseCounterCallback callback. Do not change
415
+ * assigned numbers of existing items; add new features to the end of this
416
+ * list.
417
+ */
418
+ enum UseCounterFeature {
419
+ kUseAsm = 0,
420
+ kBreakIterator = 1,
421
+ kLegacyConst = 2,
422
+ kMarkDequeOverflow = 3,
423
+ kStoreBufferOverflow = 4,
424
+ kSlotsBufferOverflow = 5,
425
+ kObjectObserve = 6,
426
+ kForcedGC = 7,
427
+ kSloppyMode = 8,
428
+ kStrictMode = 9,
429
+ kStrongMode = 10,
430
+ kRegExpPrototypeStickyGetter = 11,
431
+ kRegExpPrototypeToString = 12,
432
+ kRegExpPrototypeUnicodeGetter = 13,
433
+ kIntlV8Parse = 14,
434
+ kIntlPattern = 15,
435
+ kIntlResolved = 16,
436
+ kPromiseChain = 17,
437
+ kPromiseAccept = 18,
438
+ kPromiseDefer = 19,
439
+ kHtmlCommentInExternalScript = 20,
440
+ kHtmlComment = 21,
441
+ kSloppyModeBlockScopedFunctionRedefinition = 22,
442
+ kForInInitializer = 23,
443
+ kArrayProtectorDirtied = 24,
444
+ kArraySpeciesModified = 25,
445
+ kArrayPrototypeConstructorModified = 26,
446
+ kArrayInstanceProtoModified = 27,
447
+ kArrayInstanceConstructorModified = 28,
448
+ kLegacyFunctionDeclaration = 29,
449
+ kRegExpPrototypeSourceGetter = 30, // Unused.
450
+ kRegExpPrototypeOldFlagGetter = 31, // Unused.
451
+ kDecimalWithLeadingZeroInStrictMode = 32,
452
+ kLegacyDateParser = 33,
453
+ kDefineGetterOrSetterWouldThrow = 34,
454
+ kFunctionConstructorReturnedUndefined = 35,
455
+ kAssigmentExpressionLHSIsCallInSloppy = 36,
456
+ kAssigmentExpressionLHSIsCallInStrict = 37,
457
+ kPromiseConstructorReturnedUndefined = 38,
458
+ kConstructorNonUndefinedPrimitiveReturn = 39,
459
+ kLabeledExpressionStatement = 40,
460
+ kLineOrParagraphSeparatorAsLineTerminator = 41,
461
+ kIndexAccessor = 42,
462
+ kErrorCaptureStackTrace = 43,
463
+ kErrorPrepareStackTrace = 44,
464
+ kErrorStackTraceLimit = 45,
465
+ kWebAssemblyInstantiation = 46,
466
+ kDeoptimizerDisableSpeculation = 47,
467
+ kArrayPrototypeSortJSArrayModifiedPrototype = 48,
468
+ kFunctionTokenOffsetTooLongForToString = 49,
469
+ kWasmSharedMemory = 50,
470
+ kWasmThreadOpcodes = 51,
471
+ kAtomicsNotify = 52, // Unused.
472
+ kAtomicsWake = 53, // Unused.
473
+ kCollator = 54,
474
+ kNumberFormat = 55,
475
+ kDateTimeFormat = 56,
476
+ kPluralRules = 57,
477
+ kRelativeTimeFormat = 58,
478
+ kLocale = 59,
479
+ kListFormat = 60,
480
+ kSegmenter = 61,
481
+ kStringLocaleCompare = 62,
482
+ kStringToLocaleUpperCase = 63,
483
+ kStringToLocaleLowerCase = 64,
484
+ kNumberToLocaleString = 65,
485
+ kDateToLocaleString = 66,
486
+ kDateToLocaleDateString = 67,
487
+ kDateToLocaleTimeString = 68,
488
+ kAttemptOverrideReadOnlyOnPrototypeSloppy = 69,
489
+ kAttemptOverrideReadOnlyOnPrototypeStrict = 70,
490
+ kOptimizedFunctionWithOneShotBytecode = 71, // Unused.
491
+ kRegExpMatchIsTrueishOnNonJSRegExp = 72,
492
+ kRegExpMatchIsFalseishOnJSRegExp = 73,
493
+ kDateGetTimezoneOffset = 74, // Unused.
494
+ kStringNormalize = 75,
495
+ kCallSiteAPIGetFunctionSloppyCall = 76,
496
+ kCallSiteAPIGetThisSloppyCall = 77,
497
+ kRegExpMatchAllWithNonGlobalRegExp = 78,
498
+ kRegExpExecCalledOnSlowRegExp = 79,
499
+ kRegExpReplaceCalledOnSlowRegExp = 80,
500
+ kDisplayNames = 81,
501
+ kSharedArrayBufferConstructed = 82,
502
+ kArrayPrototypeHasElements = 83,
503
+ kObjectPrototypeHasElements = 84,
504
+ kNumberFormatStyleUnit = 85,
505
+ kDateTimeFormatRange = 86,
506
+ kDateTimeFormatDateTimeStyle = 87,
507
+ kBreakIteratorTypeWord = 88,
508
+ kBreakIteratorTypeLine = 89,
509
+ kInvalidatedArrayBufferDetachingProtector = 90,
510
+ kInvalidatedArrayConstructorProtector = 91,
511
+ kInvalidatedArrayIteratorLookupChainProtector = 92,
512
+ kInvalidatedArraySpeciesLookupChainProtector = 93,
513
+ kInvalidatedIsConcatSpreadableLookupChainProtector = 94,
514
+ kInvalidatedMapIteratorLookupChainProtector = 95,
515
+ kInvalidatedNoElementsProtector = 96,
516
+ kInvalidatedPromiseHookProtector = 97,
517
+ kInvalidatedPromiseResolveLookupChainProtector = 98,
518
+ kInvalidatedPromiseSpeciesLookupChainProtector = 99,
519
+ kInvalidatedPromiseThenLookupChainProtector = 100,
520
+ kInvalidatedRegExpSpeciesLookupChainProtector = 101,
521
+ kInvalidatedSetIteratorLookupChainProtector = 102,
522
+ kInvalidatedStringIteratorLookupChainProtector = 103,
523
+ kInvalidatedStringLengthOverflowLookupChainProtector = 104,
524
+ kInvalidatedTypedArraySpeciesLookupChainProtector = 105,
525
+ kWasmSimdOpcodes = 106,
526
+ kVarRedeclaredCatchBinding = 107,
527
+ kWasmRefTypes = 108,
528
+ kWasmBulkMemory = 109, // Unused.
529
+ kWasmMultiValue = 110,
530
+ kWasmExceptionHandling = 111,
531
+ kInvalidatedMegaDOMProtector = 112,
532
+ kFunctionPrototypeArguments = 113,
533
+ kFunctionPrototypeCaller = 114,
534
+
535
+ // If you add new values here, you'll also need to update Chromium's:
536
+ // web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
537
+ // this list need to be landed first, then changes on the Chromium side.
538
+ kUseCounterFeatureCount // This enum value must be last.
539
+ };
540
+
541
+ enum MessageErrorLevel {
542
+ kMessageLog = (1 << 0),
543
+ kMessageDebug = (1 << 1),
544
+ kMessageInfo = (1 << 2),
545
+ kMessageError = (1 << 3),
546
+ kMessageWarning = (1 << 4),
547
+ kMessageAll = kMessageLog | kMessageDebug | kMessageInfo | kMessageError |
548
+ kMessageWarning,
549
+ };
550
+
551
+ using UseCounterCallback = void (*)(Isolate* isolate,
552
+ UseCounterFeature feature);
553
+
554
+ /**
555
+ * Allocates a new isolate but does not initialize it. Does not change the
556
+ * currently entered isolate.
557
+ *
558
+ * Only Isolate::GetData() and Isolate::SetData(), which access the
559
+ * embedder-controlled parts of the isolate, are allowed to be called on the
560
+ * uninitialized isolate. To initialize the isolate, call
561
+ * Isolate::Initialize().
562
+ *
563
+ * When an isolate is no longer used its resources should be freed
564
+ * by calling Dispose(). Using the delete operator is not allowed.
565
+ *
566
+ * V8::Initialize() must have run prior to this.
567
+ */
568
+ static Isolate* Allocate();
569
+
570
+ /**
571
+ * Initialize an Isolate previously allocated by Isolate::Allocate().
572
+ */
573
+ static void Initialize(Isolate* isolate, const CreateParams& params);
574
+
575
+ /**
576
+ * Creates a new isolate. Does not change the currently entered
577
+ * isolate.
578
+ *
579
+ * When an isolate is no longer used its resources should be freed
580
+ * by calling Dispose(). Using the delete operator is not allowed.
581
+ *
582
+ * V8::Initialize() must have run prior to this.
583
+ */
584
+ static Isolate* New(const CreateParams& params);
585
+
586
+ /**
587
+ * Returns the entered isolate for the current thread or NULL in
588
+ * case there is no current isolate.
589
+ *
590
+ * This method must not be invoked before V8::Initialize() was invoked.
591
+ */
592
+ static Isolate* GetCurrent();
593
+
594
+ /**
595
+ * Returns the entered isolate for the current thread or NULL in
596
+ * case there is no current isolate.
597
+ *
598
+ * No checks are performed by this method.
599
+ */
600
+ static Isolate* TryGetCurrent();
601
+
602
+ /**
603
+ * Return true if this isolate is currently active.
604
+ **/
605
+ bool IsCurrent() const;
606
+
607
+ /**
608
+ * Clears the set of objects held strongly by the heap. This set of
609
+ * objects are originally built when a WeakRef is created or
610
+ * successfully dereferenced.
611
+ *
612
+ * This is invoked automatically after microtasks are run. See
613
+ * MicrotasksPolicy for when microtasks are run.
614
+ *
615
+ * This needs to be manually invoked only if the embedder is manually running
616
+ * microtasks via a custom MicrotaskQueue class's PerformCheckpoint. In that
617
+ * case, it is the embedder's responsibility to make this call at a time which
618
+ * does not interrupt synchronous ECMAScript code execution.
619
+ */
620
+ void ClearKeptObjects();
621
+
622
+ /**
623
+ * Custom callback used by embedders to help V8 determine if it should abort
624
+ * when it throws and no internal handler is predicted to catch the
625
+ * exception. If --abort-on-uncaught-exception is used on the command line,
626
+ * then V8 will abort if either:
627
+ * - no custom callback is set.
628
+ * - the custom callback set returns true.
629
+ * Otherwise, the custom callback will not be called and V8 will not abort.
630
+ */
631
+ using AbortOnUncaughtExceptionCallback = bool (*)(Isolate*);
632
+ void SetAbortOnUncaughtExceptionCallback(
633
+ AbortOnUncaughtExceptionCallback callback);
634
+
635
+ /**
636
+ * This specifies the callback called by the upcoming dynamic
637
+ * import() language feature to load modules.
638
+ */
639
+ V8_DEPRECATED("Use HostImportModuleDynamicallyCallback")
640
+ void SetHostImportModuleDynamicallyCallback(
641
+ HostImportModuleDynamicallyWithImportAssertionsCallback callback);
642
+ void SetHostImportModuleDynamicallyCallback(
643
+ HostImportModuleDynamicallyCallback callback);
644
+
645
+ /**
646
+ * This specifies the callback called by the upcoming import.meta
647
+ * language feature to retrieve host-defined meta data for a module.
648
+ */
649
+ void SetHostInitializeImportMetaObjectCallback(
650
+ HostInitializeImportMetaObjectCallback callback);
651
+
652
+ /**
653
+ * This specifies the callback called by the upcoming ShadowRealm
654
+ * construction language feature to retrieve host created globals.
655
+ */
656
+ void SetHostCreateShadowRealmContextCallback(
657
+ HostCreateShadowRealmContextCallback callback);
658
+
659
+ /**
660
+ * This specifies the callback called when the stack property of Error
661
+ * is accessed.
662
+ */
663
+ void SetPrepareStackTraceCallback(PrepareStackTraceCallback callback);
664
+
665
+ /**
666
+ * Optional notification that the system is running low on memory.
667
+ * V8 uses these notifications to guide heuristics.
668
+ * It is allowed to call this function from another thread while
669
+ * the isolate is executing long running JavaScript code.
670
+ */
671
+ void MemoryPressureNotification(MemoryPressureLevel level);
672
+
673
+ /**
674
+ * Drop non-essential caches. Should only be called from testing code.
675
+ * The method can potentially block for a long time and does not necessarily
676
+ * trigger GC.
677
+ */
678
+ void ClearCachesForTesting();
679
+
680
+ /**
681
+ * Methods below this point require holding a lock (using Locker) in
682
+ * a multi-threaded environment.
683
+ */
684
+
685
+ /**
686
+ * Sets this isolate as the entered one for the current thread.
687
+ * Saves the previously entered one (if any), so that it can be
688
+ * restored when exiting. Re-entering an isolate is allowed.
689
+ */
690
+ void Enter();
691
+
692
+ /**
693
+ * Exits this isolate by restoring the previously entered one in the
694
+ * current thread. The isolate may still stay the same, if it was
695
+ * entered more than once.
696
+ *
697
+ * Requires: this == Isolate::GetCurrent().
698
+ */
699
+ void Exit();
700
+
701
+ /**
702
+ * Disposes the isolate. The isolate must not be entered by any
703
+ * thread to be disposable.
704
+ */
705
+ void Dispose();
706
+
707
+ /**
708
+ * Dumps activated low-level V8 internal stats. This can be used instead
709
+ * of performing a full isolate disposal.
710
+ */
711
+ void DumpAndResetStats();
712
+
713
+ /**
714
+ * Discards all V8 thread-specific data for the Isolate. Should be used
715
+ * if a thread is terminating and it has used an Isolate that will outlive
716
+ * the thread -- all thread-specific data for an Isolate is discarded when
717
+ * an Isolate is disposed so this call is pointless if an Isolate is about
718
+ * to be Disposed.
719
+ */
720
+ void DiscardThreadSpecificMetadata();
721
+
722
+ /**
723
+ * Associate embedder-specific data with the isolate. |slot| has to be
724
+ * between 0 and GetNumberOfDataSlots() - 1.
725
+ */
726
+ V8_INLINE void SetData(uint32_t slot, void* data);
727
+
728
+ /**
729
+ * Retrieve embedder-specific data from the isolate.
730
+ * Returns NULL if SetData has never been called for the given |slot|.
731
+ */
732
+ V8_INLINE void* GetData(uint32_t slot);
733
+
734
+ /**
735
+ * Returns the maximum number of available embedder data slots. Valid slots
736
+ * are in the range of 0 - GetNumberOfDataSlots() - 1.
737
+ */
738
+ V8_INLINE static uint32_t GetNumberOfDataSlots();
739
+
740
+ /**
741
+ * Return data that was previously attached to the isolate snapshot via
742
+ * SnapshotCreator, and removes the reference to it.
743
+ * Repeated call with the same index returns an empty MaybeLocal.
744
+ */
745
+ template <class T>
746
+ V8_INLINE MaybeLocal<T> GetDataFromSnapshotOnce(size_t index);
747
+
748
+ /**
749
+ * Get statistics about the heap memory usage.
750
+ */
751
+ void GetHeapStatistics(HeapStatistics* heap_statistics);
752
+
753
+ /**
754
+ * Returns the number of spaces in the heap.
755
+ */
756
+ size_t NumberOfHeapSpaces();
757
+
758
+ /**
759
+ * Get the memory usage of a space in the heap.
760
+ *
761
+ * \param space_statistics The HeapSpaceStatistics object to fill in
762
+ * statistics.
763
+ * \param index The index of the space to get statistics from, which ranges
764
+ * from 0 to NumberOfHeapSpaces() - 1.
765
+ * \returns true on success.
766
+ */
767
+ bool GetHeapSpaceStatistics(HeapSpaceStatistics* space_statistics,
768
+ size_t index);
769
+
770
+ /**
771
+ * Returns the number of types of objects tracked in the heap at GC.
772
+ */
773
+ size_t NumberOfTrackedHeapObjectTypes();
774
+
775
+ /**
776
+ * Get statistics about objects in the heap.
777
+ *
778
+ * \param object_statistics The HeapObjectStatistics object to fill in
779
+ * statistics of objects of given type, which were live in the previous GC.
780
+ * \param type_index The index of the type of object to fill details about,
781
+ * which ranges from 0 to NumberOfTrackedHeapObjectTypes() - 1.
782
+ * \returns true on success.
783
+ */
784
+ bool GetHeapObjectStatisticsAtLastGC(HeapObjectStatistics* object_statistics,
785
+ size_t type_index);
786
+
787
+ /**
788
+ * Get statistics about code and its metadata in the heap.
789
+ *
790
+ * \param object_statistics The HeapCodeStatistics object to fill in
791
+ * statistics of code, bytecode and their metadata.
792
+ * \returns true on success.
793
+ */
794
+ bool GetHeapCodeAndMetadataStatistics(HeapCodeStatistics* object_statistics);
795
+
796
+ /**
797
+ * This API is experimental and may change significantly.
798
+ *
799
+ * Enqueues a memory measurement request and invokes the delegate with the
800
+ * results.
801
+ *
802
+ * \param delegate the delegate that defines which contexts to measure and
803
+ * reports the results.
804
+ *
805
+ * \param execution promptness executing the memory measurement.
806
+ * The kEager value is expected to be used only in tests.
807
+ */
808
+ bool MeasureMemory(
809
+ std::unique_ptr<MeasureMemoryDelegate> delegate,
810
+ MeasureMemoryExecution execution = MeasureMemoryExecution::kDefault);
811
+
812
+ /**
813
+ * Get a call stack sample from the isolate.
814
+ * \param state Execution state.
815
+ * \param frames Caller allocated buffer to store stack frames.
816
+ * \param frames_limit Maximum number of frames to capture. The buffer must
817
+ * be large enough to hold the number of frames.
818
+ * \param sample_info The sample info is filled up by the function
819
+ * provides number of actual captured stack frames and
820
+ * the current VM state.
821
+ * \note GetStackSample should only be called when the JS thread is paused or
822
+ * interrupted. Otherwise the behavior is undefined.
823
+ */
824
+ void GetStackSample(const RegisterState& state, void** frames,
825
+ size_t frames_limit, SampleInfo* sample_info);
826
+
827
+ /**
828
+ * Adjusts the amount of registered external memory. Used to give V8 an
829
+ * indication of the amount of externally allocated memory that is kept alive
830
+ * by JavaScript objects. V8 uses this to decide when to perform global
831
+ * garbage collections. Registering externally allocated memory will trigger
832
+ * global garbage collections more often than it would otherwise in an attempt
833
+ * to garbage collect the JavaScript objects that keep the externally
834
+ * allocated memory alive.
835
+ *
836
+ * \param change_in_bytes the change in externally allocated memory that is
837
+ * kept alive by JavaScript objects.
838
+ * \returns the adjusted value.
839
+ */
840
+ int64_t AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes);
841
+
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
+ /**
849
+ * Returns heap profiler for this isolate. Will return NULL until the isolate
850
+ * is initialized.
851
+ */
852
+ HeapProfiler* GetHeapProfiler();
853
+
854
+ /**
855
+ * Tells the VM whether the embedder is idle or not.
856
+ */
857
+ void SetIdle(bool is_idle);
858
+
859
+ /** Returns the ArrayBuffer::Allocator used in this isolate. */
860
+ ArrayBuffer::Allocator* GetArrayBufferAllocator();
861
+
862
+ /** Returns true if this isolate has a current context. */
863
+ bool InContext();
864
+
865
+ /**
866
+ * Returns the context of the currently running JavaScript, or the context
867
+ * on the top of the stack if no JavaScript is running.
868
+ */
869
+ Local<Context> GetCurrentContext();
870
+
871
+ /**
872
+ * Returns either the last context entered through V8's C++ API, or the
873
+ * context of the currently running microtask while processing microtasks.
874
+ * If a context is entered while executing a microtask, that context is
875
+ * returned.
876
+ */
877
+ Local<Context> GetEnteredOrMicrotaskContext();
878
+
879
+ /**
880
+ * Returns the Context that corresponds to the Incumbent realm in HTML spec.
881
+ * https://html.spec.whatwg.org/multipage/webappapis.html#incumbent
882
+ */
883
+ Local<Context> GetIncumbentContext();
884
+
885
+ /**
886
+ * Schedules a v8::Exception::Error with the given message.
887
+ * See ThrowException for more details. Templatized to provide compile-time
888
+ * errors in case of too long strings (see v8::String::NewFromUtf8Literal).
889
+ */
890
+ template <int N>
891
+ Local<Value> ThrowError(const char (&message)[N]) {
892
+ return ThrowError(String::NewFromUtf8Literal(this, message));
893
+ }
894
+ Local<Value> ThrowError(Local<String> message);
895
+
896
+ /**
897
+ * Schedules an exception to be thrown when returning to JavaScript. When an
898
+ * exception has been scheduled it is illegal to invoke any JavaScript
899
+ * operation; the caller must return immediately and only after the exception
900
+ * has been handled does it become legal to invoke JavaScript operations.
901
+ */
902
+ Local<Value> ThrowException(Local<Value> exception);
903
+
904
+ using GCCallback = void (*)(Isolate* isolate, GCType type,
905
+ GCCallbackFlags flags);
906
+ using GCCallbackWithData = void (*)(Isolate* isolate, GCType type,
907
+ GCCallbackFlags flags, void* data);
908
+
909
+ /**
910
+ * Enables the host application to receive a notification before a
911
+ * garbage collection. Allocations are allowed in the callback function,
912
+ * but the callback is not re-entrant: if the allocation inside it will
913
+ * trigger the garbage collection, the callback won't be called again.
914
+ * It is possible to specify the GCType filter for your callback. But it is
915
+ * not possible to register the same callback function two times with
916
+ * different GCType filters.
917
+ */
918
+ void AddGCPrologueCallback(GCCallbackWithData callback, void* data = nullptr,
919
+ GCType gc_type_filter = kGCTypeAll);
920
+ void AddGCPrologueCallback(GCCallback callback,
921
+ GCType gc_type_filter = kGCTypeAll);
922
+
923
+ /**
924
+ * This function removes callback which was installed by
925
+ * AddGCPrologueCallback function.
926
+ */
927
+ void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr);
928
+ void RemoveGCPrologueCallback(GCCallback callback);
929
+
930
+ /**
931
+ * Sets the embedder heap tracer for the isolate.
932
+ * SetEmbedderHeapTracer cannot be used simultaneously with AttachCppHeap.
933
+ */
934
+ void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer);
935
+
936
+ /*
937
+ * Gets the currently active heap tracer for the isolate that was set with
938
+ * SetEmbedderHeapTracer.
939
+ */
940
+ EmbedderHeapTracer* GetEmbedderHeapTracer();
941
+
942
+ /**
943
+ * Sets an embedder roots handle that V8 should consider when performing
944
+ * non-unified heap garbage collections.
945
+ *
946
+ * Using only EmbedderHeapTracer automatically sets up a default handler.
947
+ * The intended use case is for setting a custom handler after invoking
948
+ * `AttachCppHeap()`.
949
+ *
950
+ * V8 does not take ownership of the handler.
951
+ */
952
+ void SetEmbedderRootsHandler(EmbedderRootsHandler* handler);
953
+
954
+ /**
955
+ * Attaches a managed C++ heap as an extension to the JavaScript heap. The
956
+ * embedder maintains ownership of the CppHeap. At most one C++ heap can be
957
+ * attached to V8.
958
+ * AttachCppHeap cannot be used simultaneously with SetEmbedderHeapTracer.
959
+ *
960
+ * This is an experimental feature and may still change significantly.
961
+ */
962
+ void AttachCppHeap(CppHeap*);
963
+
964
+ /**
965
+ * Detaches a managed C++ heap if one was attached using `AttachCppHeap()`.
966
+ *
967
+ * This is an experimental feature and may still change significantly.
968
+ */
969
+ void DetachCppHeap();
970
+
971
+ /**
972
+ * This is an experimental feature and may still change significantly.
973
+
974
+ * \returns the C++ heap managed by V8. Only available if such a heap has been
975
+ * attached using `AttachCppHeap()`.
976
+ */
977
+ CppHeap* GetCppHeap() const;
978
+
979
+ /**
980
+ * Use for |AtomicsWaitCallback| to indicate the type of event it receives.
981
+ */
982
+ enum class AtomicsWaitEvent {
983
+ /** Indicates that this call is happening before waiting. */
984
+ kStartWait,
985
+ /** `Atomics.wait()` finished because of an `Atomics.wake()` call. */
986
+ kWokenUp,
987
+ /** `Atomics.wait()` finished because it timed out. */
988
+ kTimedOut,
989
+ /** `Atomics.wait()` was interrupted through |TerminateExecution()|. */
990
+ kTerminatedExecution,
991
+ /** `Atomics.wait()` was stopped through |AtomicsWaitWakeHandle|. */
992
+ kAPIStopped,
993
+ /** `Atomics.wait()` did not wait, as the initial condition was not met. */
994
+ kNotEqual
995
+ };
996
+
997
+ /**
998
+ * Passed to |AtomicsWaitCallback| as a means of stopping an ongoing
999
+ * `Atomics.wait` call.
1000
+ */
1001
+ class V8_EXPORT AtomicsWaitWakeHandle {
1002
+ public:
1003
+ /**
1004
+ * Stop this `Atomics.wait()` call and call the |AtomicsWaitCallback|
1005
+ * with |kAPIStopped|.
1006
+ *
1007
+ * This function may be called from another thread. The caller has to ensure
1008
+ * through proper synchronization that it is not called after
1009
+ * the finishing |AtomicsWaitCallback|.
1010
+ *
1011
+ * Note that the ECMAScript specification does not plan for the possibility
1012
+ * of wakeups that are neither coming from a timeout or an `Atomics.wake()`
1013
+ * call, so this may invalidate assumptions made by existing code.
1014
+ * The embedder may accordingly wish to schedule an exception in the
1015
+ * finishing |AtomicsWaitCallback|.
1016
+ */
1017
+ void Wake();
1018
+ };
1019
+
1020
+ /**
1021
+ * Embedder callback for `Atomics.wait()` that can be added through
1022
+ * |SetAtomicsWaitCallback|.
1023
+ *
1024
+ * This will be called just before starting to wait with the |event| value
1025
+ * |kStartWait| and after finishing waiting with one of the other
1026
+ * values of |AtomicsWaitEvent| inside of an `Atomics.wait()` call.
1027
+ *
1028
+ * |array_buffer| will refer to the underlying SharedArrayBuffer,
1029
+ * |offset_in_bytes| to the location of the waited-on memory address inside
1030
+ * the SharedArrayBuffer.
1031
+ *
1032
+ * |value| and |timeout_in_ms| will be the values passed to
1033
+ * the `Atomics.wait()` call. If no timeout was used, |timeout_in_ms|
1034
+ * will be `INFINITY`.
1035
+ *
1036
+ * In the |kStartWait| callback, |stop_handle| will be an object that
1037
+ * is only valid until the corresponding finishing callback and that
1038
+ * can be used to stop the wait process while it is happening.
1039
+ *
1040
+ * This callback may schedule exceptions, *unless* |event| is equal to
1041
+ * |kTerminatedExecution|.
1042
+ */
1043
+ using AtomicsWaitCallback = void (*)(AtomicsWaitEvent event,
1044
+ Local<SharedArrayBuffer> array_buffer,
1045
+ size_t offset_in_bytes, int64_t value,
1046
+ double timeout_in_ms,
1047
+ AtomicsWaitWakeHandle* stop_handle,
1048
+ void* data);
1049
+
1050
+ /**
1051
+ * Set a new |AtomicsWaitCallback|. This overrides an earlier
1052
+ * |AtomicsWaitCallback|, if there was any. If |callback| is nullptr,
1053
+ * this unsets the callback. |data| will be passed to the callback
1054
+ * as its last parameter.
1055
+ */
1056
+ void SetAtomicsWaitCallback(AtomicsWaitCallback callback, void* data);
1057
+
1058
+ /**
1059
+ * Enables the host application to receive a notification after a
1060
+ * garbage collection. Allocations are allowed in the callback function,
1061
+ * but the callback is not re-entrant: if the allocation inside it will
1062
+ * trigger the garbage collection, the callback won't be called again.
1063
+ * It is possible to specify the GCType filter for your callback. But it is
1064
+ * not possible to register the same callback function two times with
1065
+ * different GCType filters.
1066
+ */
1067
+ void AddGCEpilogueCallback(GCCallbackWithData callback, void* data = nullptr,
1068
+ GCType gc_type_filter = kGCTypeAll);
1069
+ void AddGCEpilogueCallback(GCCallback callback,
1070
+ GCType gc_type_filter = kGCTypeAll);
1071
+
1072
+ /**
1073
+ * This function removes callback which was installed by
1074
+ * AddGCEpilogueCallback function.
1075
+ */
1076
+ void RemoveGCEpilogueCallback(GCCallbackWithData callback,
1077
+ void* data = nullptr);
1078
+ void RemoveGCEpilogueCallback(GCCallback callback);
1079
+
1080
+ using GetExternallyAllocatedMemoryInBytesCallback = size_t (*)();
1081
+
1082
+ /**
1083
+ * Set the callback that tells V8 how much memory is currently allocated
1084
+ * externally of the V8 heap. Ideally this memory is somehow connected to V8
1085
+ * objects and may get freed-up when the corresponding V8 objects get
1086
+ * collected by a V8 garbage collection.
1087
+ */
1088
+ void SetGetExternallyAllocatedMemoryInBytesCallback(
1089
+ GetExternallyAllocatedMemoryInBytesCallback callback);
1090
+
1091
+ /**
1092
+ * Forcefully terminate the current thread of JavaScript execution
1093
+ * in the given isolate.
1094
+ *
1095
+ * This method can be used by any thread even if that thread has not
1096
+ * acquired the V8 lock with a Locker object.
1097
+ */
1098
+ void TerminateExecution();
1099
+
1100
+ /**
1101
+ * Is V8 terminating JavaScript execution.
1102
+ *
1103
+ * Returns true if JavaScript execution is currently terminating
1104
+ * because of a call to TerminateExecution. In that case there are
1105
+ * still JavaScript frames on the stack and the termination
1106
+ * exception is still active.
1107
+ */
1108
+ bool IsExecutionTerminating();
1109
+
1110
+ /**
1111
+ * Resume execution capability in the given isolate, whose execution
1112
+ * was previously forcefully terminated using TerminateExecution().
1113
+ *
1114
+ * When execution is forcefully terminated using TerminateExecution(),
1115
+ * the isolate can not resume execution until all JavaScript frames
1116
+ * have propagated the uncatchable exception which is generated. This
1117
+ * method allows the program embedding the engine to handle the
1118
+ * termination event and resume execution capability, even if
1119
+ * JavaScript frames remain on the stack.
1120
+ *
1121
+ * This method can be used by any thread even if that thread has not
1122
+ * acquired the V8 lock with a Locker object.
1123
+ */
1124
+ void CancelTerminateExecution();
1125
+
1126
+ /**
1127
+ * Request V8 to interrupt long running JavaScript code and invoke
1128
+ * the given |callback| passing the given |data| to it. After |callback|
1129
+ * returns control will be returned to the JavaScript code.
1130
+ * There may be a number of interrupt requests in flight.
1131
+ * Can be called from another thread without acquiring a |Locker|.
1132
+ * Registered |callback| must not reenter interrupted Isolate.
1133
+ */
1134
+ void RequestInterrupt(InterruptCallback callback, void* data);
1135
+
1136
+ /**
1137
+ * Returns true if there is ongoing background work within V8 that will
1138
+ * eventually post a foreground task, like asynchronous WebAssembly
1139
+ * compilation.
1140
+ */
1141
+ bool HasPendingBackgroundTasks();
1142
+
1143
+ /**
1144
+ * Request garbage collection in this Isolate. It is only valid to call this
1145
+ * function if --expose_gc was specified.
1146
+ *
1147
+ * This should only be used for testing purposes and not to enforce a garbage
1148
+ * collection schedule. It has strong negative impact on the garbage
1149
+ * collection performance. Use IdleNotificationDeadline() or
1150
+ * LowMemoryNotification() instead to influence the garbage collection
1151
+ * schedule.
1152
+ */
1153
+ void RequestGarbageCollectionForTesting(GarbageCollectionType type);
1154
+
1155
+ /**
1156
+ * Request garbage collection with a specific embedderstack state in this
1157
+ * Isolate. It is only valid to call this function if --expose_gc was
1158
+ * specified.
1159
+ *
1160
+ * This should only be used for testing purposes and not to enforce a garbage
1161
+ * collection schedule. It has strong negative impact on the garbage
1162
+ * collection performance. Use IdleNotificationDeadline() or
1163
+ * LowMemoryNotification() instead to influence the garbage collection
1164
+ * schedule.
1165
+ */
1166
+ void RequestGarbageCollectionForTesting(
1167
+ GarbageCollectionType type,
1168
+ EmbedderHeapTracer::EmbedderStackState stack_state);
1169
+
1170
+ /**
1171
+ * Set the callback to invoke for logging event.
1172
+ */
1173
+ void SetEventLogger(LogEventCallback that);
1174
+
1175
+ /**
1176
+ * Adds a callback to notify the host application right before a script
1177
+ * is about to run. If a script re-enters the runtime during executing, the
1178
+ * BeforeCallEnteredCallback is invoked for each re-entrance.
1179
+ * Executing scripts inside the callback will re-trigger the callback.
1180
+ */
1181
+ void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1182
+
1183
+ /**
1184
+ * Removes callback that was installed by AddBeforeCallEnteredCallback.
1185
+ */
1186
+ void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1187
+
1188
+ /**
1189
+ * Adds a callback to notify the host application when a script finished
1190
+ * running. If a script re-enters the runtime during executing, the
1191
+ * CallCompletedCallback is only invoked when the outer-most script
1192
+ * execution ends. Executing scripts inside the callback do not trigger
1193
+ * further callbacks.
1194
+ */
1195
+ void AddCallCompletedCallback(CallCompletedCallback callback);
1196
+
1197
+ /**
1198
+ * Removes callback that was installed by AddCallCompletedCallback.
1199
+ */
1200
+ void RemoveCallCompletedCallback(CallCompletedCallback callback);
1201
+
1202
+ /**
1203
+ * Set the PromiseHook callback for various promise lifecycle
1204
+ * events.
1205
+ */
1206
+ void SetPromiseHook(PromiseHook hook);
1207
+
1208
+ /**
1209
+ * Set callback to notify about promise reject with no handler, or
1210
+ * revocation of such a previous notification once the handler is added.
1211
+ */
1212
+ void SetPromiseRejectCallback(PromiseRejectCallback callback);
1213
+
1214
+ /**
1215
+ * Runs the default MicrotaskQueue until it gets empty and perform other
1216
+ * microtask checkpoint steps, such as calling ClearKeptObjects. Asserts that
1217
+ * the MicrotasksPolicy is not kScoped. Any exceptions thrown by microtask
1218
+ * callbacks are swallowed.
1219
+ */
1220
+ void PerformMicrotaskCheckpoint();
1221
+
1222
+ /**
1223
+ * Enqueues the callback to the default MicrotaskQueue
1224
+ */
1225
+ void EnqueueMicrotask(Local<Function> microtask);
1226
+
1227
+ /**
1228
+ * Enqueues the callback to the default MicrotaskQueue
1229
+ */
1230
+ void EnqueueMicrotask(MicrotaskCallback callback, void* data = nullptr);
1231
+
1232
+ /**
1233
+ * Controls how Microtasks are invoked. See MicrotasksPolicy for details.
1234
+ */
1235
+ void SetMicrotasksPolicy(MicrotasksPolicy policy);
1236
+
1237
+ /**
1238
+ * Returns the policy controlling how Microtasks are invoked.
1239
+ */
1240
+ MicrotasksPolicy GetMicrotasksPolicy() const;
1241
+
1242
+ /**
1243
+ * Adds a callback to notify the host application after
1244
+ * microtasks were run on the default MicrotaskQueue. The callback is
1245
+ * triggered by explicit RunMicrotasks call or automatic microtasks execution
1246
+ * (see SetMicrotaskPolicy).
1247
+ *
1248
+ * Callback will trigger even if microtasks were attempted to run,
1249
+ * but the microtasks queue was empty and no single microtask was actually
1250
+ * executed.
1251
+ *
1252
+ * Executing scripts inside the callback will not re-trigger microtasks and
1253
+ * the callback.
1254
+ */
1255
+ void AddMicrotasksCompletedCallback(
1256
+ MicrotasksCompletedCallbackWithData callback, void* data = nullptr);
1257
+
1258
+ /**
1259
+ * Removes callback that was installed by AddMicrotasksCompletedCallback.
1260
+ */
1261
+ void RemoveMicrotasksCompletedCallback(
1262
+ MicrotasksCompletedCallbackWithData callback, void* data = nullptr);
1263
+
1264
+ /**
1265
+ * Sets a callback for counting the number of times a feature of V8 is used.
1266
+ */
1267
+ void SetUseCounterCallback(UseCounterCallback callback);
1268
+
1269
+ /**
1270
+ * Enables the host application to provide a mechanism for recording
1271
+ * statistics counters.
1272
+ */
1273
+ void SetCounterFunction(CounterLookupCallback);
1274
+
1275
+ /**
1276
+ * Enables the host application to provide a mechanism for recording
1277
+ * histograms. The CreateHistogram function returns a
1278
+ * histogram which will later be passed to the AddHistogramSample
1279
+ * function.
1280
+ */
1281
+ void SetCreateHistogramFunction(CreateHistogramCallback);
1282
+ void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
1283
+
1284
+ /**
1285
+ * Enables the host application to provide a mechanism for recording
1286
+ * event based metrics. In order to use this interface
1287
+ * include/v8-metrics.h
1288
+ * needs to be included and the recorder needs to be derived from the
1289
+ * Recorder base class defined there.
1290
+ * This method can only be called once per isolate and must happen during
1291
+ * isolate initialization before background threads are spawned.
1292
+ */
1293
+ void SetMetricsRecorder(
1294
+ const std::shared_ptr<metrics::Recorder>& metrics_recorder);
1295
+
1296
+ /**
1297
+ * Enables the host application to provide a mechanism for recording a
1298
+ * predefined set of data as crash keys to be used in postmortem debugging in
1299
+ * case of a crash.
1300
+ */
1301
+ void SetAddCrashKeyCallback(AddCrashKeyCallback);
1302
+
1303
+ /**
1304
+ * Optional notification that the embedder is idle.
1305
+ * V8 uses the notification to perform garbage collection.
1306
+ * This call can be used repeatedly if the embedder remains idle.
1307
+ * Returns true if the embedder should stop calling IdleNotificationDeadline
1308
+ * until real work has been done. This indicates that V8 has done
1309
+ * as much cleanup as it will be able to do.
1310
+ *
1311
+ * The deadline_in_seconds argument specifies the deadline V8 has to finish
1312
+ * garbage collection work. deadline_in_seconds is compared with
1313
+ * MonotonicallyIncreasingTime() and should be based on the same timebase as
1314
+ * that function. There is no guarantee that the actual work will be done
1315
+ * within the time limit.
1316
+ */
1317
+ bool IdleNotificationDeadline(double deadline_in_seconds);
1318
+
1319
+ /**
1320
+ * Optional notification that the system is running low on memory.
1321
+ * V8 uses these notifications to attempt to free memory.
1322
+ */
1323
+ void LowMemoryNotification();
1324
+
1325
+ /**
1326
+ * Optional notification that a context has been disposed. V8 uses these
1327
+ * notifications to guide the GC heuristic and cancel FinalizationRegistry
1328
+ * cleanup tasks. Returns the number of context disposals - including this one
1329
+ * - since the last time V8 had a chance to clean up.
1330
+ *
1331
+ * The optional parameter |dependant_context| specifies whether the disposed
1332
+ * context was depending on state from other contexts or not.
1333
+ */
1334
+ int ContextDisposedNotification(bool dependant_context = true);
1335
+
1336
+ /**
1337
+ * Optional notification that the isolate switched to the foreground.
1338
+ * V8 uses these notifications to guide heuristics.
1339
+ */
1340
+ void IsolateInForegroundNotification();
1341
+
1342
+ /**
1343
+ * Optional notification that the isolate switched to the background.
1344
+ * V8 uses these notifications to guide heuristics.
1345
+ */
1346
+ void IsolateInBackgroundNotification();
1347
+
1348
+ /**
1349
+ * Optional notification which will enable the memory savings mode.
1350
+ * V8 uses this notification to guide heuristics which may result in a
1351
+ * smaller memory footprint at the cost of reduced runtime performance.
1352
+ */
1353
+ void EnableMemorySavingsMode();
1354
+
1355
+ /**
1356
+ * Optional notification which will disable the memory savings mode.
1357
+ */
1358
+ void DisableMemorySavingsMode();
1359
+
1360
+ /**
1361
+ * Optional notification to tell V8 the current performance requirements
1362
+ * of the embedder based on RAIL.
1363
+ * V8 uses these notifications to guide heuristics.
1364
+ * This is an unfinished experimental feature. Semantics and implementation
1365
+ * may change frequently.
1366
+ */
1367
+ void SetRAILMode(RAILMode rail_mode);
1368
+
1369
+ /**
1370
+ * Update load start time of the RAIL mode
1371
+ */
1372
+ void UpdateLoadStartTime();
1373
+
1374
+ /**
1375
+ * Optional notification to tell V8 the current isolate is used for debugging
1376
+ * and requires higher heap limit.
1377
+ */
1378
+ void IncreaseHeapLimitForDebugging();
1379
+
1380
+ /**
1381
+ * Restores the original heap limit after IncreaseHeapLimitForDebugging().
1382
+ */
1383
+ void RestoreOriginalHeapLimit();
1384
+
1385
+ /**
1386
+ * Returns true if the heap limit was increased for debugging and the
1387
+ * original heap limit was not restored yet.
1388
+ */
1389
+ bool IsHeapLimitIncreasedForDebugging();
1390
+
1391
+ /**
1392
+ * Allows the host application to provide the address of a function that is
1393
+ * notified each time code is added, moved or removed.
1394
+ *
1395
+ * \param options options for the JIT code event handler.
1396
+ * \param event_handler the JIT code event handler, which will be invoked
1397
+ * each time code is added, moved or removed.
1398
+ * \note \p event_handler won't get notified of existent code.
1399
+ * \note since code removal notifications are not currently issued, the
1400
+ * \p event_handler may get notifications of code that overlaps earlier
1401
+ * code notifications. This happens when code areas are reused, and the
1402
+ * earlier overlapping code areas should therefore be discarded.
1403
+ * \note the events passed to \p event_handler and the strings they point to
1404
+ * are not guaranteed to live past each call. The \p event_handler must
1405
+ * copy strings and other parameters it needs to keep around.
1406
+ * \note the set of events declared in JitCodeEvent::EventType is expected to
1407
+ * grow over time, and the JitCodeEvent structure is expected to accrue
1408
+ * new members. The \p event_handler function must ignore event codes
1409
+ * it does not recognize to maintain future compatibility.
1410
+ * \note Use Isolate::CreateParams to get events for code executed during
1411
+ * Isolate setup.
1412
+ */
1413
+ void SetJitCodeEventHandler(JitCodeEventOptions options,
1414
+ JitCodeEventHandler event_handler);
1415
+
1416
+ /**
1417
+ * Modifies the stack limit for this Isolate.
1418
+ *
1419
+ * \param stack_limit An address beyond which the Vm's stack may not grow.
1420
+ *
1421
+ * \note If you are using threads then you should hold the V8::Locker lock
1422
+ * while setting the stack limit and you must set a non-default stack
1423
+ * limit separately for each thread.
1424
+ */
1425
+ void SetStackLimit(uintptr_t stack_limit);
1426
+
1427
+ /**
1428
+ * Returns a memory range that can potentially contain jitted code. Code for
1429
+ * V8's 'builtins' will not be in this range if embedded builtins is enabled.
1430
+ *
1431
+ * On Win64, embedders are advised to install function table callbacks for
1432
+ * these ranges, as default SEH won't be able to unwind through jitted code.
1433
+ * The first page of the code range is reserved for the embedder and is
1434
+ * committed, writable, and executable, to be used to store unwind data, as
1435
+ * documented in
1436
+ * https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64.
1437
+ *
1438
+ * Might be empty on other platforms.
1439
+ *
1440
+ * https://code.google.com/p/v8/issues/detail?id=3598
1441
+ */
1442
+ void GetCodeRange(void** start, size_t* length_in_bytes);
1443
+
1444
+ /**
1445
+ * As GetCodeRange, but for embedded builtins (these live in a distinct
1446
+ * memory region from other V8 Code objects).
1447
+ */
1448
+ void GetEmbeddedCodeRange(const void** start, size_t* length_in_bytes);
1449
+
1450
+ /**
1451
+ * Returns the JSEntryStubs necessary for use with the Unwinder API.
1452
+ */
1453
+ JSEntryStubs GetJSEntryStubs();
1454
+
1455
+ static constexpr size_t kMinCodePagesBufferSize = 32;
1456
+
1457
+ /**
1458
+ * Copies the code heap pages currently in use by V8 into |code_pages_out|.
1459
+ * |code_pages_out| must have at least kMinCodePagesBufferSize capacity and
1460
+ * must be empty.
1461
+ *
1462
+ * Signal-safe, does not allocate, does not access the V8 heap.
1463
+ * No code on the stack can rely on pages that might be missing.
1464
+ *
1465
+ * Returns the number of pages available to be copied, which might be greater
1466
+ * than |capacity|. In this case, only |capacity| pages will be copied into
1467
+ * |code_pages_out|. The caller should provide a bigger buffer on the next
1468
+ * call in order to get all available code pages, but this is not required.
1469
+ */
1470
+ size_t CopyCodePages(size_t capacity, MemoryRange* code_pages_out);
1471
+
1472
+ /** Set the callback to invoke in case of fatal errors. */
1473
+ void SetFatalErrorHandler(FatalErrorCallback that);
1474
+
1475
+ /** Set the callback to invoke in case of OOM errors. */
1476
+ void SetOOMErrorHandler(OOMErrorCallback that);
1477
+
1478
+ /**
1479
+ * Add a callback to invoke in case the heap size is close to the heap limit.
1480
+ * If multiple callbacks are added, only the most recently added callback is
1481
+ * invoked.
1482
+ */
1483
+ void AddNearHeapLimitCallback(NearHeapLimitCallback callback, void* data);
1484
+
1485
+ /**
1486
+ * Remove the given callback and restore the heap limit to the
1487
+ * given limit. If the given limit is zero, then it is ignored.
1488
+ * If the current heap size is greater than the given limit,
1489
+ * then the heap limit is restored to the minimal limit that
1490
+ * is possible for the current heap size.
1491
+ */
1492
+ void RemoveNearHeapLimitCallback(NearHeapLimitCallback callback,
1493
+ size_t heap_limit);
1494
+
1495
+ /**
1496
+ * If the heap limit was changed by the NearHeapLimitCallback, then the
1497
+ * initial heap limit will be restored once the heap size falls below the
1498
+ * given threshold percentage of the initial heap limit.
1499
+ * The threshold percentage is a number in (0.0, 1.0) range.
1500
+ */
1501
+ void AutomaticallyRestoreInitialHeapLimit(double threshold_percent = 0.5);
1502
+
1503
+ /**
1504
+ * Set the callback to invoke to check if code generation from
1505
+ * strings should be allowed.
1506
+ */
1507
+ void SetModifyCodeGenerationFromStringsCallback(
1508
+ ModifyCodeGenerationFromStringsCallback2 callback);
1509
+
1510
+ /**
1511
+ * Set the callback to invoke to check if wasm code generation should
1512
+ * be allowed.
1513
+ */
1514
+ void SetAllowWasmCodeGenerationCallback(
1515
+ AllowWasmCodeGenerationCallback callback);
1516
+
1517
+ /**
1518
+ * Embedder over{ride|load} injection points for wasm APIs. The expectation
1519
+ * is that the embedder sets them at most once.
1520
+ */
1521
+ void SetWasmModuleCallback(ExtensionCallback callback);
1522
+ void SetWasmInstanceCallback(ExtensionCallback callback);
1523
+
1524
+ void SetWasmStreamingCallback(WasmStreamingCallback callback);
1525
+
1526
+ void SetWasmLoadSourceMapCallback(WasmLoadSourceMapCallback callback);
1527
+
1528
+ void SetWasmSimdEnabledCallback(WasmSimdEnabledCallback callback);
1529
+
1530
+ void SetWasmExceptionsEnabledCallback(WasmExceptionsEnabledCallback callback);
1531
+
1532
+ void SetWasmDynamicTieringEnabledCallback(
1533
+ WasmDynamicTieringEnabledCallback callback);
1534
+
1535
+ void SetSharedArrayBufferConstructorEnabledCallback(
1536
+ SharedArrayBufferConstructorEnabledCallback callback);
1537
+
1538
+ /**
1539
+ * This function can be called by the embedder to signal V8 that the dynamic
1540
+ * enabling of features has finished. V8 can now set up dynamically added
1541
+ * features.
1542
+ */
1543
+ void InstallConditionalFeatures(Local<Context> context);
1544
+
1545
+ /**
1546
+ * Check if V8 is dead and therefore unusable. This is the case after
1547
+ * fatal errors such as out-of-memory situations.
1548
+ */
1549
+ bool IsDead();
1550
+
1551
+ /**
1552
+ * Adds a message listener (errors only).
1553
+ *
1554
+ * The same message listener can be added more than once and in that
1555
+ * case it will be called more than once for each message.
1556
+ *
1557
+ * If data is specified, it will be passed to the callback when it is called.
1558
+ * Otherwise, the exception object will be passed to the callback instead.
1559
+ */
1560
+ bool AddMessageListener(MessageCallback that,
1561
+ Local<Value> data = Local<Value>());
1562
+
1563
+ /**
1564
+ * Adds a message listener.
1565
+ *
1566
+ * The same message listener can be added more than once and in that
1567
+ * case it will be called more than once for each message.
1568
+ *
1569
+ * If data is specified, it will be passed to the callback when it is called.
1570
+ * Otherwise, the exception object will be passed to the callback instead.
1571
+ *
1572
+ * A listener can listen for particular error levels by providing a mask.
1573
+ */
1574
+ bool AddMessageListenerWithErrorLevel(MessageCallback that,
1575
+ int message_levels,
1576
+ Local<Value> data = Local<Value>());
1577
+
1578
+ /**
1579
+ * Remove all message listeners from the specified callback function.
1580
+ */
1581
+ void RemoveMessageListeners(MessageCallback that);
1582
+
1583
+ /** Callback function for reporting failed access checks.*/
1584
+ void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback);
1585
+
1586
+ /**
1587
+ * Tells V8 to capture current stack trace when uncaught exception occurs
1588
+ * and report it to the message listeners. The option is off by default.
1589
+ */
1590
+ void SetCaptureStackTraceForUncaughtExceptions(
1591
+ bool capture, int frame_limit = 10,
1592
+ StackTrace::StackTraceOptions options = StackTrace::kOverview);
1593
+
1594
+ /**
1595
+ * Iterates through all external resources referenced from current isolate
1596
+ * heap. GC is not invoked prior to iterating, therefore there is no
1597
+ * guarantee that visited objects are still alive.
1598
+ */
1599
+ void VisitExternalResources(ExternalResourceVisitor* visitor);
1600
+
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
+ /**
1615
+ * Check if this isolate is in use.
1616
+ * True if at least one thread Enter'ed this isolate.
1617
+ */
1618
+ bool IsInUse();
1619
+
1620
+ /**
1621
+ * Set whether calling Atomics.wait (a function that may block) is allowed in
1622
+ * this isolate. This can also be configured via
1623
+ * CreateParams::allow_atomics_wait.
1624
+ */
1625
+ void SetAllowAtomicsWait(bool allow);
1626
+
1627
+ /**
1628
+ * Time zone redetection indicator for
1629
+ * DateTimeConfigurationChangeNotification.
1630
+ *
1631
+ * kSkip indicates V8 that the notification should not trigger redetecting
1632
+ * host time zone. kRedetect indicates V8 that host time zone should be
1633
+ * redetected, and used to set the default time zone.
1634
+ *
1635
+ * The host time zone detection may require file system access or similar
1636
+ * operations unlikely to be available inside a sandbox. If v8 is run inside a
1637
+ * sandbox, the host time zone has to be detected outside the sandbox before
1638
+ * calling DateTimeConfigurationChangeNotification function.
1639
+ */
1640
+ enum class TimeZoneDetection { kSkip, kRedetect };
1641
+
1642
+ /**
1643
+ * Notification that the embedder has changed the time zone, daylight savings
1644
+ * time or other date / time configuration parameters. V8 keeps a cache of
1645
+ * various values used for date / time computation. This notification will
1646
+ * reset those cached values for the current context so that date / time
1647
+ * configuration changes would be reflected.
1648
+ *
1649
+ * This API should not be called more than needed as it will negatively impact
1650
+ * the performance of date operations.
1651
+ */
1652
+ void DateTimeConfigurationChangeNotification(
1653
+ TimeZoneDetection time_zone_detection = TimeZoneDetection::kSkip);
1654
+
1655
+ /**
1656
+ * Notification that the embedder has changed the locale. V8 keeps a cache of
1657
+ * various values used for locale computation. This notification will reset
1658
+ * those cached values for the current context so that locale configuration
1659
+ * changes would be reflected.
1660
+ *
1661
+ * This API should not be called more than needed as it will negatively impact
1662
+ * the performance of locale operations.
1663
+ */
1664
+ void LocaleConfigurationChangeNotification();
1665
+
1666
+ Isolate() = delete;
1667
+ ~Isolate() = delete;
1668
+ Isolate(const Isolate&) = delete;
1669
+ Isolate& operator=(const Isolate&) = delete;
1670
+ // Deleting operator new and delete here is allowed as ctor and dtor is also
1671
+ // deleted.
1672
+ void* operator new(size_t size) = delete;
1673
+ void* operator new[](size_t size) = delete;
1674
+ void operator delete(void*, size_t) = delete;
1675
+ void operator delete[](void*, size_t) = delete;
1676
+
1677
+ private:
1678
+ template <class K, class V, class Traits>
1679
+ friend class PersistentValueMapBase;
1680
+
1681
+ internal::Address* GetDataFromSnapshotOnce(size_t index);
1682
+ void ReportExternalAllocationLimitReached();
1683
+ };
1684
+
1685
+ void Isolate::SetData(uint32_t slot, void* data) {
1686
+ using I = internal::Internals;
1687
+ I::SetEmbedderData(this, slot, data);
1688
+ }
1689
+
1690
+ void* Isolate::GetData(uint32_t slot) {
1691
+ using I = internal::Internals;
1692
+ return I::GetEmbedderData(this, slot);
1693
+ }
1694
+
1695
+ uint32_t Isolate::GetNumberOfDataSlots() {
1696
+ using I = internal::Internals;
1697
+ return I::kNumIsolateDataSlots;
1698
+ }
1699
+
1700
+ template <class T>
1701
+ MaybeLocal<T> Isolate::GetDataFromSnapshotOnce(size_t index) {
1702
+ T* data = reinterpret_cast<T*>(GetDataFromSnapshotOnce(index));
1703
+ if (data) internal::PerformCastCheck(data);
1704
+ return Local<T>(data);
1705
+ }
1706
+
1707
+ } // namespace v8
1708
+
1709
+ #endif // INCLUDE_V8_ISOLATE_H_