11cb0ef41Sopenharmony_ci// Copyright 2021 the V8 project authors. All rights reserved. 21cb0ef41Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 31cb0ef41Sopenharmony_ci// found in the LICENSE file. 41cb0ef41Sopenharmony_ci 51cb0ef41Sopenharmony_ci#ifndef INCLUDE_V8_ISOLATE_H_ 61cb0ef41Sopenharmony_ci#define INCLUDE_V8_ISOLATE_H_ 71cb0ef41Sopenharmony_ci 81cb0ef41Sopenharmony_ci#include <stddef.h> 91cb0ef41Sopenharmony_ci#include <stdint.h> 101cb0ef41Sopenharmony_ci 111cb0ef41Sopenharmony_ci#include <memory> 121cb0ef41Sopenharmony_ci#include <utility> 131cb0ef41Sopenharmony_ci 141cb0ef41Sopenharmony_ci#include "cppgc/common.h" 151cb0ef41Sopenharmony_ci#include "v8-array-buffer.h" // NOLINT(build/include_directory) 161cb0ef41Sopenharmony_ci#include "v8-callbacks.h" // NOLINT(build/include_directory) 171cb0ef41Sopenharmony_ci#include "v8-data.h" // NOLINT(build/include_directory) 181cb0ef41Sopenharmony_ci#include "v8-debug.h" // NOLINT(build/include_directory) 191cb0ef41Sopenharmony_ci#include "v8-embedder-heap.h" // NOLINT(build/include_directory) 201cb0ef41Sopenharmony_ci#include "v8-function-callback.h" // NOLINT(build/include_directory) 211cb0ef41Sopenharmony_ci#include "v8-internal.h" // NOLINT(build/include_directory) 221cb0ef41Sopenharmony_ci#include "v8-local-handle.h" // NOLINT(build/include_directory) 231cb0ef41Sopenharmony_ci#include "v8-microtask.h" // NOLINT(build/include_directory) 241cb0ef41Sopenharmony_ci#include "v8-persistent-handle.h" // NOLINT(build/include_directory) 251cb0ef41Sopenharmony_ci#include "v8-primitive.h" // NOLINT(build/include_directory) 261cb0ef41Sopenharmony_ci#include "v8-statistics.h" // NOLINT(build/include_directory) 271cb0ef41Sopenharmony_ci#include "v8-unwinder.h" // NOLINT(build/include_directory) 281cb0ef41Sopenharmony_ci#include "v8config.h" // NOLINT(build/include_directory) 291cb0ef41Sopenharmony_ci 301cb0ef41Sopenharmony_cinamespace v8 { 311cb0ef41Sopenharmony_ci 321cb0ef41Sopenharmony_ciclass CppHeap; 331cb0ef41Sopenharmony_ciclass HeapProfiler; 341cb0ef41Sopenharmony_ciclass MicrotaskQueue; 351cb0ef41Sopenharmony_ciclass StartupData; 361cb0ef41Sopenharmony_ciclass ScriptOrModule; 371cb0ef41Sopenharmony_ciclass SharedArrayBuffer; 381cb0ef41Sopenharmony_ci 391cb0ef41Sopenharmony_cinamespace internal { 401cb0ef41Sopenharmony_ciclass MicrotaskQueue; 411cb0ef41Sopenharmony_ciclass ThreadLocalTop; 421cb0ef41Sopenharmony_ci} // namespace internal 431cb0ef41Sopenharmony_ci 441cb0ef41Sopenharmony_cinamespace metrics { 451cb0ef41Sopenharmony_ciclass Recorder; 461cb0ef41Sopenharmony_ci} // namespace metrics 471cb0ef41Sopenharmony_ci 481cb0ef41Sopenharmony_ci/** 491cb0ef41Sopenharmony_ci * A set of constraints that specifies the limits of the runtime's memory use. 501cb0ef41Sopenharmony_ci * You must set the heap size before initializing the VM - the size cannot be 511cb0ef41Sopenharmony_ci * adjusted after the VM is initialized. 521cb0ef41Sopenharmony_ci * 531cb0ef41Sopenharmony_ci * If you are using threads then you should hold the V8::Locker lock while 541cb0ef41Sopenharmony_ci * setting the stack limit and you must set a non-default stack limit separately 551cb0ef41Sopenharmony_ci * for each thread. 561cb0ef41Sopenharmony_ci * 571cb0ef41Sopenharmony_ci * The arguments for set_max_semi_space_size, set_max_old_space_size, 581cb0ef41Sopenharmony_ci * set_max_executable_size, set_code_range_size specify limits in MB. 591cb0ef41Sopenharmony_ci * 601cb0ef41Sopenharmony_ci * The argument for set_max_semi_space_size_in_kb is in KB. 611cb0ef41Sopenharmony_ci */ 621cb0ef41Sopenharmony_ciclass V8_EXPORT ResourceConstraints { 631cb0ef41Sopenharmony_ci public: 641cb0ef41Sopenharmony_ci /** 651cb0ef41Sopenharmony_ci * Configures the constraints with reasonable default values based on the 661cb0ef41Sopenharmony_ci * provided heap size limit. The heap size includes both the young and 671cb0ef41Sopenharmony_ci * the old generation. 681cb0ef41Sopenharmony_ci * 691cb0ef41Sopenharmony_ci * \param initial_heap_size_in_bytes The initial heap size or zero. 701cb0ef41Sopenharmony_ci * By default V8 starts with a small heap and dynamically grows it to 711cb0ef41Sopenharmony_ci * match the set of live objects. This may lead to ineffective 721cb0ef41Sopenharmony_ci * garbage collections at startup if the live set is large. 731cb0ef41Sopenharmony_ci * Setting the initial heap size avoids such garbage collections. 741cb0ef41Sopenharmony_ci * Note that this does not affect young generation garbage collections. 751cb0ef41Sopenharmony_ci * 761cb0ef41Sopenharmony_ci * \param maximum_heap_size_in_bytes The hard limit for the heap size. 771cb0ef41Sopenharmony_ci * When the heap size approaches this limit, V8 will perform series of 781cb0ef41Sopenharmony_ci * garbage collections and invoke the NearHeapLimitCallback. If the garbage 791cb0ef41Sopenharmony_ci * collections do not help and the callback does not increase the limit, 801cb0ef41Sopenharmony_ci * then V8 will crash with V8::FatalProcessOutOfMemory. 811cb0ef41Sopenharmony_ci */ 821cb0ef41Sopenharmony_ci void ConfigureDefaultsFromHeapSize(size_t initial_heap_size_in_bytes, 831cb0ef41Sopenharmony_ci size_t maximum_heap_size_in_bytes); 841cb0ef41Sopenharmony_ci 851cb0ef41Sopenharmony_ci /** 861cb0ef41Sopenharmony_ci * Configures the constraints with reasonable default values based on the 871cb0ef41Sopenharmony_ci * capabilities of the current device the VM is running on. 881cb0ef41Sopenharmony_ci * 891cb0ef41Sopenharmony_ci * \param physical_memory The total amount of physical memory on the current 901cb0ef41Sopenharmony_ci * device, in bytes. 911cb0ef41Sopenharmony_ci * \param virtual_memory_limit The amount of virtual memory on the current 921cb0ef41Sopenharmony_ci * device, in bytes, or zero, if there is no limit. 931cb0ef41Sopenharmony_ci */ 941cb0ef41Sopenharmony_ci void ConfigureDefaults(uint64_t physical_memory, 951cb0ef41Sopenharmony_ci uint64_t virtual_memory_limit); 961cb0ef41Sopenharmony_ci 971cb0ef41Sopenharmony_ci /** 981cb0ef41Sopenharmony_ci * The address beyond which the VM's stack may not grow. 991cb0ef41Sopenharmony_ci */ 1001cb0ef41Sopenharmony_ci uint32_t* stack_limit() const { return stack_limit_; } 1011cb0ef41Sopenharmony_ci void set_stack_limit(uint32_t* value) { stack_limit_ = value; } 1021cb0ef41Sopenharmony_ci 1031cb0ef41Sopenharmony_ci /** 1041cb0ef41Sopenharmony_ci * The amount of virtual memory reserved for generated code. This is relevant 1051cb0ef41Sopenharmony_ci * for 64-bit architectures that rely on code range for calls in code. 1061cb0ef41Sopenharmony_ci * 1071cb0ef41Sopenharmony_ci * When V8_COMPRESS_POINTERS_IN_SHARED_CAGE is defined, there is a shared 1081cb0ef41Sopenharmony_ci * process-wide code range that is lazily initialized. This value is used to 1091cb0ef41Sopenharmony_ci * configure that shared code range when the first Isolate is 1101cb0ef41Sopenharmony_ci * created. Subsequent Isolates ignore this value. 1111cb0ef41Sopenharmony_ci */ 1121cb0ef41Sopenharmony_ci size_t code_range_size_in_bytes() const { return code_range_size_; } 1131cb0ef41Sopenharmony_ci void set_code_range_size_in_bytes(size_t limit) { code_range_size_ = limit; } 1141cb0ef41Sopenharmony_ci 1151cb0ef41Sopenharmony_ci /** 1161cb0ef41Sopenharmony_ci * The maximum size of the old generation. 1171cb0ef41Sopenharmony_ci * When the old generation approaches this limit, V8 will perform series of 1181cb0ef41Sopenharmony_ci * garbage collections and invoke the NearHeapLimitCallback. 1191cb0ef41Sopenharmony_ci * If the garbage collections do not help and the callback does not 1201cb0ef41Sopenharmony_ci * increase the limit, then V8 will crash with V8::FatalProcessOutOfMemory. 1211cb0ef41Sopenharmony_ci */ 1221cb0ef41Sopenharmony_ci size_t max_old_generation_size_in_bytes() const { 1231cb0ef41Sopenharmony_ci return max_old_generation_size_; 1241cb0ef41Sopenharmony_ci } 1251cb0ef41Sopenharmony_ci void set_max_old_generation_size_in_bytes(size_t limit) { 1261cb0ef41Sopenharmony_ci max_old_generation_size_ = limit; 1271cb0ef41Sopenharmony_ci } 1281cb0ef41Sopenharmony_ci 1291cb0ef41Sopenharmony_ci /** 1301cb0ef41Sopenharmony_ci * The maximum size of the young generation, which consists of two semi-spaces 1311cb0ef41Sopenharmony_ci * and a large object space. This affects frequency of Scavenge garbage 1321cb0ef41Sopenharmony_ci * collections and should be typically much smaller that the old generation. 1331cb0ef41Sopenharmony_ci */ 1341cb0ef41Sopenharmony_ci size_t max_young_generation_size_in_bytes() const { 1351cb0ef41Sopenharmony_ci return max_young_generation_size_; 1361cb0ef41Sopenharmony_ci } 1371cb0ef41Sopenharmony_ci void set_max_young_generation_size_in_bytes(size_t limit) { 1381cb0ef41Sopenharmony_ci max_young_generation_size_ = limit; 1391cb0ef41Sopenharmony_ci } 1401cb0ef41Sopenharmony_ci 1411cb0ef41Sopenharmony_ci size_t initial_old_generation_size_in_bytes() const { 1421cb0ef41Sopenharmony_ci return initial_old_generation_size_; 1431cb0ef41Sopenharmony_ci } 1441cb0ef41Sopenharmony_ci void set_initial_old_generation_size_in_bytes(size_t initial_size) { 1451cb0ef41Sopenharmony_ci initial_old_generation_size_ = initial_size; 1461cb0ef41Sopenharmony_ci } 1471cb0ef41Sopenharmony_ci 1481cb0ef41Sopenharmony_ci size_t initial_young_generation_size_in_bytes() const { 1491cb0ef41Sopenharmony_ci return initial_young_generation_size_; 1501cb0ef41Sopenharmony_ci } 1511cb0ef41Sopenharmony_ci void set_initial_young_generation_size_in_bytes(size_t initial_size) { 1521cb0ef41Sopenharmony_ci initial_young_generation_size_ = initial_size; 1531cb0ef41Sopenharmony_ci } 1541cb0ef41Sopenharmony_ci 1551cb0ef41Sopenharmony_ci private: 1561cb0ef41Sopenharmony_ci static constexpr size_t kMB = 1048576u; 1571cb0ef41Sopenharmony_ci size_t code_range_size_ = 0; 1581cb0ef41Sopenharmony_ci size_t max_old_generation_size_ = 0; 1591cb0ef41Sopenharmony_ci size_t max_young_generation_size_ = 0; 1601cb0ef41Sopenharmony_ci size_t initial_old_generation_size_ = 0; 1611cb0ef41Sopenharmony_ci size_t initial_young_generation_size_ = 0; 1621cb0ef41Sopenharmony_ci uint32_t* stack_limit_ = nullptr; 1631cb0ef41Sopenharmony_ci}; 1641cb0ef41Sopenharmony_ci 1651cb0ef41Sopenharmony_ci/** 1661cb0ef41Sopenharmony_ci * Option flags passed to the SetRAILMode function. 1671cb0ef41Sopenharmony_ci * See documentation https://developers.google.com/web/tools/chrome-devtools/ 1681cb0ef41Sopenharmony_ci * profile/evaluate-performance/rail 1691cb0ef41Sopenharmony_ci */ 1701cb0ef41Sopenharmony_cienum RAILMode : unsigned { 1711cb0ef41Sopenharmony_ci // Response performance mode: In this mode very low virtual machine latency 1721cb0ef41Sopenharmony_ci // is provided. V8 will try to avoid JavaScript execution interruptions. 1731cb0ef41Sopenharmony_ci // Throughput may be throttled. 1741cb0ef41Sopenharmony_ci PERFORMANCE_RESPONSE, 1751cb0ef41Sopenharmony_ci // Animation performance mode: In this mode low virtual machine latency is 1761cb0ef41Sopenharmony_ci // provided. V8 will try to avoid as many JavaScript execution interruptions 1771cb0ef41Sopenharmony_ci // as possible. Throughput may be throttled. This is the default mode. 1781cb0ef41Sopenharmony_ci PERFORMANCE_ANIMATION, 1791cb0ef41Sopenharmony_ci // Idle performance mode: The embedder is idle. V8 can complete deferred work 1801cb0ef41Sopenharmony_ci // in this mode. 1811cb0ef41Sopenharmony_ci PERFORMANCE_IDLE, 1821cb0ef41Sopenharmony_ci // Load performance mode: In this mode high throughput is provided. V8 may 1831cb0ef41Sopenharmony_ci // turn off latency optimizations. 1841cb0ef41Sopenharmony_ci PERFORMANCE_LOAD 1851cb0ef41Sopenharmony_ci}; 1861cb0ef41Sopenharmony_ci 1871cb0ef41Sopenharmony_ci/** 1881cb0ef41Sopenharmony_ci * Memory pressure level for the MemoryPressureNotification. 1891cb0ef41Sopenharmony_ci * kNone hints V8 that there is no memory pressure. 1901cb0ef41Sopenharmony_ci * kModerate hints V8 to speed up incremental garbage collection at the cost of 1911cb0ef41Sopenharmony_ci * of higher latency due to garbage collection pauses. 1921cb0ef41Sopenharmony_ci * kCritical hints V8 to free memory as soon as possible. Garbage collection 1931cb0ef41Sopenharmony_ci * pauses at this level will be large. 1941cb0ef41Sopenharmony_ci */ 1951cb0ef41Sopenharmony_cienum class MemoryPressureLevel { kNone, kModerate, kCritical }; 1961cb0ef41Sopenharmony_ci 1971cb0ef41Sopenharmony_ci/** 1981cb0ef41Sopenharmony_ci * Indicator for the stack state. 1991cb0ef41Sopenharmony_ci */ 2001cb0ef41Sopenharmony_ciusing StackState = cppgc::EmbedderStackState; 2011cb0ef41Sopenharmony_ci 2021cb0ef41Sopenharmony_ci/** 2031cb0ef41Sopenharmony_ci * Isolate represents an isolated instance of the V8 engine. V8 isolates have 2041cb0ef41Sopenharmony_ci * completely separate states. Objects from one isolate must not be used in 2051cb0ef41Sopenharmony_ci * other isolates. The embedder can create multiple isolates and use them in 2061cb0ef41Sopenharmony_ci * parallel in multiple threads. An isolate can be entered by at most one 2071cb0ef41Sopenharmony_ci * thread at any given time. The Locker/Unlocker API must be used to 2081cb0ef41Sopenharmony_ci * synchronize. 2091cb0ef41Sopenharmony_ci */ 2101cb0ef41Sopenharmony_ciclass V8_EXPORT Isolate { 2111cb0ef41Sopenharmony_ci public: 2121cb0ef41Sopenharmony_ci /** 2131cb0ef41Sopenharmony_ci * Initial configuration parameters for a new Isolate. 2141cb0ef41Sopenharmony_ci */ 2151cb0ef41Sopenharmony_ci struct V8_EXPORT CreateParams { 2161cb0ef41Sopenharmony_ci CreateParams(); 2171cb0ef41Sopenharmony_ci ~CreateParams(); 2181cb0ef41Sopenharmony_ci 2191cb0ef41Sopenharmony_ci ALLOW_COPY_AND_MOVE_WITH_DEPRECATED_FIELDS(CreateParams) 2201cb0ef41Sopenharmony_ci 2211cb0ef41Sopenharmony_ci /** 2221cb0ef41Sopenharmony_ci * Allows the host application to provide the address of a function that is 2231cb0ef41Sopenharmony_ci * notified each time code is added, moved or removed. 2241cb0ef41Sopenharmony_ci */ 2251cb0ef41Sopenharmony_ci JitCodeEventHandler code_event_handler = nullptr; 2261cb0ef41Sopenharmony_ci 2271cb0ef41Sopenharmony_ci /** 2281cb0ef41Sopenharmony_ci * ResourceConstraints to use for the new Isolate. 2291cb0ef41Sopenharmony_ci */ 2301cb0ef41Sopenharmony_ci ResourceConstraints constraints; 2311cb0ef41Sopenharmony_ci 2321cb0ef41Sopenharmony_ci /** 2331cb0ef41Sopenharmony_ci * Explicitly specify a startup snapshot blob. The embedder owns the blob. 2341cb0ef41Sopenharmony_ci * The embedder *must* ensure that the snapshot is from a trusted source. 2351cb0ef41Sopenharmony_ci */ 2361cb0ef41Sopenharmony_ci const StartupData* snapshot_blob = nullptr; 2371cb0ef41Sopenharmony_ci 2381cb0ef41Sopenharmony_ci /** 2391cb0ef41Sopenharmony_ci * Enables the host application to provide a mechanism for recording 2401cb0ef41Sopenharmony_ci * statistics counters. 2411cb0ef41Sopenharmony_ci */ 2421cb0ef41Sopenharmony_ci CounterLookupCallback counter_lookup_callback = nullptr; 2431cb0ef41Sopenharmony_ci 2441cb0ef41Sopenharmony_ci /** 2451cb0ef41Sopenharmony_ci * Enables the host application to provide a mechanism for recording 2461cb0ef41Sopenharmony_ci * histograms. The CreateHistogram function returns a 2471cb0ef41Sopenharmony_ci * histogram which will later be passed to the AddHistogramSample 2481cb0ef41Sopenharmony_ci * function. 2491cb0ef41Sopenharmony_ci */ 2501cb0ef41Sopenharmony_ci CreateHistogramCallback create_histogram_callback = nullptr; 2511cb0ef41Sopenharmony_ci AddHistogramSampleCallback add_histogram_sample_callback = nullptr; 2521cb0ef41Sopenharmony_ci 2531cb0ef41Sopenharmony_ci /** 2541cb0ef41Sopenharmony_ci * The ArrayBuffer::Allocator to use for allocating and freeing the backing 2551cb0ef41Sopenharmony_ci * store of ArrayBuffers. 2561cb0ef41Sopenharmony_ci * 2571cb0ef41Sopenharmony_ci * If the shared_ptr version is used, the Isolate instance and every 2581cb0ef41Sopenharmony_ci * |BackingStore| allocated using this allocator hold a std::shared_ptr 2591cb0ef41Sopenharmony_ci * to the allocator, in order to facilitate lifetime 2601cb0ef41Sopenharmony_ci * management for the allocator instance. 2611cb0ef41Sopenharmony_ci */ 2621cb0ef41Sopenharmony_ci ArrayBuffer::Allocator* array_buffer_allocator = nullptr; 2631cb0ef41Sopenharmony_ci std::shared_ptr<ArrayBuffer::Allocator> array_buffer_allocator_shared; 2641cb0ef41Sopenharmony_ci 2651cb0ef41Sopenharmony_ci /** 2661cb0ef41Sopenharmony_ci * Specifies an optional nullptr-terminated array of raw addresses in the 2671cb0ef41Sopenharmony_ci * embedder that V8 can match against during serialization and use for 2681cb0ef41Sopenharmony_ci * deserialization. This array and its content must stay valid for the 2691cb0ef41Sopenharmony_ci * entire lifetime of the isolate. 2701cb0ef41Sopenharmony_ci */ 2711cb0ef41Sopenharmony_ci const intptr_t* external_references = nullptr; 2721cb0ef41Sopenharmony_ci 2731cb0ef41Sopenharmony_ci /** 2741cb0ef41Sopenharmony_ci * Whether calling Atomics.wait (a function that may block) is allowed in 2751cb0ef41Sopenharmony_ci * this isolate. This can also be configured via SetAllowAtomicsWait. 2761cb0ef41Sopenharmony_ci */ 2771cb0ef41Sopenharmony_ci bool allow_atomics_wait = true; 2781cb0ef41Sopenharmony_ci 2791cb0ef41Sopenharmony_ci /** 2801cb0ef41Sopenharmony_ci * Termination is postponed when there is no active SafeForTerminationScope. 2811cb0ef41Sopenharmony_ci */ 2821cb0ef41Sopenharmony_ci bool only_terminate_in_safe_scope = false; 2831cb0ef41Sopenharmony_ci 2841cb0ef41Sopenharmony_ci /** 2851cb0ef41Sopenharmony_ci * The following parameters describe the offsets for addressing type info 2861cb0ef41Sopenharmony_ci * for wrapped API objects and are used by the fast C API 2871cb0ef41Sopenharmony_ci * (for details see v8-fast-api-calls.h). 2881cb0ef41Sopenharmony_ci */ 2891cb0ef41Sopenharmony_ci int embedder_wrapper_type_index = -1; 2901cb0ef41Sopenharmony_ci int embedder_wrapper_object_index = -1; 2911cb0ef41Sopenharmony_ci 2921cb0ef41Sopenharmony_ci /** 2931cb0ef41Sopenharmony_ci * Callbacks to invoke in case of fatal or OOM errors. 2941cb0ef41Sopenharmony_ci */ 2951cb0ef41Sopenharmony_ci FatalErrorCallback fatal_error_callback = nullptr; 2961cb0ef41Sopenharmony_ci OOMErrorCallback oom_error_callback = nullptr; 2971cb0ef41Sopenharmony_ci }; 2981cb0ef41Sopenharmony_ci 2991cb0ef41Sopenharmony_ci /** 3001cb0ef41Sopenharmony_ci * Stack-allocated class which sets the isolate for all operations 3011cb0ef41Sopenharmony_ci * executed within a local scope. 3021cb0ef41Sopenharmony_ci */ 3031cb0ef41Sopenharmony_ci class V8_EXPORT V8_NODISCARD Scope { 3041cb0ef41Sopenharmony_ci public: 3051cb0ef41Sopenharmony_ci explicit Scope(Isolate* isolate) : v8_isolate_(isolate) { 3061cb0ef41Sopenharmony_ci v8_isolate_->Enter(); 3071cb0ef41Sopenharmony_ci } 3081cb0ef41Sopenharmony_ci 3091cb0ef41Sopenharmony_ci ~Scope() { v8_isolate_->Exit(); } 3101cb0ef41Sopenharmony_ci 3111cb0ef41Sopenharmony_ci // Prevent copying of Scope objects. 3121cb0ef41Sopenharmony_ci Scope(const Scope&) = delete; 3131cb0ef41Sopenharmony_ci Scope& operator=(const Scope&) = delete; 3141cb0ef41Sopenharmony_ci 3151cb0ef41Sopenharmony_ci private: 3161cb0ef41Sopenharmony_ci Isolate* const v8_isolate_; 3171cb0ef41Sopenharmony_ci }; 3181cb0ef41Sopenharmony_ci 3191cb0ef41Sopenharmony_ci /** 3201cb0ef41Sopenharmony_ci * Assert that no Javascript code is invoked. 3211cb0ef41Sopenharmony_ci */ 3221cb0ef41Sopenharmony_ci class V8_EXPORT V8_NODISCARD DisallowJavascriptExecutionScope { 3231cb0ef41Sopenharmony_ci public: 3241cb0ef41Sopenharmony_ci enum OnFailure { CRASH_ON_FAILURE, THROW_ON_FAILURE, DUMP_ON_FAILURE }; 3251cb0ef41Sopenharmony_ci 3261cb0ef41Sopenharmony_ci DisallowJavascriptExecutionScope(Isolate* isolate, OnFailure on_failure); 3271cb0ef41Sopenharmony_ci ~DisallowJavascriptExecutionScope(); 3281cb0ef41Sopenharmony_ci 3291cb0ef41Sopenharmony_ci // Prevent copying of Scope objects. 3301cb0ef41Sopenharmony_ci DisallowJavascriptExecutionScope(const DisallowJavascriptExecutionScope&) = 3311cb0ef41Sopenharmony_ci delete; 3321cb0ef41Sopenharmony_ci DisallowJavascriptExecutionScope& operator=( 3331cb0ef41Sopenharmony_ci const DisallowJavascriptExecutionScope&) = delete; 3341cb0ef41Sopenharmony_ci 3351cb0ef41Sopenharmony_ci private: 3361cb0ef41Sopenharmony_ci v8::Isolate* const v8_isolate_; 3371cb0ef41Sopenharmony_ci const OnFailure on_failure_; 3381cb0ef41Sopenharmony_ci bool was_execution_allowed_; 3391cb0ef41Sopenharmony_ci }; 3401cb0ef41Sopenharmony_ci 3411cb0ef41Sopenharmony_ci /** 3421cb0ef41Sopenharmony_ci * Introduce exception to DisallowJavascriptExecutionScope. 3431cb0ef41Sopenharmony_ci */ 3441cb0ef41Sopenharmony_ci class V8_EXPORT V8_NODISCARD AllowJavascriptExecutionScope { 3451cb0ef41Sopenharmony_ci public: 3461cb0ef41Sopenharmony_ci explicit AllowJavascriptExecutionScope(Isolate* isolate); 3471cb0ef41Sopenharmony_ci ~AllowJavascriptExecutionScope(); 3481cb0ef41Sopenharmony_ci 3491cb0ef41Sopenharmony_ci // Prevent copying of Scope objects. 3501cb0ef41Sopenharmony_ci AllowJavascriptExecutionScope(const AllowJavascriptExecutionScope&) = 3511cb0ef41Sopenharmony_ci delete; 3521cb0ef41Sopenharmony_ci AllowJavascriptExecutionScope& operator=( 3531cb0ef41Sopenharmony_ci const AllowJavascriptExecutionScope&) = delete; 3541cb0ef41Sopenharmony_ci 3551cb0ef41Sopenharmony_ci private: 3561cb0ef41Sopenharmony_ci Isolate* const v8_isolate_; 3571cb0ef41Sopenharmony_ci bool was_execution_allowed_assert_; 3581cb0ef41Sopenharmony_ci bool was_execution_allowed_throws_; 3591cb0ef41Sopenharmony_ci bool was_execution_allowed_dump_; 3601cb0ef41Sopenharmony_ci }; 3611cb0ef41Sopenharmony_ci 3621cb0ef41Sopenharmony_ci /** 3631cb0ef41Sopenharmony_ci * Do not run microtasks while this scope is active, even if microtasks are 3641cb0ef41Sopenharmony_ci * automatically executed otherwise. 3651cb0ef41Sopenharmony_ci */ 3661cb0ef41Sopenharmony_ci class V8_EXPORT V8_NODISCARD SuppressMicrotaskExecutionScope { 3671cb0ef41Sopenharmony_ci public: 3681cb0ef41Sopenharmony_ci explicit SuppressMicrotaskExecutionScope( 3691cb0ef41Sopenharmony_ci Isolate* isolate, MicrotaskQueue* microtask_queue = nullptr); 3701cb0ef41Sopenharmony_ci ~SuppressMicrotaskExecutionScope(); 3711cb0ef41Sopenharmony_ci 3721cb0ef41Sopenharmony_ci // Prevent copying of Scope objects. 3731cb0ef41Sopenharmony_ci SuppressMicrotaskExecutionScope(const SuppressMicrotaskExecutionScope&) = 3741cb0ef41Sopenharmony_ci delete; 3751cb0ef41Sopenharmony_ci SuppressMicrotaskExecutionScope& operator=( 3761cb0ef41Sopenharmony_ci const SuppressMicrotaskExecutionScope&) = delete; 3771cb0ef41Sopenharmony_ci 3781cb0ef41Sopenharmony_ci private: 3791cb0ef41Sopenharmony_ci internal::Isolate* const i_isolate_; 3801cb0ef41Sopenharmony_ci internal::MicrotaskQueue* const microtask_queue_; 3811cb0ef41Sopenharmony_ci internal::Address previous_stack_height_; 3821cb0ef41Sopenharmony_ci 3831cb0ef41Sopenharmony_ci friend class internal::ThreadLocalTop; 3841cb0ef41Sopenharmony_ci }; 3851cb0ef41Sopenharmony_ci 3861cb0ef41Sopenharmony_ci /** 3871cb0ef41Sopenharmony_ci * This scope allows terminations inside direct V8 API calls and forbid them 3881cb0ef41Sopenharmony_ci * inside any recursive API calls without explicit SafeForTerminationScope. 3891cb0ef41Sopenharmony_ci */ 3901cb0ef41Sopenharmony_ci class V8_EXPORT V8_NODISCARD SafeForTerminationScope { 3911cb0ef41Sopenharmony_ci public: 3921cb0ef41Sopenharmony_ci explicit SafeForTerminationScope(v8::Isolate* v8_isolate); 3931cb0ef41Sopenharmony_ci ~SafeForTerminationScope(); 3941cb0ef41Sopenharmony_ci 3951cb0ef41Sopenharmony_ci // Prevent copying of Scope objects. 3961cb0ef41Sopenharmony_ci SafeForTerminationScope(const SafeForTerminationScope&) = delete; 3971cb0ef41Sopenharmony_ci SafeForTerminationScope& operator=(const SafeForTerminationScope&) = delete; 3981cb0ef41Sopenharmony_ci 3991cb0ef41Sopenharmony_ci private: 4001cb0ef41Sopenharmony_ci internal::Isolate* i_isolate_; 4011cb0ef41Sopenharmony_ci bool prev_value_; 4021cb0ef41Sopenharmony_ci }; 4031cb0ef41Sopenharmony_ci 4041cb0ef41Sopenharmony_ci /** 4051cb0ef41Sopenharmony_ci * Types of garbage collections that can be requested via 4061cb0ef41Sopenharmony_ci * RequestGarbageCollectionForTesting. 4071cb0ef41Sopenharmony_ci */ 4081cb0ef41Sopenharmony_ci enum GarbageCollectionType { 4091cb0ef41Sopenharmony_ci kFullGarbageCollection, 4101cb0ef41Sopenharmony_ci kMinorGarbageCollection 4111cb0ef41Sopenharmony_ci }; 4121cb0ef41Sopenharmony_ci 4131cb0ef41Sopenharmony_ci /** 4141cb0ef41Sopenharmony_ci * Features reported via the SetUseCounterCallback callback. Do not change 4151cb0ef41Sopenharmony_ci * assigned numbers of existing items; add new features to the end of this 4161cb0ef41Sopenharmony_ci * list. 4171cb0ef41Sopenharmony_ci */ 4181cb0ef41Sopenharmony_ci enum UseCounterFeature { 4191cb0ef41Sopenharmony_ci kUseAsm = 0, 4201cb0ef41Sopenharmony_ci kBreakIterator = 1, 4211cb0ef41Sopenharmony_ci kLegacyConst = 2, 4221cb0ef41Sopenharmony_ci kMarkDequeOverflow = 3, 4231cb0ef41Sopenharmony_ci kStoreBufferOverflow = 4, 4241cb0ef41Sopenharmony_ci kSlotsBufferOverflow = 5, 4251cb0ef41Sopenharmony_ci kObjectObserve = 6, 4261cb0ef41Sopenharmony_ci kForcedGC = 7, 4271cb0ef41Sopenharmony_ci kSloppyMode = 8, 4281cb0ef41Sopenharmony_ci kStrictMode = 9, 4291cb0ef41Sopenharmony_ci kStrongMode = 10, 4301cb0ef41Sopenharmony_ci kRegExpPrototypeStickyGetter = 11, 4311cb0ef41Sopenharmony_ci kRegExpPrototypeToString = 12, 4321cb0ef41Sopenharmony_ci kRegExpPrototypeUnicodeGetter = 13, 4331cb0ef41Sopenharmony_ci kIntlV8Parse = 14, 4341cb0ef41Sopenharmony_ci kIntlPattern = 15, 4351cb0ef41Sopenharmony_ci kIntlResolved = 16, 4361cb0ef41Sopenharmony_ci kPromiseChain = 17, 4371cb0ef41Sopenharmony_ci kPromiseAccept = 18, 4381cb0ef41Sopenharmony_ci kPromiseDefer = 19, 4391cb0ef41Sopenharmony_ci kHtmlCommentInExternalScript = 20, 4401cb0ef41Sopenharmony_ci kHtmlComment = 21, 4411cb0ef41Sopenharmony_ci kSloppyModeBlockScopedFunctionRedefinition = 22, 4421cb0ef41Sopenharmony_ci kForInInitializer = 23, 4431cb0ef41Sopenharmony_ci kArrayProtectorDirtied = 24, 4441cb0ef41Sopenharmony_ci kArraySpeciesModified = 25, 4451cb0ef41Sopenharmony_ci kArrayPrototypeConstructorModified = 26, 4461cb0ef41Sopenharmony_ci kArrayInstanceProtoModified = 27, 4471cb0ef41Sopenharmony_ci kArrayInstanceConstructorModified = 28, 4481cb0ef41Sopenharmony_ci kLegacyFunctionDeclaration = 29, 4491cb0ef41Sopenharmony_ci kRegExpPrototypeSourceGetter = 30, // Unused. 4501cb0ef41Sopenharmony_ci kRegExpPrototypeOldFlagGetter = 31, // Unused. 4511cb0ef41Sopenharmony_ci kDecimalWithLeadingZeroInStrictMode = 32, 4521cb0ef41Sopenharmony_ci kLegacyDateParser = 33, 4531cb0ef41Sopenharmony_ci kDefineGetterOrSetterWouldThrow = 34, 4541cb0ef41Sopenharmony_ci kFunctionConstructorReturnedUndefined = 35, 4551cb0ef41Sopenharmony_ci kAssigmentExpressionLHSIsCallInSloppy = 36, 4561cb0ef41Sopenharmony_ci kAssigmentExpressionLHSIsCallInStrict = 37, 4571cb0ef41Sopenharmony_ci kPromiseConstructorReturnedUndefined = 38, 4581cb0ef41Sopenharmony_ci kConstructorNonUndefinedPrimitiveReturn = 39, 4591cb0ef41Sopenharmony_ci kLabeledExpressionStatement = 40, 4601cb0ef41Sopenharmony_ci kLineOrParagraphSeparatorAsLineTerminator = 41, 4611cb0ef41Sopenharmony_ci kIndexAccessor = 42, 4621cb0ef41Sopenharmony_ci kErrorCaptureStackTrace = 43, 4631cb0ef41Sopenharmony_ci kErrorPrepareStackTrace = 44, 4641cb0ef41Sopenharmony_ci kErrorStackTraceLimit = 45, 4651cb0ef41Sopenharmony_ci kWebAssemblyInstantiation = 46, 4661cb0ef41Sopenharmony_ci kDeoptimizerDisableSpeculation = 47, 4671cb0ef41Sopenharmony_ci kArrayPrototypeSortJSArrayModifiedPrototype = 48, 4681cb0ef41Sopenharmony_ci kFunctionTokenOffsetTooLongForToString = 49, 4691cb0ef41Sopenharmony_ci kWasmSharedMemory = 50, 4701cb0ef41Sopenharmony_ci kWasmThreadOpcodes = 51, 4711cb0ef41Sopenharmony_ci kAtomicsNotify = 52, // Unused. 4721cb0ef41Sopenharmony_ci kAtomicsWake = 53, // Unused. 4731cb0ef41Sopenharmony_ci kCollator = 54, 4741cb0ef41Sopenharmony_ci kNumberFormat = 55, 4751cb0ef41Sopenharmony_ci kDateTimeFormat = 56, 4761cb0ef41Sopenharmony_ci kPluralRules = 57, 4771cb0ef41Sopenharmony_ci kRelativeTimeFormat = 58, 4781cb0ef41Sopenharmony_ci kLocale = 59, 4791cb0ef41Sopenharmony_ci kListFormat = 60, 4801cb0ef41Sopenharmony_ci kSegmenter = 61, 4811cb0ef41Sopenharmony_ci kStringLocaleCompare = 62, 4821cb0ef41Sopenharmony_ci kStringToLocaleUpperCase = 63, 4831cb0ef41Sopenharmony_ci kStringToLocaleLowerCase = 64, 4841cb0ef41Sopenharmony_ci kNumberToLocaleString = 65, 4851cb0ef41Sopenharmony_ci kDateToLocaleString = 66, 4861cb0ef41Sopenharmony_ci kDateToLocaleDateString = 67, 4871cb0ef41Sopenharmony_ci kDateToLocaleTimeString = 68, 4881cb0ef41Sopenharmony_ci kAttemptOverrideReadOnlyOnPrototypeSloppy = 69, 4891cb0ef41Sopenharmony_ci kAttemptOverrideReadOnlyOnPrototypeStrict = 70, 4901cb0ef41Sopenharmony_ci kOptimizedFunctionWithOneShotBytecode = 71, // Unused. 4911cb0ef41Sopenharmony_ci kRegExpMatchIsTrueishOnNonJSRegExp = 72, 4921cb0ef41Sopenharmony_ci kRegExpMatchIsFalseishOnJSRegExp = 73, 4931cb0ef41Sopenharmony_ci kDateGetTimezoneOffset = 74, // Unused. 4941cb0ef41Sopenharmony_ci kStringNormalize = 75, 4951cb0ef41Sopenharmony_ci kCallSiteAPIGetFunctionSloppyCall = 76, 4961cb0ef41Sopenharmony_ci kCallSiteAPIGetThisSloppyCall = 77, 4971cb0ef41Sopenharmony_ci kRegExpMatchAllWithNonGlobalRegExp = 78, 4981cb0ef41Sopenharmony_ci kRegExpExecCalledOnSlowRegExp = 79, 4991cb0ef41Sopenharmony_ci kRegExpReplaceCalledOnSlowRegExp = 80, 5001cb0ef41Sopenharmony_ci kDisplayNames = 81, 5011cb0ef41Sopenharmony_ci kSharedArrayBufferConstructed = 82, 5021cb0ef41Sopenharmony_ci kArrayPrototypeHasElements = 83, 5031cb0ef41Sopenharmony_ci kObjectPrototypeHasElements = 84, 5041cb0ef41Sopenharmony_ci kNumberFormatStyleUnit = 85, 5051cb0ef41Sopenharmony_ci kDateTimeFormatRange = 86, 5061cb0ef41Sopenharmony_ci kDateTimeFormatDateTimeStyle = 87, 5071cb0ef41Sopenharmony_ci kBreakIteratorTypeWord = 88, 5081cb0ef41Sopenharmony_ci kBreakIteratorTypeLine = 89, 5091cb0ef41Sopenharmony_ci kInvalidatedArrayBufferDetachingProtector = 90, 5101cb0ef41Sopenharmony_ci kInvalidatedArrayConstructorProtector = 91, 5111cb0ef41Sopenharmony_ci kInvalidatedArrayIteratorLookupChainProtector = 92, 5121cb0ef41Sopenharmony_ci kInvalidatedArraySpeciesLookupChainProtector = 93, 5131cb0ef41Sopenharmony_ci kInvalidatedIsConcatSpreadableLookupChainProtector = 94, 5141cb0ef41Sopenharmony_ci kInvalidatedMapIteratorLookupChainProtector = 95, 5151cb0ef41Sopenharmony_ci kInvalidatedNoElementsProtector = 96, 5161cb0ef41Sopenharmony_ci kInvalidatedPromiseHookProtector = 97, 5171cb0ef41Sopenharmony_ci kInvalidatedPromiseResolveLookupChainProtector = 98, 5181cb0ef41Sopenharmony_ci kInvalidatedPromiseSpeciesLookupChainProtector = 99, 5191cb0ef41Sopenharmony_ci kInvalidatedPromiseThenLookupChainProtector = 100, 5201cb0ef41Sopenharmony_ci kInvalidatedRegExpSpeciesLookupChainProtector = 101, 5211cb0ef41Sopenharmony_ci kInvalidatedSetIteratorLookupChainProtector = 102, 5221cb0ef41Sopenharmony_ci kInvalidatedStringIteratorLookupChainProtector = 103, 5231cb0ef41Sopenharmony_ci kInvalidatedStringLengthOverflowLookupChainProtector = 104, 5241cb0ef41Sopenharmony_ci kInvalidatedTypedArraySpeciesLookupChainProtector = 105, 5251cb0ef41Sopenharmony_ci kWasmSimdOpcodes = 106, 5261cb0ef41Sopenharmony_ci kVarRedeclaredCatchBinding = 107, 5271cb0ef41Sopenharmony_ci kWasmRefTypes = 108, 5281cb0ef41Sopenharmony_ci kWasmBulkMemory = 109, // Unused. 5291cb0ef41Sopenharmony_ci kWasmMultiValue = 110, 5301cb0ef41Sopenharmony_ci kWasmExceptionHandling = 111, 5311cb0ef41Sopenharmony_ci kInvalidatedMegaDOMProtector = 112, 5321cb0ef41Sopenharmony_ci kFunctionPrototypeArguments = 113, 5331cb0ef41Sopenharmony_ci kFunctionPrototypeCaller = 114, 5341cb0ef41Sopenharmony_ci kTurboFanOsrCompileStarted = 115, 5351cb0ef41Sopenharmony_ci kAsyncStackTaggingCreateTaskCall = 116, 5361cb0ef41Sopenharmony_ci kDurationFormat = 117, 5371cb0ef41Sopenharmony_ci kInvalidatedNumberStringPrototypeNoReplaceProtector = 118, 5381cb0ef41Sopenharmony_ci kRegExpUnicodeSetIncompatibilitiesWithUnicodeMode = 119, // Unused. 5391cb0ef41Sopenharmony_ci kImportAssertionDeprecatedSyntax = 120, 5401cb0ef41Sopenharmony_ci kLocaleInfoObsoletedGetters = 121, 5411cb0ef41Sopenharmony_ci kLocaleInfoFunctions = 122, 5421cb0ef41Sopenharmony_ci kCompileHintsMagicAll = 123, 5431cb0ef41Sopenharmony_ci 5441cb0ef41Sopenharmony_ci // If you add new values here, you'll also need to update Chromium's: 5451cb0ef41Sopenharmony_ci // web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to 5461cb0ef41Sopenharmony_ci // this list need to be landed first, then changes on the Chromium side. 5471cb0ef41Sopenharmony_ci kUseCounterFeatureCount // This enum value must be last. 5481cb0ef41Sopenharmony_ci }; 5491cb0ef41Sopenharmony_ci 5501cb0ef41Sopenharmony_ci enum MessageErrorLevel { 5511cb0ef41Sopenharmony_ci kMessageLog = (1 << 0), 5521cb0ef41Sopenharmony_ci kMessageDebug = (1 << 1), 5531cb0ef41Sopenharmony_ci kMessageInfo = (1 << 2), 5541cb0ef41Sopenharmony_ci kMessageError = (1 << 3), 5551cb0ef41Sopenharmony_ci kMessageWarning = (1 << 4), 5561cb0ef41Sopenharmony_ci kMessageAll = kMessageLog | kMessageDebug | kMessageInfo | kMessageError | 5571cb0ef41Sopenharmony_ci kMessageWarning, 5581cb0ef41Sopenharmony_ci }; 5591cb0ef41Sopenharmony_ci 5601cb0ef41Sopenharmony_ci using UseCounterCallback = void (*)(Isolate* isolate, 5611cb0ef41Sopenharmony_ci UseCounterFeature feature); 5621cb0ef41Sopenharmony_ci 5631cb0ef41Sopenharmony_ci /** 5641cb0ef41Sopenharmony_ci * Allocates a new isolate but does not initialize it. Does not change the 5651cb0ef41Sopenharmony_ci * currently entered isolate. 5661cb0ef41Sopenharmony_ci * 5671cb0ef41Sopenharmony_ci * Only Isolate::GetData() and Isolate::SetData(), which access the 5681cb0ef41Sopenharmony_ci * embedder-controlled parts of the isolate, are allowed to be called on the 5691cb0ef41Sopenharmony_ci * uninitialized isolate. To initialize the isolate, call 5701cb0ef41Sopenharmony_ci * Isolate::Initialize(). 5711cb0ef41Sopenharmony_ci * 5721cb0ef41Sopenharmony_ci * When an isolate is no longer used its resources should be freed 5731cb0ef41Sopenharmony_ci * by calling Dispose(). Using the delete operator is not allowed. 5741cb0ef41Sopenharmony_ci * 5751cb0ef41Sopenharmony_ci * V8::Initialize() must have run prior to this. 5761cb0ef41Sopenharmony_ci */ 5771cb0ef41Sopenharmony_ci static Isolate* Allocate(); 5781cb0ef41Sopenharmony_ci 5791cb0ef41Sopenharmony_ci /** 5801cb0ef41Sopenharmony_ci * Initialize an Isolate previously allocated by Isolate::Allocate(). 5811cb0ef41Sopenharmony_ci */ 5821cb0ef41Sopenharmony_ci static void Initialize(Isolate* isolate, const CreateParams& params); 5831cb0ef41Sopenharmony_ci 5841cb0ef41Sopenharmony_ci /** 5851cb0ef41Sopenharmony_ci * Creates a new isolate. Does not change the currently entered 5861cb0ef41Sopenharmony_ci * isolate. 5871cb0ef41Sopenharmony_ci * 5881cb0ef41Sopenharmony_ci * When an isolate is no longer used its resources should be freed 5891cb0ef41Sopenharmony_ci * by calling Dispose(). Using the delete operator is not allowed. 5901cb0ef41Sopenharmony_ci * 5911cb0ef41Sopenharmony_ci * V8::Initialize() must have run prior to this. 5921cb0ef41Sopenharmony_ci */ 5931cb0ef41Sopenharmony_ci static Isolate* New(const CreateParams& params); 5941cb0ef41Sopenharmony_ci 5951cb0ef41Sopenharmony_ci /** 5961cb0ef41Sopenharmony_ci * Returns the entered isolate for the current thread or NULL in 5971cb0ef41Sopenharmony_ci * case there is no current isolate. 5981cb0ef41Sopenharmony_ci * 5991cb0ef41Sopenharmony_ci * This method must not be invoked before V8::Initialize() was invoked. 6001cb0ef41Sopenharmony_ci */ 6011cb0ef41Sopenharmony_ci static Isolate* GetCurrent(); 6021cb0ef41Sopenharmony_ci 6031cb0ef41Sopenharmony_ci /** 6041cb0ef41Sopenharmony_ci * Returns the entered isolate for the current thread or NULL in 6051cb0ef41Sopenharmony_ci * case there is no current isolate. 6061cb0ef41Sopenharmony_ci * 6071cb0ef41Sopenharmony_ci * No checks are performed by this method. 6081cb0ef41Sopenharmony_ci */ 6091cb0ef41Sopenharmony_ci static Isolate* TryGetCurrent(); 6101cb0ef41Sopenharmony_ci 6111cb0ef41Sopenharmony_ci /** 6121cb0ef41Sopenharmony_ci * Return true if this isolate is currently active. 6131cb0ef41Sopenharmony_ci **/ 6141cb0ef41Sopenharmony_ci bool IsCurrent() const; 6151cb0ef41Sopenharmony_ci 6161cb0ef41Sopenharmony_ci /** 6171cb0ef41Sopenharmony_ci * Clears the set of objects held strongly by the heap. This set of 6181cb0ef41Sopenharmony_ci * objects are originally built when a WeakRef is created or 6191cb0ef41Sopenharmony_ci * successfully dereferenced. 6201cb0ef41Sopenharmony_ci * 6211cb0ef41Sopenharmony_ci * This is invoked automatically after microtasks are run. See 6221cb0ef41Sopenharmony_ci * MicrotasksPolicy for when microtasks are run. 6231cb0ef41Sopenharmony_ci * 6241cb0ef41Sopenharmony_ci * This needs to be manually invoked only if the embedder is manually running 6251cb0ef41Sopenharmony_ci * microtasks via a custom MicrotaskQueue class's PerformCheckpoint. In that 6261cb0ef41Sopenharmony_ci * case, it is the embedder's responsibility to make this call at a time which 6271cb0ef41Sopenharmony_ci * does not interrupt synchronous ECMAScript code execution. 6281cb0ef41Sopenharmony_ci */ 6291cb0ef41Sopenharmony_ci void ClearKeptObjects(); 6301cb0ef41Sopenharmony_ci 6311cb0ef41Sopenharmony_ci /** 6321cb0ef41Sopenharmony_ci * Custom callback used by embedders to help V8 determine if it should abort 6331cb0ef41Sopenharmony_ci * when it throws and no internal handler is predicted to catch the 6341cb0ef41Sopenharmony_ci * exception. If --abort-on-uncaught-exception is used on the command line, 6351cb0ef41Sopenharmony_ci * then V8 will abort if either: 6361cb0ef41Sopenharmony_ci * - no custom callback is set. 6371cb0ef41Sopenharmony_ci * - the custom callback set returns true. 6381cb0ef41Sopenharmony_ci * Otherwise, the custom callback will not be called and V8 will not abort. 6391cb0ef41Sopenharmony_ci */ 6401cb0ef41Sopenharmony_ci using AbortOnUncaughtExceptionCallback = bool (*)(Isolate*); 6411cb0ef41Sopenharmony_ci void SetAbortOnUncaughtExceptionCallback( 6421cb0ef41Sopenharmony_ci AbortOnUncaughtExceptionCallback callback); 6431cb0ef41Sopenharmony_ci 6441cb0ef41Sopenharmony_ci /** 6451cb0ef41Sopenharmony_ci * This specifies the callback called by the upcoming dynamic 6461cb0ef41Sopenharmony_ci * import() language feature to load modules. 6471cb0ef41Sopenharmony_ci */ 6481cb0ef41Sopenharmony_ci void SetHostImportModuleDynamicallyCallback( 6491cb0ef41Sopenharmony_ci HostImportModuleDynamicallyCallback callback); 6501cb0ef41Sopenharmony_ci 6511cb0ef41Sopenharmony_ci /** 6521cb0ef41Sopenharmony_ci * This specifies the callback called by the upcoming import.meta 6531cb0ef41Sopenharmony_ci * language feature to retrieve host-defined meta data for a module. 6541cb0ef41Sopenharmony_ci */ 6551cb0ef41Sopenharmony_ci void SetHostInitializeImportMetaObjectCallback( 6561cb0ef41Sopenharmony_ci HostInitializeImportMetaObjectCallback callback); 6571cb0ef41Sopenharmony_ci 6581cb0ef41Sopenharmony_ci /** 6591cb0ef41Sopenharmony_ci * This specifies the callback called by the upcoming ShadowRealm 6601cb0ef41Sopenharmony_ci * construction language feature to retrieve host created globals. 6611cb0ef41Sopenharmony_ci */ 6621cb0ef41Sopenharmony_ci void SetHostCreateShadowRealmContextCallback( 6631cb0ef41Sopenharmony_ci HostCreateShadowRealmContextCallback callback); 6641cb0ef41Sopenharmony_ci 6651cb0ef41Sopenharmony_ci /** 6661cb0ef41Sopenharmony_ci * This specifies the callback called when the stack property of Error 6671cb0ef41Sopenharmony_ci * is accessed. 6681cb0ef41Sopenharmony_ci */ 6691cb0ef41Sopenharmony_ci void SetPrepareStackTraceCallback(PrepareStackTraceCallback callback); 6701cb0ef41Sopenharmony_ci 6711cb0ef41Sopenharmony_ci /** 6721cb0ef41Sopenharmony_ci * Optional notification that the system is running low on memory. 6731cb0ef41Sopenharmony_ci * V8 uses these notifications to guide heuristics. 6741cb0ef41Sopenharmony_ci * It is allowed to call this function from another thread while 6751cb0ef41Sopenharmony_ci * the isolate is executing long running JavaScript code. 6761cb0ef41Sopenharmony_ci */ 6771cb0ef41Sopenharmony_ci void MemoryPressureNotification(MemoryPressureLevel level); 6781cb0ef41Sopenharmony_ci 6791cb0ef41Sopenharmony_ci /** 6801cb0ef41Sopenharmony_ci * Drop non-essential caches. Should only be called from testing code. 6811cb0ef41Sopenharmony_ci * The method can potentially block for a long time and does not necessarily 6821cb0ef41Sopenharmony_ci * trigger GC. 6831cb0ef41Sopenharmony_ci */ 6841cb0ef41Sopenharmony_ci void ClearCachesForTesting(); 6851cb0ef41Sopenharmony_ci 6861cb0ef41Sopenharmony_ci /** 6871cb0ef41Sopenharmony_ci * Methods below this point require holding a lock (using Locker) in 6881cb0ef41Sopenharmony_ci * a multi-threaded environment. 6891cb0ef41Sopenharmony_ci */ 6901cb0ef41Sopenharmony_ci 6911cb0ef41Sopenharmony_ci /** 6921cb0ef41Sopenharmony_ci * Sets this isolate as the entered one for the current thread. 6931cb0ef41Sopenharmony_ci * Saves the previously entered one (if any), so that it can be 6941cb0ef41Sopenharmony_ci * restored when exiting. Re-entering an isolate is allowed. 6951cb0ef41Sopenharmony_ci */ 6961cb0ef41Sopenharmony_ci void Enter(); 6971cb0ef41Sopenharmony_ci 6981cb0ef41Sopenharmony_ci /** 6991cb0ef41Sopenharmony_ci * Exits this isolate by restoring the previously entered one in the 7001cb0ef41Sopenharmony_ci * current thread. The isolate may still stay the same, if it was 7011cb0ef41Sopenharmony_ci * entered more than once. 7021cb0ef41Sopenharmony_ci * 7031cb0ef41Sopenharmony_ci * Requires: this == Isolate::GetCurrent(). 7041cb0ef41Sopenharmony_ci */ 7051cb0ef41Sopenharmony_ci void Exit(); 7061cb0ef41Sopenharmony_ci 7071cb0ef41Sopenharmony_ci /** 7081cb0ef41Sopenharmony_ci * Disposes the isolate. The isolate must not be entered by any 7091cb0ef41Sopenharmony_ci * thread to be disposable. 7101cb0ef41Sopenharmony_ci */ 7111cb0ef41Sopenharmony_ci void Dispose(); 7121cb0ef41Sopenharmony_ci 7131cb0ef41Sopenharmony_ci /** 7141cb0ef41Sopenharmony_ci * Dumps activated low-level V8 internal stats. This can be used instead 7151cb0ef41Sopenharmony_ci * of performing a full isolate disposal. 7161cb0ef41Sopenharmony_ci */ 7171cb0ef41Sopenharmony_ci void DumpAndResetStats(); 7181cb0ef41Sopenharmony_ci 7191cb0ef41Sopenharmony_ci /** 7201cb0ef41Sopenharmony_ci * Discards all V8 thread-specific data for the Isolate. Should be used 7211cb0ef41Sopenharmony_ci * if a thread is terminating and it has used an Isolate that will outlive 7221cb0ef41Sopenharmony_ci * the thread -- all thread-specific data for an Isolate is discarded when 7231cb0ef41Sopenharmony_ci * an Isolate is disposed so this call is pointless if an Isolate is about 7241cb0ef41Sopenharmony_ci * to be Disposed. 7251cb0ef41Sopenharmony_ci */ 7261cb0ef41Sopenharmony_ci void DiscardThreadSpecificMetadata(); 7271cb0ef41Sopenharmony_ci 7281cb0ef41Sopenharmony_ci /** 7291cb0ef41Sopenharmony_ci * Associate embedder-specific data with the isolate. |slot| has to be 7301cb0ef41Sopenharmony_ci * between 0 and GetNumberOfDataSlots() - 1. 7311cb0ef41Sopenharmony_ci */ 7321cb0ef41Sopenharmony_ci V8_INLINE void SetData(uint32_t slot, void* data); 7331cb0ef41Sopenharmony_ci 7341cb0ef41Sopenharmony_ci /** 7351cb0ef41Sopenharmony_ci * Retrieve embedder-specific data from the isolate. 7361cb0ef41Sopenharmony_ci * Returns NULL if SetData has never been called for the given |slot|. 7371cb0ef41Sopenharmony_ci */ 7381cb0ef41Sopenharmony_ci V8_INLINE void* GetData(uint32_t slot); 7391cb0ef41Sopenharmony_ci 7401cb0ef41Sopenharmony_ci /** 7411cb0ef41Sopenharmony_ci * Returns the maximum number of available embedder data slots. Valid slots 7421cb0ef41Sopenharmony_ci * are in the range of 0 - GetNumberOfDataSlots() - 1. 7431cb0ef41Sopenharmony_ci */ 7441cb0ef41Sopenharmony_ci V8_INLINE static uint32_t GetNumberOfDataSlots(); 7451cb0ef41Sopenharmony_ci 7461cb0ef41Sopenharmony_ci /** 7471cb0ef41Sopenharmony_ci * Return data that was previously attached to the isolate snapshot via 7481cb0ef41Sopenharmony_ci * SnapshotCreator, and removes the reference to it. 7491cb0ef41Sopenharmony_ci * Repeated call with the same index returns an empty MaybeLocal. 7501cb0ef41Sopenharmony_ci */ 7511cb0ef41Sopenharmony_ci template <class T> 7521cb0ef41Sopenharmony_ci V8_INLINE MaybeLocal<T> GetDataFromSnapshotOnce(size_t index); 7531cb0ef41Sopenharmony_ci 7541cb0ef41Sopenharmony_ci /** 7551cb0ef41Sopenharmony_ci * Get statistics about the heap memory usage. 7561cb0ef41Sopenharmony_ci */ 7571cb0ef41Sopenharmony_ci void GetHeapStatistics(HeapStatistics* heap_statistics); 7581cb0ef41Sopenharmony_ci 7591cb0ef41Sopenharmony_ci /** 7601cb0ef41Sopenharmony_ci * Returns the number of spaces in the heap. 7611cb0ef41Sopenharmony_ci */ 7621cb0ef41Sopenharmony_ci size_t NumberOfHeapSpaces(); 7631cb0ef41Sopenharmony_ci 7641cb0ef41Sopenharmony_ci /** 7651cb0ef41Sopenharmony_ci * Get the memory usage of a space in the heap. 7661cb0ef41Sopenharmony_ci * 7671cb0ef41Sopenharmony_ci * \param space_statistics The HeapSpaceStatistics object to fill in 7681cb0ef41Sopenharmony_ci * statistics. 7691cb0ef41Sopenharmony_ci * \param index The index of the space to get statistics from, which ranges 7701cb0ef41Sopenharmony_ci * from 0 to NumberOfHeapSpaces() - 1. 7711cb0ef41Sopenharmony_ci * \returns true on success. 7721cb0ef41Sopenharmony_ci */ 7731cb0ef41Sopenharmony_ci bool GetHeapSpaceStatistics(HeapSpaceStatistics* space_statistics, 7741cb0ef41Sopenharmony_ci size_t index); 7751cb0ef41Sopenharmony_ci 7761cb0ef41Sopenharmony_ci /** 7771cb0ef41Sopenharmony_ci * Returns the number of types of objects tracked in the heap at GC. 7781cb0ef41Sopenharmony_ci */ 7791cb0ef41Sopenharmony_ci size_t NumberOfTrackedHeapObjectTypes(); 7801cb0ef41Sopenharmony_ci 7811cb0ef41Sopenharmony_ci /** 7821cb0ef41Sopenharmony_ci * Get statistics about objects in the heap. 7831cb0ef41Sopenharmony_ci * 7841cb0ef41Sopenharmony_ci * \param object_statistics The HeapObjectStatistics object to fill in 7851cb0ef41Sopenharmony_ci * statistics of objects of given type, which were live in the previous GC. 7861cb0ef41Sopenharmony_ci * \param type_index The index of the type of object to fill details about, 7871cb0ef41Sopenharmony_ci * which ranges from 0 to NumberOfTrackedHeapObjectTypes() - 1. 7881cb0ef41Sopenharmony_ci * \returns true on success. 7891cb0ef41Sopenharmony_ci */ 7901cb0ef41Sopenharmony_ci bool GetHeapObjectStatisticsAtLastGC(HeapObjectStatistics* object_statistics, 7911cb0ef41Sopenharmony_ci size_t type_index); 7921cb0ef41Sopenharmony_ci 7931cb0ef41Sopenharmony_ci /** 7941cb0ef41Sopenharmony_ci * Get statistics about code and its metadata in the heap. 7951cb0ef41Sopenharmony_ci * 7961cb0ef41Sopenharmony_ci * \param object_statistics The HeapCodeStatistics object to fill in 7971cb0ef41Sopenharmony_ci * statistics of code, bytecode and their metadata. 7981cb0ef41Sopenharmony_ci * \returns true on success. 7991cb0ef41Sopenharmony_ci */ 8001cb0ef41Sopenharmony_ci bool GetHeapCodeAndMetadataStatistics(HeapCodeStatistics* object_statistics); 8011cb0ef41Sopenharmony_ci 8021cb0ef41Sopenharmony_ci /** 8031cb0ef41Sopenharmony_ci * This API is experimental and may change significantly. 8041cb0ef41Sopenharmony_ci * 8051cb0ef41Sopenharmony_ci * Enqueues a memory measurement request and invokes the delegate with the 8061cb0ef41Sopenharmony_ci * results. 8071cb0ef41Sopenharmony_ci * 8081cb0ef41Sopenharmony_ci * \param delegate the delegate that defines which contexts to measure and 8091cb0ef41Sopenharmony_ci * reports the results. 8101cb0ef41Sopenharmony_ci * 8111cb0ef41Sopenharmony_ci * \param execution promptness executing the memory measurement. 8121cb0ef41Sopenharmony_ci * The kEager value is expected to be used only in tests. 8131cb0ef41Sopenharmony_ci */ 8141cb0ef41Sopenharmony_ci bool MeasureMemory( 8151cb0ef41Sopenharmony_ci std::unique_ptr<MeasureMemoryDelegate> delegate, 8161cb0ef41Sopenharmony_ci MeasureMemoryExecution execution = MeasureMemoryExecution::kDefault); 8171cb0ef41Sopenharmony_ci 8181cb0ef41Sopenharmony_ci /** 8191cb0ef41Sopenharmony_ci * Get a call stack sample from the isolate. 8201cb0ef41Sopenharmony_ci * \param state Execution state. 8211cb0ef41Sopenharmony_ci * \param frames Caller allocated buffer to store stack frames. 8221cb0ef41Sopenharmony_ci * \param frames_limit Maximum number of frames to capture. The buffer must 8231cb0ef41Sopenharmony_ci * be large enough to hold the number of frames. 8241cb0ef41Sopenharmony_ci * \param sample_info The sample info is filled up by the function 8251cb0ef41Sopenharmony_ci * provides number of actual captured stack frames and 8261cb0ef41Sopenharmony_ci * the current VM state. 8271cb0ef41Sopenharmony_ci * \note GetStackSample should only be called when the JS thread is paused or 8281cb0ef41Sopenharmony_ci * interrupted. Otherwise the behavior is undefined. 8291cb0ef41Sopenharmony_ci */ 8301cb0ef41Sopenharmony_ci void GetStackSample(const RegisterState& state, void** frames, 8311cb0ef41Sopenharmony_ci size_t frames_limit, SampleInfo* sample_info); 8321cb0ef41Sopenharmony_ci 8331cb0ef41Sopenharmony_ci /** 8341cb0ef41Sopenharmony_ci * Adjusts the amount of registered external memory. Used to give V8 an 8351cb0ef41Sopenharmony_ci * indication of the amount of externally allocated memory that is kept alive 8361cb0ef41Sopenharmony_ci * by JavaScript objects. V8 uses this to decide when to perform global 8371cb0ef41Sopenharmony_ci * garbage collections. Registering externally allocated memory will trigger 8381cb0ef41Sopenharmony_ci * global garbage collections more often than it would otherwise in an attempt 8391cb0ef41Sopenharmony_ci * to garbage collect the JavaScript objects that keep the externally 8401cb0ef41Sopenharmony_ci * allocated memory alive. 8411cb0ef41Sopenharmony_ci * 8421cb0ef41Sopenharmony_ci * \param change_in_bytes the change in externally allocated memory that is 8431cb0ef41Sopenharmony_ci * kept alive by JavaScript objects. 8441cb0ef41Sopenharmony_ci * \returns the adjusted value. 8451cb0ef41Sopenharmony_ci */ 8461cb0ef41Sopenharmony_ci int64_t AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes); 8471cb0ef41Sopenharmony_ci 8481cb0ef41Sopenharmony_ci /** 8491cb0ef41Sopenharmony_ci * Returns heap profiler for this isolate. Will return NULL until the isolate 8501cb0ef41Sopenharmony_ci * is initialized. 8511cb0ef41Sopenharmony_ci */ 8521cb0ef41Sopenharmony_ci HeapProfiler* GetHeapProfiler(); 8531cb0ef41Sopenharmony_ci 8541cb0ef41Sopenharmony_ci /** 8551cb0ef41Sopenharmony_ci * Tells the VM whether the embedder is idle or not. 8561cb0ef41Sopenharmony_ci */ 8571cb0ef41Sopenharmony_ci void SetIdle(bool is_idle); 8581cb0ef41Sopenharmony_ci 8591cb0ef41Sopenharmony_ci /** Returns the ArrayBuffer::Allocator used in this isolate. */ 8601cb0ef41Sopenharmony_ci ArrayBuffer::Allocator* GetArrayBufferAllocator(); 8611cb0ef41Sopenharmony_ci 8621cb0ef41Sopenharmony_ci /** Returns true if this isolate has a current context. */ 8631cb0ef41Sopenharmony_ci bool InContext(); 8641cb0ef41Sopenharmony_ci 8651cb0ef41Sopenharmony_ci /** 8661cb0ef41Sopenharmony_ci * Returns the context of the currently running JavaScript, or the context 8671cb0ef41Sopenharmony_ci * on the top of the stack if no JavaScript is running. 8681cb0ef41Sopenharmony_ci */ 8691cb0ef41Sopenharmony_ci Local<Context> GetCurrentContext(); 8701cb0ef41Sopenharmony_ci 8711cb0ef41Sopenharmony_ci /** 8721cb0ef41Sopenharmony_ci * Returns either the last context entered through V8's C++ API, or the 8731cb0ef41Sopenharmony_ci * context of the currently running microtask while processing microtasks. 8741cb0ef41Sopenharmony_ci * If a context is entered while executing a microtask, that context is 8751cb0ef41Sopenharmony_ci * returned. 8761cb0ef41Sopenharmony_ci */ 8771cb0ef41Sopenharmony_ci Local<Context> GetEnteredOrMicrotaskContext(); 8781cb0ef41Sopenharmony_ci 8791cb0ef41Sopenharmony_ci /** 8801cb0ef41Sopenharmony_ci * Returns the Context that corresponds to the Incumbent realm in HTML spec. 8811cb0ef41Sopenharmony_ci * https://html.spec.whatwg.org/multipage/webappapis.html#incumbent 8821cb0ef41Sopenharmony_ci */ 8831cb0ef41Sopenharmony_ci Local<Context> GetIncumbentContext(); 8841cb0ef41Sopenharmony_ci 8851cb0ef41Sopenharmony_ci /** 8861cb0ef41Sopenharmony_ci * Schedules a v8::Exception::Error with the given message. 8871cb0ef41Sopenharmony_ci * See ThrowException for more details. Templatized to provide compile-time 8881cb0ef41Sopenharmony_ci * errors in case of too long strings (see v8::String::NewFromUtf8Literal). 8891cb0ef41Sopenharmony_ci */ 8901cb0ef41Sopenharmony_ci template <int N> 8911cb0ef41Sopenharmony_ci Local<Value> ThrowError(const char (&message)[N]) { 8921cb0ef41Sopenharmony_ci return ThrowError(String::NewFromUtf8Literal(this, message)); 8931cb0ef41Sopenharmony_ci } 8941cb0ef41Sopenharmony_ci Local<Value> ThrowError(Local<String> message); 8951cb0ef41Sopenharmony_ci 8961cb0ef41Sopenharmony_ci /** 8971cb0ef41Sopenharmony_ci * Schedules an exception to be thrown when returning to JavaScript. When an 8981cb0ef41Sopenharmony_ci * exception has been scheduled it is illegal to invoke any JavaScript 8991cb0ef41Sopenharmony_ci * operation; the caller must return immediately and only after the exception 9001cb0ef41Sopenharmony_ci * has been handled does it become legal to invoke JavaScript operations. 9011cb0ef41Sopenharmony_ci */ 9021cb0ef41Sopenharmony_ci Local<Value> ThrowException(Local<Value> exception); 9031cb0ef41Sopenharmony_ci 9041cb0ef41Sopenharmony_ci using GCCallback = void (*)(Isolate* isolate, GCType type, 9051cb0ef41Sopenharmony_ci GCCallbackFlags flags); 9061cb0ef41Sopenharmony_ci using GCCallbackWithData = void (*)(Isolate* isolate, GCType type, 9071cb0ef41Sopenharmony_ci GCCallbackFlags flags, void* data); 9081cb0ef41Sopenharmony_ci 9091cb0ef41Sopenharmony_ci /** 9101cb0ef41Sopenharmony_ci * Enables the host application to receive a notification before a 9111cb0ef41Sopenharmony_ci * garbage collection. Allocations are allowed in the callback function, 9121cb0ef41Sopenharmony_ci * but the callback is not re-entrant: if the allocation inside it will 9131cb0ef41Sopenharmony_ci * trigger the garbage collection, the callback won't be called again. 9141cb0ef41Sopenharmony_ci * It is possible to specify the GCType filter for your callback. But it is 9151cb0ef41Sopenharmony_ci * not possible to register the same callback function two times with 9161cb0ef41Sopenharmony_ci * different GCType filters. 9171cb0ef41Sopenharmony_ci */ 9181cb0ef41Sopenharmony_ci void AddGCPrologueCallback(GCCallbackWithData callback, void* data = nullptr, 9191cb0ef41Sopenharmony_ci GCType gc_type_filter = kGCTypeAll); 9201cb0ef41Sopenharmony_ci void AddGCPrologueCallback(GCCallback callback, 9211cb0ef41Sopenharmony_ci GCType gc_type_filter = kGCTypeAll); 9221cb0ef41Sopenharmony_ci 9231cb0ef41Sopenharmony_ci /** 9241cb0ef41Sopenharmony_ci * This function removes callback which was installed by 9251cb0ef41Sopenharmony_ci * AddGCPrologueCallback function. 9261cb0ef41Sopenharmony_ci */ 9271cb0ef41Sopenharmony_ci void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr); 9281cb0ef41Sopenharmony_ci void RemoveGCPrologueCallback(GCCallback callback); 9291cb0ef41Sopenharmony_ci 9301cb0ef41Sopenharmony_ci /** 9311cb0ef41Sopenharmony_ci * Sets an embedder roots handle that V8 should consider when performing 9321cb0ef41Sopenharmony_ci * non-unified heap garbage collections. The intended use case is for setting 9331cb0ef41Sopenharmony_ci * a custom handler after invoking `AttachCppHeap()`. 9341cb0ef41Sopenharmony_ci * 9351cb0ef41Sopenharmony_ci * V8 does not take ownership of the handler. 9361cb0ef41Sopenharmony_ci */ 9371cb0ef41Sopenharmony_ci void SetEmbedderRootsHandler(EmbedderRootsHandler* handler); 9381cb0ef41Sopenharmony_ci 9391cb0ef41Sopenharmony_ci /** 9401cb0ef41Sopenharmony_ci * Attaches a managed C++ heap as an extension to the JavaScript heap. The 9411cb0ef41Sopenharmony_ci * embedder maintains ownership of the CppHeap. At most one C++ heap can be 9421cb0ef41Sopenharmony_ci * attached to V8. 9431cb0ef41Sopenharmony_ci * 9441cb0ef41Sopenharmony_ci * Multi-threaded use requires the use of v8::Locker/v8::Unlocker, see 9451cb0ef41Sopenharmony_ci * CppHeap. 9461cb0ef41Sopenharmony_ci */ 9471cb0ef41Sopenharmony_ci void AttachCppHeap(CppHeap*); 9481cb0ef41Sopenharmony_ci 9491cb0ef41Sopenharmony_ci /** 9501cb0ef41Sopenharmony_ci * Detaches a managed C++ heap if one was attached using `AttachCppHeap()`. 9511cb0ef41Sopenharmony_ci */ 9521cb0ef41Sopenharmony_ci void DetachCppHeap(); 9531cb0ef41Sopenharmony_ci 9541cb0ef41Sopenharmony_ci /** 9551cb0ef41Sopenharmony_ci * \returns the C++ heap managed by V8. Only available if such a heap has been 9561cb0ef41Sopenharmony_ci * attached using `AttachCppHeap()`. 9571cb0ef41Sopenharmony_ci */ 9581cb0ef41Sopenharmony_ci CppHeap* GetCppHeap() const; 9591cb0ef41Sopenharmony_ci 9601cb0ef41Sopenharmony_ci /** 9611cb0ef41Sopenharmony_ci * Use for |AtomicsWaitCallback| to indicate the type of event it receives. 9621cb0ef41Sopenharmony_ci */ 9631cb0ef41Sopenharmony_ci enum class AtomicsWaitEvent { 9641cb0ef41Sopenharmony_ci /** Indicates that this call is happening before waiting. */ 9651cb0ef41Sopenharmony_ci kStartWait, 9661cb0ef41Sopenharmony_ci /** `Atomics.wait()` finished because of an `Atomics.wake()` call. */ 9671cb0ef41Sopenharmony_ci kWokenUp, 9681cb0ef41Sopenharmony_ci /** `Atomics.wait()` finished because it timed out. */ 9691cb0ef41Sopenharmony_ci kTimedOut, 9701cb0ef41Sopenharmony_ci /** `Atomics.wait()` was interrupted through |TerminateExecution()|. */ 9711cb0ef41Sopenharmony_ci kTerminatedExecution, 9721cb0ef41Sopenharmony_ci /** `Atomics.wait()` was stopped through |AtomicsWaitWakeHandle|. */ 9731cb0ef41Sopenharmony_ci kAPIStopped, 9741cb0ef41Sopenharmony_ci /** `Atomics.wait()` did not wait, as the initial condition was not met. */ 9751cb0ef41Sopenharmony_ci kNotEqual 9761cb0ef41Sopenharmony_ci }; 9771cb0ef41Sopenharmony_ci 9781cb0ef41Sopenharmony_ci /** 9791cb0ef41Sopenharmony_ci * Passed to |AtomicsWaitCallback| as a means of stopping an ongoing 9801cb0ef41Sopenharmony_ci * `Atomics.wait` call. 9811cb0ef41Sopenharmony_ci */ 9821cb0ef41Sopenharmony_ci class V8_EXPORT AtomicsWaitWakeHandle { 9831cb0ef41Sopenharmony_ci public: 9841cb0ef41Sopenharmony_ci /** 9851cb0ef41Sopenharmony_ci * Stop this `Atomics.wait()` call and call the |AtomicsWaitCallback| 9861cb0ef41Sopenharmony_ci * with |kAPIStopped|. 9871cb0ef41Sopenharmony_ci * 9881cb0ef41Sopenharmony_ci * This function may be called from another thread. The caller has to ensure 9891cb0ef41Sopenharmony_ci * through proper synchronization that it is not called after 9901cb0ef41Sopenharmony_ci * the finishing |AtomicsWaitCallback|. 9911cb0ef41Sopenharmony_ci * 9921cb0ef41Sopenharmony_ci * Note that the ECMAScript specification does not plan for the possibility 9931cb0ef41Sopenharmony_ci * of wakeups that are neither coming from a timeout or an `Atomics.wake()` 9941cb0ef41Sopenharmony_ci * call, so this may invalidate assumptions made by existing code. 9951cb0ef41Sopenharmony_ci * The embedder may accordingly wish to schedule an exception in the 9961cb0ef41Sopenharmony_ci * finishing |AtomicsWaitCallback|. 9971cb0ef41Sopenharmony_ci */ 9981cb0ef41Sopenharmony_ci void Wake(); 9991cb0ef41Sopenharmony_ci }; 10001cb0ef41Sopenharmony_ci 10011cb0ef41Sopenharmony_ci /** 10021cb0ef41Sopenharmony_ci * Embedder callback for `Atomics.wait()` that can be added through 10031cb0ef41Sopenharmony_ci * |SetAtomicsWaitCallback|. 10041cb0ef41Sopenharmony_ci * 10051cb0ef41Sopenharmony_ci * This will be called just before starting to wait with the |event| value 10061cb0ef41Sopenharmony_ci * |kStartWait| and after finishing waiting with one of the other 10071cb0ef41Sopenharmony_ci * values of |AtomicsWaitEvent| inside of an `Atomics.wait()` call. 10081cb0ef41Sopenharmony_ci * 10091cb0ef41Sopenharmony_ci * |array_buffer| will refer to the underlying SharedArrayBuffer, 10101cb0ef41Sopenharmony_ci * |offset_in_bytes| to the location of the waited-on memory address inside 10111cb0ef41Sopenharmony_ci * the SharedArrayBuffer. 10121cb0ef41Sopenharmony_ci * 10131cb0ef41Sopenharmony_ci * |value| and |timeout_in_ms| will be the values passed to 10141cb0ef41Sopenharmony_ci * the `Atomics.wait()` call. If no timeout was used, |timeout_in_ms| 10151cb0ef41Sopenharmony_ci * will be `INFINITY`. 10161cb0ef41Sopenharmony_ci * 10171cb0ef41Sopenharmony_ci * In the |kStartWait| callback, |stop_handle| will be an object that 10181cb0ef41Sopenharmony_ci * is only valid until the corresponding finishing callback and that 10191cb0ef41Sopenharmony_ci * can be used to stop the wait process while it is happening. 10201cb0ef41Sopenharmony_ci * 10211cb0ef41Sopenharmony_ci * This callback may schedule exceptions, *unless* |event| is equal to 10221cb0ef41Sopenharmony_ci * |kTerminatedExecution|. 10231cb0ef41Sopenharmony_ci */ 10241cb0ef41Sopenharmony_ci using AtomicsWaitCallback = void (*)(AtomicsWaitEvent event, 10251cb0ef41Sopenharmony_ci Local<SharedArrayBuffer> array_buffer, 10261cb0ef41Sopenharmony_ci size_t offset_in_bytes, int64_t value, 10271cb0ef41Sopenharmony_ci double timeout_in_ms, 10281cb0ef41Sopenharmony_ci AtomicsWaitWakeHandle* stop_handle, 10291cb0ef41Sopenharmony_ci void* data); 10301cb0ef41Sopenharmony_ci 10311cb0ef41Sopenharmony_ci /** 10321cb0ef41Sopenharmony_ci * Set a new |AtomicsWaitCallback|. This overrides an earlier 10331cb0ef41Sopenharmony_ci * |AtomicsWaitCallback|, if there was any. If |callback| is nullptr, 10341cb0ef41Sopenharmony_ci * this unsets the callback. |data| will be passed to the callback 10351cb0ef41Sopenharmony_ci * as its last parameter. 10361cb0ef41Sopenharmony_ci */ 10371cb0ef41Sopenharmony_ci void SetAtomicsWaitCallback(AtomicsWaitCallback callback, void* data); 10381cb0ef41Sopenharmony_ci 10391cb0ef41Sopenharmony_ci /** 10401cb0ef41Sopenharmony_ci * Enables the host application to receive a notification after a 10411cb0ef41Sopenharmony_ci * garbage collection. Allocations are allowed in the callback function, 10421cb0ef41Sopenharmony_ci * but the callback is not re-entrant: if the allocation inside it will 10431cb0ef41Sopenharmony_ci * trigger the garbage collection, the callback won't be called again. 10441cb0ef41Sopenharmony_ci * It is possible to specify the GCType filter for your callback. But it is 10451cb0ef41Sopenharmony_ci * not possible to register the same callback function two times with 10461cb0ef41Sopenharmony_ci * different GCType filters. 10471cb0ef41Sopenharmony_ci */ 10481cb0ef41Sopenharmony_ci void AddGCEpilogueCallback(GCCallbackWithData callback, void* data = nullptr, 10491cb0ef41Sopenharmony_ci GCType gc_type_filter = kGCTypeAll); 10501cb0ef41Sopenharmony_ci void AddGCEpilogueCallback(GCCallback callback, 10511cb0ef41Sopenharmony_ci GCType gc_type_filter = kGCTypeAll); 10521cb0ef41Sopenharmony_ci 10531cb0ef41Sopenharmony_ci /** 10541cb0ef41Sopenharmony_ci * This function removes callback which was installed by 10551cb0ef41Sopenharmony_ci * AddGCEpilogueCallback function. 10561cb0ef41Sopenharmony_ci */ 10571cb0ef41Sopenharmony_ci void RemoveGCEpilogueCallback(GCCallbackWithData callback, 10581cb0ef41Sopenharmony_ci void* data = nullptr); 10591cb0ef41Sopenharmony_ci void RemoveGCEpilogueCallback(GCCallback callback); 10601cb0ef41Sopenharmony_ci 10611cb0ef41Sopenharmony_ci using GetExternallyAllocatedMemoryInBytesCallback = size_t (*)(); 10621cb0ef41Sopenharmony_ci 10631cb0ef41Sopenharmony_ci /** 10641cb0ef41Sopenharmony_ci * Set the callback that tells V8 how much memory is currently allocated 10651cb0ef41Sopenharmony_ci * externally of the V8 heap. Ideally this memory is somehow connected to V8 10661cb0ef41Sopenharmony_ci * objects and may get freed-up when the corresponding V8 objects get 10671cb0ef41Sopenharmony_ci * collected by a V8 garbage collection. 10681cb0ef41Sopenharmony_ci */ 10691cb0ef41Sopenharmony_ci void SetGetExternallyAllocatedMemoryInBytesCallback( 10701cb0ef41Sopenharmony_ci GetExternallyAllocatedMemoryInBytesCallback callback); 10711cb0ef41Sopenharmony_ci 10721cb0ef41Sopenharmony_ci /** 10731cb0ef41Sopenharmony_ci * Forcefully terminate the current thread of JavaScript execution 10741cb0ef41Sopenharmony_ci * in the given isolate. 10751cb0ef41Sopenharmony_ci * 10761cb0ef41Sopenharmony_ci * This method can be used by any thread even if that thread has not 10771cb0ef41Sopenharmony_ci * acquired the V8 lock with a Locker object. 10781cb0ef41Sopenharmony_ci */ 10791cb0ef41Sopenharmony_ci void TerminateExecution(); 10801cb0ef41Sopenharmony_ci 10811cb0ef41Sopenharmony_ci /** 10821cb0ef41Sopenharmony_ci * Is V8 terminating JavaScript execution. 10831cb0ef41Sopenharmony_ci * 10841cb0ef41Sopenharmony_ci * Returns true if JavaScript execution is currently terminating 10851cb0ef41Sopenharmony_ci * because of a call to TerminateExecution. In that case there are 10861cb0ef41Sopenharmony_ci * still JavaScript frames on the stack and the termination 10871cb0ef41Sopenharmony_ci * exception is still active. 10881cb0ef41Sopenharmony_ci */ 10891cb0ef41Sopenharmony_ci bool IsExecutionTerminating(); 10901cb0ef41Sopenharmony_ci 10911cb0ef41Sopenharmony_ci /** 10921cb0ef41Sopenharmony_ci * Resume execution capability in the given isolate, whose execution 10931cb0ef41Sopenharmony_ci * was previously forcefully terminated using TerminateExecution(). 10941cb0ef41Sopenharmony_ci * 10951cb0ef41Sopenharmony_ci * When execution is forcefully terminated using TerminateExecution(), 10961cb0ef41Sopenharmony_ci * the isolate can not resume execution until all JavaScript frames 10971cb0ef41Sopenharmony_ci * have propagated the uncatchable exception which is generated. This 10981cb0ef41Sopenharmony_ci * method allows the program embedding the engine to handle the 10991cb0ef41Sopenharmony_ci * termination event and resume execution capability, even if 11001cb0ef41Sopenharmony_ci * JavaScript frames remain on the stack. 11011cb0ef41Sopenharmony_ci * 11021cb0ef41Sopenharmony_ci * This method can be used by any thread even if that thread has not 11031cb0ef41Sopenharmony_ci * acquired the V8 lock with a Locker object. 11041cb0ef41Sopenharmony_ci */ 11051cb0ef41Sopenharmony_ci void CancelTerminateExecution(); 11061cb0ef41Sopenharmony_ci 11071cb0ef41Sopenharmony_ci /** 11081cb0ef41Sopenharmony_ci * Request V8 to interrupt long running JavaScript code and invoke 11091cb0ef41Sopenharmony_ci * the given |callback| passing the given |data| to it. After |callback| 11101cb0ef41Sopenharmony_ci * returns control will be returned to the JavaScript code. 11111cb0ef41Sopenharmony_ci * There may be a number of interrupt requests in flight. 11121cb0ef41Sopenharmony_ci * Can be called from another thread without acquiring a |Locker|. 11131cb0ef41Sopenharmony_ci * Registered |callback| must not reenter interrupted Isolate. 11141cb0ef41Sopenharmony_ci */ 11151cb0ef41Sopenharmony_ci void RequestInterrupt(InterruptCallback callback, void* data); 11161cb0ef41Sopenharmony_ci 11171cb0ef41Sopenharmony_ci /** 11181cb0ef41Sopenharmony_ci * Returns true if there is ongoing background work within V8 that will 11191cb0ef41Sopenharmony_ci * eventually post a foreground task, like asynchronous WebAssembly 11201cb0ef41Sopenharmony_ci * compilation. 11211cb0ef41Sopenharmony_ci */ 11221cb0ef41Sopenharmony_ci bool HasPendingBackgroundTasks(); 11231cb0ef41Sopenharmony_ci 11241cb0ef41Sopenharmony_ci /** 11251cb0ef41Sopenharmony_ci * Request garbage collection in this Isolate. It is only valid to call this 11261cb0ef41Sopenharmony_ci * function if --expose_gc was specified. 11271cb0ef41Sopenharmony_ci * 11281cb0ef41Sopenharmony_ci * This should only be used for testing purposes and not to enforce a garbage 11291cb0ef41Sopenharmony_ci * collection schedule. It has strong negative impact on the garbage 11301cb0ef41Sopenharmony_ci * collection performance. Use MemoryPressureNotification() instead to 11311cb0ef41Sopenharmony_ci * influence the garbage collection schedule. 11321cb0ef41Sopenharmony_ci */ 11331cb0ef41Sopenharmony_ci void RequestGarbageCollectionForTesting(GarbageCollectionType type); 11341cb0ef41Sopenharmony_ci 11351cb0ef41Sopenharmony_ci /** 11361cb0ef41Sopenharmony_ci * Request garbage collection with a specific embedderstack state in this 11371cb0ef41Sopenharmony_ci * Isolate. It is only valid to call this function if --expose_gc was 11381cb0ef41Sopenharmony_ci * specified. 11391cb0ef41Sopenharmony_ci * 11401cb0ef41Sopenharmony_ci * This should only be used for testing purposes and not to enforce a garbage 11411cb0ef41Sopenharmony_ci * collection schedule. It has strong negative impact on the garbage 11421cb0ef41Sopenharmony_ci * collection performance. Use MemoryPressureNotification() instead to 11431cb0ef41Sopenharmony_ci * influence the garbage collection schedule. 11441cb0ef41Sopenharmony_ci */ 11451cb0ef41Sopenharmony_ci void RequestGarbageCollectionForTesting(GarbageCollectionType type, 11461cb0ef41Sopenharmony_ci StackState stack_state); 11471cb0ef41Sopenharmony_ci 11481cb0ef41Sopenharmony_ci /** 11491cb0ef41Sopenharmony_ci * Set the callback to invoke for logging event. 11501cb0ef41Sopenharmony_ci */ 11511cb0ef41Sopenharmony_ci void SetEventLogger(LogEventCallback that); 11521cb0ef41Sopenharmony_ci 11531cb0ef41Sopenharmony_ci /** 11541cb0ef41Sopenharmony_ci * Adds a callback to notify the host application right before a script 11551cb0ef41Sopenharmony_ci * is about to run. If a script re-enters the runtime during executing, the 11561cb0ef41Sopenharmony_ci * BeforeCallEnteredCallback is invoked for each re-entrance. 11571cb0ef41Sopenharmony_ci * Executing scripts inside the callback will re-trigger the callback. 11581cb0ef41Sopenharmony_ci */ 11591cb0ef41Sopenharmony_ci void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 11601cb0ef41Sopenharmony_ci 11611cb0ef41Sopenharmony_ci /** 11621cb0ef41Sopenharmony_ci * Removes callback that was installed by AddBeforeCallEnteredCallback. 11631cb0ef41Sopenharmony_ci */ 11641cb0ef41Sopenharmony_ci void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 11651cb0ef41Sopenharmony_ci 11661cb0ef41Sopenharmony_ci /** 11671cb0ef41Sopenharmony_ci * Adds a callback to notify the host application when a script finished 11681cb0ef41Sopenharmony_ci * running. If a script re-enters the runtime during executing, the 11691cb0ef41Sopenharmony_ci * CallCompletedCallback is only invoked when the outer-most script 11701cb0ef41Sopenharmony_ci * execution ends. Executing scripts inside the callback do not trigger 11711cb0ef41Sopenharmony_ci * further callbacks. 11721cb0ef41Sopenharmony_ci */ 11731cb0ef41Sopenharmony_ci void AddCallCompletedCallback(CallCompletedCallback callback); 11741cb0ef41Sopenharmony_ci 11751cb0ef41Sopenharmony_ci /** 11761cb0ef41Sopenharmony_ci * Removes callback that was installed by AddCallCompletedCallback. 11771cb0ef41Sopenharmony_ci */ 11781cb0ef41Sopenharmony_ci void RemoveCallCompletedCallback(CallCompletedCallback callback); 11791cb0ef41Sopenharmony_ci 11801cb0ef41Sopenharmony_ci /** 11811cb0ef41Sopenharmony_ci * Set the PromiseHook callback for various promise lifecycle 11821cb0ef41Sopenharmony_ci * events. 11831cb0ef41Sopenharmony_ci */ 11841cb0ef41Sopenharmony_ci void SetPromiseHook(PromiseHook hook); 11851cb0ef41Sopenharmony_ci 11861cb0ef41Sopenharmony_ci /** 11871cb0ef41Sopenharmony_ci * Set callback to notify about promise reject with no handler, or 11881cb0ef41Sopenharmony_ci * revocation of such a previous notification once the handler is added. 11891cb0ef41Sopenharmony_ci */ 11901cb0ef41Sopenharmony_ci void SetPromiseRejectCallback(PromiseRejectCallback callback); 11911cb0ef41Sopenharmony_ci 11921cb0ef41Sopenharmony_ci /** 11931cb0ef41Sopenharmony_ci * Runs the default MicrotaskQueue until it gets empty and perform other 11941cb0ef41Sopenharmony_ci * microtask checkpoint steps, such as calling ClearKeptObjects. Asserts that 11951cb0ef41Sopenharmony_ci * the MicrotasksPolicy is not kScoped. Any exceptions thrown by microtask 11961cb0ef41Sopenharmony_ci * callbacks are swallowed. 11971cb0ef41Sopenharmony_ci */ 11981cb0ef41Sopenharmony_ci void PerformMicrotaskCheckpoint(); 11991cb0ef41Sopenharmony_ci 12001cb0ef41Sopenharmony_ci /** 12011cb0ef41Sopenharmony_ci * Enqueues the callback to the default MicrotaskQueue 12021cb0ef41Sopenharmony_ci */ 12031cb0ef41Sopenharmony_ci void EnqueueMicrotask(Local<Function> microtask); 12041cb0ef41Sopenharmony_ci 12051cb0ef41Sopenharmony_ci /** 12061cb0ef41Sopenharmony_ci * Enqueues the callback to the default MicrotaskQueue 12071cb0ef41Sopenharmony_ci */ 12081cb0ef41Sopenharmony_ci void EnqueueMicrotask(MicrotaskCallback callback, void* data = nullptr); 12091cb0ef41Sopenharmony_ci 12101cb0ef41Sopenharmony_ci /** 12111cb0ef41Sopenharmony_ci * Controls how Microtasks are invoked. See MicrotasksPolicy for details. 12121cb0ef41Sopenharmony_ci */ 12131cb0ef41Sopenharmony_ci void SetMicrotasksPolicy(MicrotasksPolicy policy); 12141cb0ef41Sopenharmony_ci 12151cb0ef41Sopenharmony_ci /** 12161cb0ef41Sopenharmony_ci * Returns the policy controlling how Microtasks are invoked. 12171cb0ef41Sopenharmony_ci */ 12181cb0ef41Sopenharmony_ci MicrotasksPolicy GetMicrotasksPolicy() const; 12191cb0ef41Sopenharmony_ci 12201cb0ef41Sopenharmony_ci /** 12211cb0ef41Sopenharmony_ci * Adds a callback to notify the host application after 12221cb0ef41Sopenharmony_ci * microtasks were run on the default MicrotaskQueue. The callback is 12231cb0ef41Sopenharmony_ci * triggered by explicit RunMicrotasks call or automatic microtasks execution 12241cb0ef41Sopenharmony_ci * (see SetMicrotaskPolicy). 12251cb0ef41Sopenharmony_ci * 12261cb0ef41Sopenharmony_ci * Callback will trigger even if microtasks were attempted to run, 12271cb0ef41Sopenharmony_ci * but the microtasks queue was empty and no single microtask was actually 12281cb0ef41Sopenharmony_ci * executed. 12291cb0ef41Sopenharmony_ci * 12301cb0ef41Sopenharmony_ci * Executing scripts inside the callback will not re-trigger microtasks and 12311cb0ef41Sopenharmony_ci * the callback. 12321cb0ef41Sopenharmony_ci */ 12331cb0ef41Sopenharmony_ci void AddMicrotasksCompletedCallback( 12341cb0ef41Sopenharmony_ci MicrotasksCompletedCallbackWithData callback, void* data = nullptr); 12351cb0ef41Sopenharmony_ci 12361cb0ef41Sopenharmony_ci /** 12371cb0ef41Sopenharmony_ci * Removes callback that was installed by AddMicrotasksCompletedCallback. 12381cb0ef41Sopenharmony_ci */ 12391cb0ef41Sopenharmony_ci void RemoveMicrotasksCompletedCallback( 12401cb0ef41Sopenharmony_ci MicrotasksCompletedCallbackWithData callback, void* data = nullptr); 12411cb0ef41Sopenharmony_ci 12421cb0ef41Sopenharmony_ci /** 12431cb0ef41Sopenharmony_ci * Sets a callback for counting the number of times a feature of V8 is used. 12441cb0ef41Sopenharmony_ci */ 12451cb0ef41Sopenharmony_ci void SetUseCounterCallback(UseCounterCallback callback); 12461cb0ef41Sopenharmony_ci 12471cb0ef41Sopenharmony_ci /** 12481cb0ef41Sopenharmony_ci * Enables the host application to provide a mechanism for recording 12491cb0ef41Sopenharmony_ci * statistics counters. 12501cb0ef41Sopenharmony_ci */ 12511cb0ef41Sopenharmony_ci void SetCounterFunction(CounterLookupCallback); 12521cb0ef41Sopenharmony_ci 12531cb0ef41Sopenharmony_ci /** 12541cb0ef41Sopenharmony_ci * Enables the host application to provide a mechanism for recording 12551cb0ef41Sopenharmony_ci * histograms. The CreateHistogram function returns a 12561cb0ef41Sopenharmony_ci * histogram which will later be passed to the AddHistogramSample 12571cb0ef41Sopenharmony_ci * function. 12581cb0ef41Sopenharmony_ci */ 12591cb0ef41Sopenharmony_ci void SetCreateHistogramFunction(CreateHistogramCallback); 12601cb0ef41Sopenharmony_ci void SetAddHistogramSampleFunction(AddHistogramSampleCallback); 12611cb0ef41Sopenharmony_ci 12621cb0ef41Sopenharmony_ci /** 12631cb0ef41Sopenharmony_ci * Enables the host application to provide a mechanism for recording 12641cb0ef41Sopenharmony_ci * event based metrics. In order to use this interface 12651cb0ef41Sopenharmony_ci * include/v8-metrics.h 12661cb0ef41Sopenharmony_ci * needs to be included and the recorder needs to be derived from the 12671cb0ef41Sopenharmony_ci * Recorder base class defined there. 12681cb0ef41Sopenharmony_ci * This method can only be called once per isolate and must happen during 12691cb0ef41Sopenharmony_ci * isolate initialization before background threads are spawned. 12701cb0ef41Sopenharmony_ci */ 12711cb0ef41Sopenharmony_ci void SetMetricsRecorder( 12721cb0ef41Sopenharmony_ci const std::shared_ptr<metrics::Recorder>& metrics_recorder); 12731cb0ef41Sopenharmony_ci 12741cb0ef41Sopenharmony_ci /** 12751cb0ef41Sopenharmony_ci * Enables the host application to provide a mechanism for recording a 12761cb0ef41Sopenharmony_ci * predefined set of data as crash keys to be used in postmortem debugging in 12771cb0ef41Sopenharmony_ci * case of a crash. 12781cb0ef41Sopenharmony_ci */ 12791cb0ef41Sopenharmony_ci void SetAddCrashKeyCallback(AddCrashKeyCallback); 12801cb0ef41Sopenharmony_ci 12811cb0ef41Sopenharmony_ci /** 12821cb0ef41Sopenharmony_ci * Optional notification that the embedder is idle. 12831cb0ef41Sopenharmony_ci * V8 uses the notification to perform garbage collection. 12841cb0ef41Sopenharmony_ci * This call can be used repeatedly if the embedder remains idle. 12851cb0ef41Sopenharmony_ci * Returns true if the embedder should stop calling IdleNotificationDeadline 12861cb0ef41Sopenharmony_ci * until real work has been done. This indicates that V8 has done 12871cb0ef41Sopenharmony_ci * as much cleanup as it will be able to do. 12881cb0ef41Sopenharmony_ci * 12891cb0ef41Sopenharmony_ci * The deadline_in_seconds argument specifies the deadline V8 has to finish 12901cb0ef41Sopenharmony_ci * garbage collection work. deadline_in_seconds is compared with 12911cb0ef41Sopenharmony_ci * MonotonicallyIncreasingTime() and should be based on the same timebase as 12921cb0ef41Sopenharmony_ci * that function. There is no guarantee that the actual work will be done 12931cb0ef41Sopenharmony_ci * within the time limit. 12941cb0ef41Sopenharmony_ci */ 12951cb0ef41Sopenharmony_ci V8_DEPRECATE_SOON( 12961cb0ef41Sopenharmony_ci "Use MemoryPressureNotification() to influence the GC schedule.") 12971cb0ef41Sopenharmony_ci bool IdleNotificationDeadline(double deadline_in_seconds); 12981cb0ef41Sopenharmony_ci 12991cb0ef41Sopenharmony_ci /** 13001cb0ef41Sopenharmony_ci * Optional notification that the system is running low on memory. 13011cb0ef41Sopenharmony_ci * V8 uses these notifications to attempt to free memory. 13021cb0ef41Sopenharmony_ci */ 13031cb0ef41Sopenharmony_ci void LowMemoryNotification(); 13041cb0ef41Sopenharmony_ci 13051cb0ef41Sopenharmony_ci /** 13061cb0ef41Sopenharmony_ci * Optional notification that a context has been disposed. V8 uses these 13071cb0ef41Sopenharmony_ci * notifications to guide the GC heuristic and cancel FinalizationRegistry 13081cb0ef41Sopenharmony_ci * cleanup tasks. Returns the number of context disposals - including this one 13091cb0ef41Sopenharmony_ci * - since the last time V8 had a chance to clean up. 13101cb0ef41Sopenharmony_ci * 13111cb0ef41Sopenharmony_ci * The optional parameter |dependant_context| specifies whether the disposed 13121cb0ef41Sopenharmony_ci * context was depending on state from other contexts or not. 13131cb0ef41Sopenharmony_ci */ 13141cb0ef41Sopenharmony_ci int ContextDisposedNotification(bool dependant_context = true); 13151cb0ef41Sopenharmony_ci 13161cb0ef41Sopenharmony_ci /** 13171cb0ef41Sopenharmony_ci * Optional notification that the isolate switched to the foreground. 13181cb0ef41Sopenharmony_ci * V8 uses these notifications to guide heuristics. 13191cb0ef41Sopenharmony_ci */ 13201cb0ef41Sopenharmony_ci void IsolateInForegroundNotification(); 13211cb0ef41Sopenharmony_ci 13221cb0ef41Sopenharmony_ci /** 13231cb0ef41Sopenharmony_ci * Optional notification that the isolate switched to the background. 13241cb0ef41Sopenharmony_ci * V8 uses these notifications to guide heuristics. 13251cb0ef41Sopenharmony_ci */ 13261cb0ef41Sopenharmony_ci void IsolateInBackgroundNotification(); 13271cb0ef41Sopenharmony_ci 13281cb0ef41Sopenharmony_ci /** 13291cb0ef41Sopenharmony_ci * Optional notification which will enable the memory savings mode. 13301cb0ef41Sopenharmony_ci * V8 uses this notification to guide heuristics which may result in a 13311cb0ef41Sopenharmony_ci * smaller memory footprint at the cost of reduced runtime performance. 13321cb0ef41Sopenharmony_ci */ 13331cb0ef41Sopenharmony_ci V8_DEPRECATED("Use IsolateInBackgroundNotification() instead") 13341cb0ef41Sopenharmony_ci void EnableMemorySavingsMode(); 13351cb0ef41Sopenharmony_ci 13361cb0ef41Sopenharmony_ci /** 13371cb0ef41Sopenharmony_ci * Optional notification which will disable the memory savings mode. 13381cb0ef41Sopenharmony_ci */ 13391cb0ef41Sopenharmony_ci V8_DEPRECATED("Use IsolateInBackgroundNotification() instead") 13401cb0ef41Sopenharmony_ci void DisableMemorySavingsMode(); 13411cb0ef41Sopenharmony_ci 13421cb0ef41Sopenharmony_ci /** 13431cb0ef41Sopenharmony_ci * Optional notification to tell V8 the current performance requirements 13441cb0ef41Sopenharmony_ci * of the embedder based on RAIL. 13451cb0ef41Sopenharmony_ci * V8 uses these notifications to guide heuristics. 13461cb0ef41Sopenharmony_ci * This is an unfinished experimental feature. Semantics and implementation 13471cb0ef41Sopenharmony_ci * may change frequently. 13481cb0ef41Sopenharmony_ci */ 13491cb0ef41Sopenharmony_ci void SetRAILMode(RAILMode rail_mode); 13501cb0ef41Sopenharmony_ci 13511cb0ef41Sopenharmony_ci /** 13521cb0ef41Sopenharmony_ci * Update load start time of the RAIL mode 13531cb0ef41Sopenharmony_ci */ 13541cb0ef41Sopenharmony_ci void UpdateLoadStartTime(); 13551cb0ef41Sopenharmony_ci 13561cb0ef41Sopenharmony_ci /** 13571cb0ef41Sopenharmony_ci * Optional notification to tell V8 the current isolate is used for debugging 13581cb0ef41Sopenharmony_ci * and requires higher heap limit. 13591cb0ef41Sopenharmony_ci */ 13601cb0ef41Sopenharmony_ci void IncreaseHeapLimitForDebugging(); 13611cb0ef41Sopenharmony_ci 13621cb0ef41Sopenharmony_ci /** 13631cb0ef41Sopenharmony_ci * Restores the original heap limit after IncreaseHeapLimitForDebugging(). 13641cb0ef41Sopenharmony_ci */ 13651cb0ef41Sopenharmony_ci void RestoreOriginalHeapLimit(); 13661cb0ef41Sopenharmony_ci 13671cb0ef41Sopenharmony_ci /** 13681cb0ef41Sopenharmony_ci * Returns true if the heap limit was increased for debugging and the 13691cb0ef41Sopenharmony_ci * original heap limit was not restored yet. 13701cb0ef41Sopenharmony_ci */ 13711cb0ef41Sopenharmony_ci bool IsHeapLimitIncreasedForDebugging(); 13721cb0ef41Sopenharmony_ci 13731cb0ef41Sopenharmony_ci /** 13741cb0ef41Sopenharmony_ci * Allows the host application to provide the address of a function that is 13751cb0ef41Sopenharmony_ci * notified each time code is added, moved or removed. 13761cb0ef41Sopenharmony_ci * 13771cb0ef41Sopenharmony_ci * \param options options for the JIT code event handler. 13781cb0ef41Sopenharmony_ci * \param event_handler the JIT code event handler, which will be invoked 13791cb0ef41Sopenharmony_ci * each time code is added, moved or removed. 13801cb0ef41Sopenharmony_ci * \note \p event_handler won't get notified of existent code. 13811cb0ef41Sopenharmony_ci * \note since code removal notifications are not currently issued, the 13821cb0ef41Sopenharmony_ci * \p event_handler may get notifications of code that overlaps earlier 13831cb0ef41Sopenharmony_ci * code notifications. This happens when code areas are reused, and the 13841cb0ef41Sopenharmony_ci * earlier overlapping code areas should therefore be discarded. 13851cb0ef41Sopenharmony_ci * \note the events passed to \p event_handler and the strings they point to 13861cb0ef41Sopenharmony_ci * are not guaranteed to live past each call. The \p event_handler must 13871cb0ef41Sopenharmony_ci * copy strings and other parameters it needs to keep around. 13881cb0ef41Sopenharmony_ci * \note the set of events declared in JitCodeEvent::EventType is expected to 13891cb0ef41Sopenharmony_ci * grow over time, and the JitCodeEvent structure is expected to accrue 13901cb0ef41Sopenharmony_ci * new members. The \p event_handler function must ignore event codes 13911cb0ef41Sopenharmony_ci * it does not recognize to maintain future compatibility. 13921cb0ef41Sopenharmony_ci * \note Use Isolate::CreateParams to get events for code executed during 13931cb0ef41Sopenharmony_ci * Isolate setup. 13941cb0ef41Sopenharmony_ci */ 13951cb0ef41Sopenharmony_ci void SetJitCodeEventHandler(JitCodeEventOptions options, 13961cb0ef41Sopenharmony_ci JitCodeEventHandler event_handler); 13971cb0ef41Sopenharmony_ci 13981cb0ef41Sopenharmony_ci /** 13991cb0ef41Sopenharmony_ci * Modifies the stack limit for this Isolate. 14001cb0ef41Sopenharmony_ci * 14011cb0ef41Sopenharmony_ci * \param stack_limit An address beyond which the Vm's stack may not grow. 14021cb0ef41Sopenharmony_ci * 14031cb0ef41Sopenharmony_ci * \note If you are using threads then you should hold the V8::Locker lock 14041cb0ef41Sopenharmony_ci * while setting the stack limit and you must set a non-default stack 14051cb0ef41Sopenharmony_ci * limit separately for each thread. 14061cb0ef41Sopenharmony_ci */ 14071cb0ef41Sopenharmony_ci void SetStackLimit(uintptr_t stack_limit); 14081cb0ef41Sopenharmony_ci 14091cb0ef41Sopenharmony_ci /** 14101cb0ef41Sopenharmony_ci * Returns a memory range that can potentially contain jitted code. Code for 14111cb0ef41Sopenharmony_ci * V8's 'builtins' will not be in this range if embedded builtins is enabled. 14121cb0ef41Sopenharmony_ci * 14131cb0ef41Sopenharmony_ci * On Win64, embedders are advised to install function table callbacks for 14141cb0ef41Sopenharmony_ci * these ranges, as default SEH won't be able to unwind through jitted code. 14151cb0ef41Sopenharmony_ci * The first page of the code range is reserved for the embedder and is 14161cb0ef41Sopenharmony_ci * committed, writable, and executable, to be used to store unwind data, as 14171cb0ef41Sopenharmony_ci * documented in 14181cb0ef41Sopenharmony_ci * https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64. 14191cb0ef41Sopenharmony_ci * 14201cb0ef41Sopenharmony_ci * Might be empty on other platforms. 14211cb0ef41Sopenharmony_ci * 14221cb0ef41Sopenharmony_ci * https://code.google.com/p/v8/issues/detail?id=3598 14231cb0ef41Sopenharmony_ci */ 14241cb0ef41Sopenharmony_ci void GetCodeRange(void** start, size_t* length_in_bytes); 14251cb0ef41Sopenharmony_ci 14261cb0ef41Sopenharmony_ci /** 14271cb0ef41Sopenharmony_ci * As GetCodeRange, but for embedded builtins (these live in a distinct 14281cb0ef41Sopenharmony_ci * memory region from other V8 Code objects). 14291cb0ef41Sopenharmony_ci */ 14301cb0ef41Sopenharmony_ci void GetEmbeddedCodeRange(const void** start, size_t* length_in_bytes); 14311cb0ef41Sopenharmony_ci 14321cb0ef41Sopenharmony_ci /** 14331cb0ef41Sopenharmony_ci * Returns the JSEntryStubs necessary for use with the Unwinder API. 14341cb0ef41Sopenharmony_ci */ 14351cb0ef41Sopenharmony_ci JSEntryStubs GetJSEntryStubs(); 14361cb0ef41Sopenharmony_ci 14371cb0ef41Sopenharmony_ci static constexpr size_t kMinCodePagesBufferSize = 32; 14381cb0ef41Sopenharmony_ci 14391cb0ef41Sopenharmony_ci /** 14401cb0ef41Sopenharmony_ci * Copies the code heap pages currently in use by V8 into |code_pages_out|. 14411cb0ef41Sopenharmony_ci * |code_pages_out| must have at least kMinCodePagesBufferSize capacity and 14421cb0ef41Sopenharmony_ci * must be empty. 14431cb0ef41Sopenharmony_ci * 14441cb0ef41Sopenharmony_ci * Signal-safe, does not allocate, does not access the V8 heap. 14451cb0ef41Sopenharmony_ci * No code on the stack can rely on pages that might be missing. 14461cb0ef41Sopenharmony_ci * 14471cb0ef41Sopenharmony_ci * Returns the number of pages available to be copied, which might be greater 14481cb0ef41Sopenharmony_ci * than |capacity|. In this case, only |capacity| pages will be copied into 14491cb0ef41Sopenharmony_ci * |code_pages_out|. The caller should provide a bigger buffer on the next 14501cb0ef41Sopenharmony_ci * call in order to get all available code pages, but this is not required. 14511cb0ef41Sopenharmony_ci */ 14521cb0ef41Sopenharmony_ci size_t CopyCodePages(size_t capacity, MemoryRange* code_pages_out); 14531cb0ef41Sopenharmony_ci 14541cb0ef41Sopenharmony_ci /** Set the callback to invoke in case of fatal errors. */ 14551cb0ef41Sopenharmony_ci void SetFatalErrorHandler(FatalErrorCallback that); 14561cb0ef41Sopenharmony_ci 14571cb0ef41Sopenharmony_ci /** Set the callback to invoke in case of OOM errors. */ 14581cb0ef41Sopenharmony_ci void SetOOMErrorHandler(OOMErrorCallback that); 14591cb0ef41Sopenharmony_ci 14601cb0ef41Sopenharmony_ci /** 14611cb0ef41Sopenharmony_ci * Add a callback to invoke in case the heap size is close to the heap limit. 14621cb0ef41Sopenharmony_ci * If multiple callbacks are added, only the most recently added callback is 14631cb0ef41Sopenharmony_ci * invoked. 14641cb0ef41Sopenharmony_ci */ 14651cb0ef41Sopenharmony_ci void AddNearHeapLimitCallback(NearHeapLimitCallback callback, void* data); 14661cb0ef41Sopenharmony_ci 14671cb0ef41Sopenharmony_ci /** 14681cb0ef41Sopenharmony_ci * Remove the given callback and restore the heap limit to the 14691cb0ef41Sopenharmony_ci * given limit. If the given limit is zero, then it is ignored. 14701cb0ef41Sopenharmony_ci * If the current heap size is greater than the given limit, 14711cb0ef41Sopenharmony_ci * then the heap limit is restored to the minimal limit that 14721cb0ef41Sopenharmony_ci * is possible for the current heap size. 14731cb0ef41Sopenharmony_ci */ 14741cb0ef41Sopenharmony_ci void RemoveNearHeapLimitCallback(NearHeapLimitCallback callback, 14751cb0ef41Sopenharmony_ci size_t heap_limit); 14761cb0ef41Sopenharmony_ci 14771cb0ef41Sopenharmony_ci /** 14781cb0ef41Sopenharmony_ci * If the heap limit was changed by the NearHeapLimitCallback, then the 14791cb0ef41Sopenharmony_ci * initial heap limit will be restored once the heap size falls below the 14801cb0ef41Sopenharmony_ci * given threshold percentage of the initial heap limit. 14811cb0ef41Sopenharmony_ci * The threshold percentage is a number in (0.0, 1.0) range. 14821cb0ef41Sopenharmony_ci */ 14831cb0ef41Sopenharmony_ci void AutomaticallyRestoreInitialHeapLimit(double threshold_percent = 0.5); 14841cb0ef41Sopenharmony_ci 14851cb0ef41Sopenharmony_ci /** 14861cb0ef41Sopenharmony_ci * Set the callback to invoke to check if code generation from 14871cb0ef41Sopenharmony_ci * strings should be allowed. 14881cb0ef41Sopenharmony_ci */ 14891cb0ef41Sopenharmony_ci void SetModifyCodeGenerationFromStringsCallback( 14901cb0ef41Sopenharmony_ci ModifyCodeGenerationFromStringsCallback2 callback); 14911cb0ef41Sopenharmony_ci 14921cb0ef41Sopenharmony_ci /** 14931cb0ef41Sopenharmony_ci * Set the callback to invoke to check if wasm code generation should 14941cb0ef41Sopenharmony_ci * be allowed. 14951cb0ef41Sopenharmony_ci */ 14961cb0ef41Sopenharmony_ci void SetAllowWasmCodeGenerationCallback( 14971cb0ef41Sopenharmony_ci AllowWasmCodeGenerationCallback callback); 14981cb0ef41Sopenharmony_ci 14991cb0ef41Sopenharmony_ci /** 15001cb0ef41Sopenharmony_ci * Embedder over{ride|load} injection points for wasm APIs. The expectation 15011cb0ef41Sopenharmony_ci * is that the embedder sets them at most once. 15021cb0ef41Sopenharmony_ci */ 15031cb0ef41Sopenharmony_ci void SetWasmModuleCallback(ExtensionCallback callback); 15041cb0ef41Sopenharmony_ci void SetWasmInstanceCallback(ExtensionCallback callback); 15051cb0ef41Sopenharmony_ci 15061cb0ef41Sopenharmony_ci void SetWasmStreamingCallback(WasmStreamingCallback callback); 15071cb0ef41Sopenharmony_ci 15081cb0ef41Sopenharmony_ci void SetWasmAsyncResolvePromiseCallback( 15091cb0ef41Sopenharmony_ci WasmAsyncResolvePromiseCallback callback); 15101cb0ef41Sopenharmony_ci 15111cb0ef41Sopenharmony_ci void SetWasmLoadSourceMapCallback(WasmLoadSourceMapCallback callback); 15121cb0ef41Sopenharmony_ci 15131cb0ef41Sopenharmony_ci /** 15141cb0ef41Sopenharmony_ci * Register callback to control whehter Wasm GC is enabled. 15151cb0ef41Sopenharmony_ci * The callback overwrites the value of the flag. 15161cb0ef41Sopenharmony_ci * If the callback returns true, it will also enable Wasm stringrefs. 15171cb0ef41Sopenharmony_ci */ 15181cb0ef41Sopenharmony_ci void SetWasmGCEnabledCallback(WasmGCEnabledCallback callback); 15191cb0ef41Sopenharmony_ci 15201cb0ef41Sopenharmony_ci void SetSharedArrayBufferConstructorEnabledCallback( 15211cb0ef41Sopenharmony_ci SharedArrayBufferConstructorEnabledCallback callback); 15221cb0ef41Sopenharmony_ci 15231cb0ef41Sopenharmony_ci /** 15241cb0ef41Sopenharmony_ci * This function can be called by the embedder to signal V8 that the dynamic 15251cb0ef41Sopenharmony_ci * enabling of features has finished. V8 can now set up dynamically added 15261cb0ef41Sopenharmony_ci * features. 15271cb0ef41Sopenharmony_ci */ 15281cb0ef41Sopenharmony_ci void InstallConditionalFeatures(Local<Context> context); 15291cb0ef41Sopenharmony_ci 15301cb0ef41Sopenharmony_ci /** 15311cb0ef41Sopenharmony_ci * Check if V8 is dead and therefore unusable. This is the case after 15321cb0ef41Sopenharmony_ci * fatal errors such as out-of-memory situations. 15331cb0ef41Sopenharmony_ci */ 15341cb0ef41Sopenharmony_ci bool IsDead(); 15351cb0ef41Sopenharmony_ci 15361cb0ef41Sopenharmony_ci /** 15371cb0ef41Sopenharmony_ci * Adds a message listener (errors only). 15381cb0ef41Sopenharmony_ci * 15391cb0ef41Sopenharmony_ci * The same message listener can be added more than once and in that 15401cb0ef41Sopenharmony_ci * case it will be called more than once for each message. 15411cb0ef41Sopenharmony_ci * 15421cb0ef41Sopenharmony_ci * If data is specified, it will be passed to the callback when it is called. 15431cb0ef41Sopenharmony_ci * Otherwise, the exception object will be passed to the callback instead. 15441cb0ef41Sopenharmony_ci */ 15451cb0ef41Sopenharmony_ci bool AddMessageListener(MessageCallback that, 15461cb0ef41Sopenharmony_ci Local<Value> data = Local<Value>()); 15471cb0ef41Sopenharmony_ci 15481cb0ef41Sopenharmony_ci /** 15491cb0ef41Sopenharmony_ci * Adds a message listener. 15501cb0ef41Sopenharmony_ci * 15511cb0ef41Sopenharmony_ci * The same message listener can be added more than once and in that 15521cb0ef41Sopenharmony_ci * case it will be called more than once for each message. 15531cb0ef41Sopenharmony_ci * 15541cb0ef41Sopenharmony_ci * If data is specified, it will be passed to the callback when it is called. 15551cb0ef41Sopenharmony_ci * Otherwise, the exception object will be passed to the callback instead. 15561cb0ef41Sopenharmony_ci * 15571cb0ef41Sopenharmony_ci * A listener can listen for particular error levels by providing a mask. 15581cb0ef41Sopenharmony_ci */ 15591cb0ef41Sopenharmony_ci bool AddMessageListenerWithErrorLevel(MessageCallback that, 15601cb0ef41Sopenharmony_ci int message_levels, 15611cb0ef41Sopenharmony_ci Local<Value> data = Local<Value>()); 15621cb0ef41Sopenharmony_ci 15631cb0ef41Sopenharmony_ci /** 15641cb0ef41Sopenharmony_ci * Remove all message listeners from the specified callback function. 15651cb0ef41Sopenharmony_ci */ 15661cb0ef41Sopenharmony_ci void RemoveMessageListeners(MessageCallback that); 15671cb0ef41Sopenharmony_ci 15681cb0ef41Sopenharmony_ci /** Callback function for reporting failed access checks.*/ 15691cb0ef41Sopenharmony_ci void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback); 15701cb0ef41Sopenharmony_ci 15711cb0ef41Sopenharmony_ci /** 15721cb0ef41Sopenharmony_ci * Tells V8 to capture current stack trace when uncaught exception occurs 15731cb0ef41Sopenharmony_ci * and report it to the message listeners. The option is off by default. 15741cb0ef41Sopenharmony_ci */ 15751cb0ef41Sopenharmony_ci void SetCaptureStackTraceForUncaughtExceptions( 15761cb0ef41Sopenharmony_ci bool capture, int frame_limit = 10, 15771cb0ef41Sopenharmony_ci StackTrace::StackTraceOptions options = StackTrace::kOverview); 15781cb0ef41Sopenharmony_ci 15791cb0ef41Sopenharmony_ci /** 15801cb0ef41Sopenharmony_ci * Iterates through all external resources referenced from current isolate 15811cb0ef41Sopenharmony_ci * heap. GC is not invoked prior to iterating, therefore there is no 15821cb0ef41Sopenharmony_ci * guarantee that visited objects are still alive. 15831cb0ef41Sopenharmony_ci */ 15841cb0ef41Sopenharmony_ci void VisitExternalResources(ExternalResourceVisitor* visitor); 15851cb0ef41Sopenharmony_ci 15861cb0ef41Sopenharmony_ci /** 15871cb0ef41Sopenharmony_ci * Check if this isolate is in use. 15881cb0ef41Sopenharmony_ci * True if at least one thread Enter'ed this isolate. 15891cb0ef41Sopenharmony_ci */ 15901cb0ef41Sopenharmony_ci bool IsInUse(); 15911cb0ef41Sopenharmony_ci 15921cb0ef41Sopenharmony_ci /** 15931cb0ef41Sopenharmony_ci * Set whether calling Atomics.wait (a function that may block) is allowed in 15941cb0ef41Sopenharmony_ci * this isolate. This can also be configured via 15951cb0ef41Sopenharmony_ci * CreateParams::allow_atomics_wait. 15961cb0ef41Sopenharmony_ci */ 15971cb0ef41Sopenharmony_ci void SetAllowAtomicsWait(bool allow); 15981cb0ef41Sopenharmony_ci 15991cb0ef41Sopenharmony_ci /** 16001cb0ef41Sopenharmony_ci * Time zone redetection indicator for 16011cb0ef41Sopenharmony_ci * DateTimeConfigurationChangeNotification. 16021cb0ef41Sopenharmony_ci * 16031cb0ef41Sopenharmony_ci * kSkip indicates V8 that the notification should not trigger redetecting 16041cb0ef41Sopenharmony_ci * host time zone. kRedetect indicates V8 that host time zone should be 16051cb0ef41Sopenharmony_ci * redetected, and used to set the default time zone. 16061cb0ef41Sopenharmony_ci * 16071cb0ef41Sopenharmony_ci * The host time zone detection may require file system access or similar 16081cb0ef41Sopenharmony_ci * operations unlikely to be available inside a sandbox. If v8 is run inside a 16091cb0ef41Sopenharmony_ci * sandbox, the host time zone has to be detected outside the sandbox before 16101cb0ef41Sopenharmony_ci * calling DateTimeConfigurationChangeNotification function. 16111cb0ef41Sopenharmony_ci */ 16121cb0ef41Sopenharmony_ci enum class TimeZoneDetection { kSkip, kRedetect }; 16131cb0ef41Sopenharmony_ci 16141cb0ef41Sopenharmony_ci /** 16151cb0ef41Sopenharmony_ci * Notification that the embedder has changed the time zone, daylight savings 16161cb0ef41Sopenharmony_ci * time or other date / time configuration parameters. V8 keeps a cache of 16171cb0ef41Sopenharmony_ci * various values used for date / time computation. This notification will 16181cb0ef41Sopenharmony_ci * reset those cached values for the current context so that date / time 16191cb0ef41Sopenharmony_ci * configuration changes would be reflected. 16201cb0ef41Sopenharmony_ci * 16211cb0ef41Sopenharmony_ci * This API should not be called more than needed as it will negatively impact 16221cb0ef41Sopenharmony_ci * the performance of date operations. 16231cb0ef41Sopenharmony_ci */ 16241cb0ef41Sopenharmony_ci void DateTimeConfigurationChangeNotification( 16251cb0ef41Sopenharmony_ci TimeZoneDetection time_zone_detection = TimeZoneDetection::kSkip); 16261cb0ef41Sopenharmony_ci 16271cb0ef41Sopenharmony_ci /** 16281cb0ef41Sopenharmony_ci * Notification that the embedder has changed the locale. V8 keeps a cache of 16291cb0ef41Sopenharmony_ci * various values used for locale computation. This notification will reset 16301cb0ef41Sopenharmony_ci * those cached values for the current context so that locale configuration 16311cb0ef41Sopenharmony_ci * changes would be reflected. 16321cb0ef41Sopenharmony_ci * 16331cb0ef41Sopenharmony_ci * This API should not be called more than needed as it will negatively impact 16341cb0ef41Sopenharmony_ci * the performance of locale operations. 16351cb0ef41Sopenharmony_ci */ 16361cb0ef41Sopenharmony_ci void LocaleConfigurationChangeNotification(); 16371cb0ef41Sopenharmony_ci 16381cb0ef41Sopenharmony_ci Isolate() = delete; 16391cb0ef41Sopenharmony_ci ~Isolate() = delete; 16401cb0ef41Sopenharmony_ci Isolate(const Isolate&) = delete; 16411cb0ef41Sopenharmony_ci Isolate& operator=(const Isolate&) = delete; 16421cb0ef41Sopenharmony_ci // Deleting operator new and delete here is allowed as ctor and dtor is also 16431cb0ef41Sopenharmony_ci // deleted. 16441cb0ef41Sopenharmony_ci void* operator new(size_t size) = delete; 16451cb0ef41Sopenharmony_ci void* operator new[](size_t size) = delete; 16461cb0ef41Sopenharmony_ci void operator delete(void*, size_t) = delete; 16471cb0ef41Sopenharmony_ci void operator delete[](void*, size_t) = delete; 16481cb0ef41Sopenharmony_ci 16491cb0ef41Sopenharmony_ci private: 16501cb0ef41Sopenharmony_ci template <class K, class V, class Traits> 16511cb0ef41Sopenharmony_ci friend class PersistentValueMapBase; 16521cb0ef41Sopenharmony_ci 16531cb0ef41Sopenharmony_ci internal::Address* GetDataFromSnapshotOnce(size_t index); 16541cb0ef41Sopenharmony_ci void ReportExternalAllocationLimitReached(); 16551cb0ef41Sopenharmony_ci}; 16561cb0ef41Sopenharmony_ci 16571cb0ef41Sopenharmony_civoid Isolate::SetData(uint32_t slot, void* data) { 16581cb0ef41Sopenharmony_ci using I = internal::Internals; 16591cb0ef41Sopenharmony_ci I::SetEmbedderData(this, slot, data); 16601cb0ef41Sopenharmony_ci} 16611cb0ef41Sopenharmony_ci 16621cb0ef41Sopenharmony_civoid* Isolate::GetData(uint32_t slot) { 16631cb0ef41Sopenharmony_ci using I = internal::Internals; 16641cb0ef41Sopenharmony_ci return I::GetEmbedderData(this, slot); 16651cb0ef41Sopenharmony_ci} 16661cb0ef41Sopenharmony_ci 16671cb0ef41Sopenharmony_ciuint32_t Isolate::GetNumberOfDataSlots() { 16681cb0ef41Sopenharmony_ci using I = internal::Internals; 16691cb0ef41Sopenharmony_ci return I::kNumIsolateDataSlots; 16701cb0ef41Sopenharmony_ci} 16711cb0ef41Sopenharmony_ci 16721cb0ef41Sopenharmony_citemplate <class T> 16731cb0ef41Sopenharmony_ciMaybeLocal<T> Isolate::GetDataFromSnapshotOnce(size_t index) { 16741cb0ef41Sopenharmony_ci auto slot = GetDataFromSnapshotOnce(index); 16751cb0ef41Sopenharmony_ci if (slot) { 16761cb0ef41Sopenharmony_ci internal::PerformCastCheck(internal::ValueHelper::SlotAsValue<T>(slot)); 16771cb0ef41Sopenharmony_ci } 16781cb0ef41Sopenharmony_ci return Local<T>::FromSlot(slot); 16791cb0ef41Sopenharmony_ci} 16801cb0ef41Sopenharmony_ci 16811cb0ef41Sopenharmony_ci} // namespace v8 16821cb0ef41Sopenharmony_ci 16831cb0ef41Sopenharmony_ci#endif // INCLUDE_V8_ISOLATE_H_ 1684