libv8-node 16.19.0.1-x86_64-linux → 17.9.1.1-x86_64-linux

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