mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00
deps: update V8 to 10.7.193.13
PR-URL: https://github.com/nodejs/node/pull/44741 Fixes: https://github.com/nodejs/node/issues/44650 Fixes: https://github.com/nodejs/node/issues/37472 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
624dadb007
commit
6bd756d7c6
3737 changed files with 277746 additions and 186344 deletions
1
deps/v8/.gitignore
vendored
1
deps/v8/.gitignore
vendored
|
@ -30,6 +30,7 @@
|
|||
.cproject
|
||||
.gclient_entries
|
||||
.gdb_history
|
||||
.idea
|
||||
.jslint-cache
|
||||
.landmines
|
||||
.project
|
||||
|
|
9
deps/v8/.gn
vendored
9
deps/v8/.gn
vendored
|
@ -19,10 +19,17 @@ no_check_targets = [
|
|||
"//:cppgc_base",
|
||||
"//:v8_internal_headers",
|
||||
"//src/inspector:inspector",
|
||||
"//test/cctest:cctest_sources",
|
||||
"//test/cctest:cctest_sources", # 15 errors
|
||||
"//test/unittests:inspector_unittests_sources", # 2 errors
|
||||
"//third_party/icu:*",
|
||||
]
|
||||
|
||||
default_args = {
|
||||
# Overwrite default args declared in the Fuchsia sdk
|
||||
# Please maintain this in sync with Chromium version in src/.gn
|
||||
fuchsia_target_api_level = 9
|
||||
}
|
||||
|
||||
# These are the list of GN files that run exec_script. This whitelist exists
|
||||
# to force additional review for new uses of exec_script, which is strongly
|
||||
# discouraged except for gypi_to_gn calls.
|
||||
|
|
2
deps/v8/.mailmap
vendored
2
deps/v8/.mailmap
vendored
|
@ -11,4 +11,6 @@
|
|||
# Please keep the list sorted.
|
||||
|
||||
Clemens Backes <clemensb@chromium.org> Clemens Hammacher <clemensh@chromium.org>
|
||||
Jakob Linke <jgruber@chromium.org>
|
||||
Jakob Linke <jgruber@chromium.org> <jgruber@google.com>
|
||||
Timothy Gu <timothygu@chromium.org> <timothygu99@gmail.com>
|
||||
|
|
5
deps/v8/.vpython3
vendored
5
deps/v8/.vpython3
vendored
|
@ -69,3 +69,8 @@ wheel: <
|
|||
name: "infra/python/wheels/numpy/${vpython_platform}"
|
||||
version: "version:1.2x.supported.1"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/protobuf-py3"
|
||||
version: "version:3.19.3"
|
||||
>
|
||||
|
|
7
deps/v8/AUTHORS
vendored
7
deps/v8/AUTHORS
vendored
|
@ -42,6 +42,7 @@ Cloudflare, Inc. <*@cloudflare.com>
|
|||
Julia Computing, Inc. <*@juliacomputing.com>
|
||||
CodeWeavers, Inc. <*@codeweavers.com>
|
||||
Alibaba, Inc. <*@alibaba-inc.com>
|
||||
SiFive, Inc. <*@sifive.com>
|
||||
|
||||
Aaron Bieber <deftly@gmail.com>
|
||||
Aaron O'Mullan <aaron.omullan@gmail.com>
|
||||
|
@ -99,21 +100,25 @@ David Sanders <dsanders11@ucsbalum.com>
|
|||
Deepak Mohan <hop2deep@gmail.com>
|
||||
Deon Dior <diaoyuanjie@gmail.com>
|
||||
Derek Tu <derek.t@rioslab.org>
|
||||
Divy Srivastava <dj.srivastava23@gmail.com>
|
||||
Dominic Chen <d.c.ddcc@gmail.com>
|
||||
Dominic Farolini <domfarolino@gmail.com>
|
||||
Douglas Crosher <dtc-v8@scieneer.com>
|
||||
Dusan Milosavljevic <dusan.m.milosavljevic@gmail.com>
|
||||
Eden Wang <nedenwang@tencent.com>
|
||||
Eric Rannaud <eric.rannaud@gmail.com>
|
||||
Erich Ocean <erich.ocean@me.com>
|
||||
Evan Lucas <evan.lucas@help.com>
|
||||
Fedor Indutny <fedor@indutny.com>
|
||||
Felix Geisendörfer <haimuiba@gmail.com>
|
||||
Feng Yu <f3n67u@gmail.com>
|
||||
Filipe David Manana <fdmanana@gmail.com>
|
||||
Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
|
||||
Gao Sheng <gaosheng08@meituan.com>
|
||||
Geoffrey Garside <ggarside@gmail.com>
|
||||
Gergely Nagy <ngg@ngg.hu>
|
||||
Gilang Mentari Hamidy <gilang@hamidy.net>
|
||||
Giovanny Gutierrez <giovannygutierrez@gmail.com>
|
||||
Gus Caplan <me@gus.host>
|
||||
Gwang Yoon Hwang <ryumiel@company100.net>
|
||||
Haichuan Wang <hc.opensource@gmail.com>
|
||||
|
@ -122,6 +127,7 @@ Harshal Nandigramwar <pro.bbcom18@gmail.com>
|
|||
Harshil Jain <twitharshil@gmail.com>
|
||||
Henrique Ferreiro <henrique.ferreiro@gmail.com>
|
||||
Hirofumi Mako <mkhrfm@gmail.com>
|
||||
Hisham Muhammad <hisham@gobolinux.org>
|
||||
Honggyu Kim <honggyu.kp@gmail.com>
|
||||
Huáng Jùnliàng <jlhwung@gmail.com>
|
||||
HyeockJin Kim <kherootz@gmail.com>
|
||||
|
@ -194,6 +200,7 @@ Paolo Giarrusso <p.giarrusso@gmail.com>
|
|||
Patrick Gansterer <paroga@paroga.com>
|
||||
Paul Lind <plind44@gmail.com>
|
||||
Pavel Medvedev <pmedvedev@gmail.com>
|
||||
Pedro Falcato <pedro.falcato@gmail.com>
|
||||
Peng Fei <pfgenyun@gmail.com>
|
||||
Peng Wu <peng.w@rioslab.org>
|
||||
Peng-Yu Chen <pengyu@libstarrify.so>
|
||||
|
|
186
deps/v8/BUILD.bazel
vendored
186
deps/v8/BUILD.bazel
vendored
|
@ -68,6 +68,7 @@ load(":bazel/v8-non-pointer-compression.bzl", "v8_binary_non_pointer_compression
|
|||
# cppgc_enable_caged_heap
|
||||
# cppgc_enable_check_assignments_in_prefinalizers
|
||||
# cppgc_enable_object_names
|
||||
# cppgc_enable_pointer_compression
|
||||
# cppgc_enable_verify_heap
|
||||
# cppgc_enable_young_generation
|
||||
# v8_enable_zone_compression
|
||||
|
@ -323,7 +324,6 @@ v8_config(
|
|||
},
|
||||
defines = [
|
||||
"GOOGLE3",
|
||||
"CHROMIUM_ZLIB_NO_CHROMECONF",
|
||||
"ENABLE_DEBUGGER_SUPPORT",
|
||||
"V8_ADVANCED_BIGINT_ALGORITHMS",
|
||||
"V8_CONCURRENT_MARKING",
|
||||
|
@ -457,15 +457,19 @@ filegroup(
|
|||
"include/cppgc/garbage-collected.h",
|
||||
"include/cppgc/heap.h",
|
||||
"include/cppgc/heap-consistency.h",
|
||||
"include/cppgc/heap-handle.h",
|
||||
"include/cppgc/heap-state.h",
|
||||
"include/cppgc/heap-statistics.h",
|
||||
"include/cppgc/internal/api-constants.h",
|
||||
"include/cppgc/internal/atomic-entry-flag.h",
|
||||
"include/cppgc/internal/base-page-handle.h",
|
||||
"include/cppgc/internal/caged-heap-local-data.h",
|
||||
"include/cppgc/internal/caged-heap.h",
|
||||
"include/cppgc/internal/compiler-specific.h",
|
||||
"include/cppgc/internal/finalizer-trait.h",
|
||||
"include/cppgc/internal/gc-info.h",
|
||||
"include/cppgc/internal/logging.h",
|
||||
"include/cppgc/internal/member-storage.h",
|
||||
"include/cppgc/internal/name-trait.h",
|
||||
"include/cppgc/internal/persistent-node.h",
|
||||
"include/cppgc/internal/pointer-policies.h",
|
||||
|
@ -579,7 +583,6 @@ filegroup(
|
|||
"src/base/address-region.h",
|
||||
"src/base/atomic-utils.h",
|
||||
"src/base/atomicops.h",
|
||||
"src/base/atomicops_internals_atomicword_compat.h",
|
||||
"src/base/base-export.h",
|
||||
"src/base/bit-field.h",
|
||||
"src/base/bits-iterator.h",
|
||||
|
@ -590,6 +593,7 @@ filegroup(
|
|||
"src/base/bounds.h",
|
||||
"src/base/build_config.h",
|
||||
"src/base/compiler-specific.h",
|
||||
"src/base/container-utils.h",
|
||||
"src/base/cpu.cc",
|
||||
"src/base/cpu.h",
|
||||
"src/base/debug/stack_trace.cc",
|
||||
|
@ -604,7 +608,6 @@ filegroup(
|
|||
"src/base/file-utils.h",
|
||||
"src/base/flags.h",
|
||||
"src/base/free_deleter.h",
|
||||
"src/base/functional.cc",
|
||||
"src/base/functional.h",
|
||||
"src/base/hashmap-entry.h",
|
||||
"src/base/hashmap.h",
|
||||
|
@ -643,6 +646,9 @@ filegroup(
|
|||
"src/base/platform/condition-variable.cc",
|
||||
"src/base/platform/condition-variable.h",
|
||||
"src/base/platform/elapsed-timer.h",
|
||||
"src/base/platform/memory.h",
|
||||
"src/base/platform/memory-protection-key.cc",
|
||||
"src/base/platform/memory-protection-key.h",
|
||||
"src/base/platform/mutex.cc",
|
||||
"src/base/platform/mutex.h",
|
||||
"src/base/platform/platform.h",
|
||||
|
@ -659,6 +665,7 @@ filegroup(
|
|||
"src/base/safe_conversions_arm_impl.h",
|
||||
"src/base/safe_conversions_impl.h",
|
||||
"src/base/small-vector.h",
|
||||
"src/base/string-format.h",
|
||||
"src/base/strings.cc",
|
||||
"src/base/strings.h",
|
||||
"src/base/sys-info.cc",
|
||||
|
@ -689,6 +696,7 @@ filegroup(
|
|||
"@v8//bazel/config:is_linux": [
|
||||
"src/base/debug/stack_trace_posix.cc",
|
||||
"src/base/platform/platform-linux.cc",
|
||||
"src/base/platform/platform-linux.h",
|
||||
],
|
||||
"@v8//bazel/config:is_android": [
|
||||
"src/base/debug/stack_trace_android.cc",
|
||||
|
@ -779,7 +787,11 @@ filegroup(
|
|||
"src/builtins/array-slice.tq",
|
||||
"src/builtins/array-some.tq",
|
||||
"src/builtins/array-splice.tq",
|
||||
"src/builtins/array-to-reversed.tq",
|
||||
"src/builtins/array-to-sorted.tq",
|
||||
"src/builtins/array-to-spliced.tq",
|
||||
"src/builtins/array-unshift.tq",
|
||||
"src/builtins/array-with.tq",
|
||||
"src/builtins/array.tq",
|
||||
"src/builtins/arraybuffer.tq",
|
||||
"src/builtins/base.tq",
|
||||
|
@ -878,7 +890,9 @@ filegroup(
|
|||
"src/builtins/typed-array-some.tq",
|
||||
"src/builtins/typed-array-sort.tq",
|
||||
"src/builtins/typed-array-subarray.tq",
|
||||
"src/builtins/typed-array-to-reversed.tq",
|
||||
"src/builtins/typed-array-values.tq",
|
||||
"src/builtins/typed-array-with.tq",
|
||||
"src/builtins/typed-array.tq",
|
||||
"src/builtins/weak-ref.tq",
|
||||
"src/ic/handler-configuration.tq",
|
||||
|
@ -903,6 +917,7 @@ filegroup(
|
|||
"src/objects/heap-object.tq",
|
||||
"src/objects/js-array-buffer.tq",
|
||||
"src/objects/js-array.tq",
|
||||
"src/objects/js-atomics-synchronization.tq",
|
||||
"src/objects/js-collection-iterator.tq",
|
||||
"src/objects/js-collection.tq",
|
||||
"src/objects/js-function.tq",
|
||||
|
@ -912,7 +927,8 @@ filegroup(
|
|||
"src/objects/js-proxy.tq",
|
||||
"src/objects/js-regexp-string-iterator.tq",
|
||||
"src/objects/js-regexp.tq",
|
||||
"src/objects/js-shadow-realms.tq",
|
||||
"src/objects/js-shadow-realm.tq",
|
||||
"src/objects/js-shared-array.tq",
|
||||
"src/objects/js-struct.tq",
|
||||
"src/objects/js-temporal-objects.tq",
|
||||
"src/objects/js-weak-refs.tq",
|
||||
|
@ -1034,6 +1050,15 @@ filegroup(
|
|||
],
|
||||
)
|
||||
|
||||
# Default setting for v8_enable_pointer_compression when target is x64.
|
||||
selects.config_setting_group(
|
||||
name = "is_v8_enable_webassembly_on_non_android_posix_x64",
|
||||
match_all = [
|
||||
":is_v8_enable_webassembly",
|
||||
"@v8//bazel/config:is_non_android_posix_x64",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "v8_base_without_compiler_files",
|
||||
srcs = [
|
||||
|
@ -1091,6 +1116,7 @@ filegroup(
|
|||
"src/builtins/builtins-array.cc",
|
||||
"src/builtins/builtins-arraybuffer.cc",
|
||||
"src/builtins/builtins-async-module.cc",
|
||||
"src/builtins/builtins-atomics-synchronization.cc",
|
||||
"src/builtins/builtins-bigint.cc",
|
||||
"src/builtins/builtins-callsite.cc",
|
||||
"src/builtins/builtins-collections.cc",
|
||||
|
@ -1110,8 +1136,9 @@ filegroup(
|
|||
"src/builtins/builtins-promise.h",
|
||||
"src/builtins/builtins-reflect.cc",
|
||||
"src/builtins/builtins-regexp.cc",
|
||||
"src/builtins/builtins-shadow-realms.cc",
|
||||
"src/builtins/builtins-shadow-realm.cc",
|
||||
"src/builtins/builtins-sharedarraybuffer.cc",
|
||||
"src/builtins/builtins-shared-array.cc",
|
||||
"src/builtins/builtins-string.cc",
|
||||
"src/builtins/builtins-struct.cc",
|
||||
"src/builtins/builtins-symbol.cc",
|
||||
|
@ -1121,6 +1148,7 @@ filegroup(
|
|||
"src/builtins/builtins-utils-inl.h",
|
||||
"src/builtins/builtins-utils.h",
|
||||
"src/builtins/builtins-weak-refs.cc",
|
||||
"src/builtins/builtins-web-snapshots.cc",
|
||||
"src/builtins/builtins.cc",
|
||||
"src/builtins/builtins.h",
|
||||
"src/builtins/constants-table-builder.cc",
|
||||
|
@ -1133,6 +1161,7 @@ filegroup(
|
|||
"src/codegen/assembler.cc",
|
||||
"src/codegen/assembler.h",
|
||||
"src/codegen/atomic-memory-order.h",
|
||||
"src/codegen/background-merge-task.h",
|
||||
"src/codegen/bailout-reason.cc",
|
||||
"src/codegen/bailout-reason.h",
|
||||
"src/codegen/callable.h",
|
||||
|
@ -1170,6 +1199,8 @@ filegroup(
|
|||
"src/codegen/machine-type.h",
|
||||
"src/codegen/macro-assembler-inl.h",
|
||||
"src/codegen/macro-assembler.h",
|
||||
"src/codegen/maglev-safepoint-table.cc",
|
||||
"src/codegen/maglev-safepoint-table.h",
|
||||
"src/codegen/optimized-compilation-info.cc",
|
||||
"src/codegen/optimized-compilation-info.h",
|
||||
"src/codegen/pending-optimization-table.cc",
|
||||
|
@ -1183,6 +1214,7 @@ filegroup(
|
|||
"src/codegen/reglist.h",
|
||||
"src/codegen/reloc-info.cc",
|
||||
"src/codegen/reloc-info.h",
|
||||
"src/codegen/safepoint-table-base.h",
|
||||
"src/codegen/safepoint-table.cc",
|
||||
"src/codegen/safepoint-table.h",
|
||||
"src/codegen/script-details.h",
|
||||
|
@ -1191,8 +1223,6 @@ filegroup(
|
|||
"src/codegen/source-position-table.h",
|
||||
"src/codegen/source-position.cc",
|
||||
"src/codegen/source-position.h",
|
||||
"src/codegen/string-constants.cc",
|
||||
"src/codegen/string-constants.h",
|
||||
"src/codegen/tick-counter.cc",
|
||||
"src/codegen/tick-counter.h",
|
||||
"src/codegen/tnode.cc",
|
||||
|
@ -1203,8 +1233,10 @@ filegroup(
|
|||
"src/codegen/unoptimized-compilation-info.h",
|
||||
"src/common/assert-scope.cc",
|
||||
"src/common/assert-scope.h",
|
||||
"src/common/allow-deprecated.h",
|
||||
"src/common/checks.h",
|
||||
"src/common/code-memory-access-inl.h",
|
||||
"src/common/code-memory-access.cc",
|
||||
"src/common/code-memory-access.h",
|
||||
"src/common/high-allocation-throughput-scope.h",
|
||||
"src/common/message-template.h",
|
||||
"src/common/operation.h",
|
||||
|
@ -1240,6 +1272,8 @@ filegroup(
|
|||
"src/debug/debug.cc",
|
||||
"src/debug/debug.h",
|
||||
"src/debug/interface-types.h",
|
||||
"src/debug/liveedit-diff.cc",
|
||||
"src/debug/liveedit-diff.h",
|
||||
"src/debug/liveedit.cc",
|
||||
"src/debug/liveedit.h",
|
||||
"src/deoptimizer/deoptimize-reason.cc",
|
||||
|
@ -1356,6 +1390,8 @@ filegroup(
|
|||
"src/handles/maybe-handles.h",
|
||||
"src/handles/persistent-handles.cc",
|
||||
"src/handles/persistent-handles.h",
|
||||
"src/handles/shared-object-conveyor-handles.cc",
|
||||
"src/handles/shared-object-conveyor-handles.h",
|
||||
"src/heap/base/active-system-pages.cc",
|
||||
"src/heap/base/active-system-pages.h",
|
||||
"src/heap/allocation-observer.cc",
|
||||
|
@ -1410,11 +1446,14 @@ filegroup(
|
|||
"src/heap/free-list-inl.h",
|
||||
"src/heap/free-list.cc",
|
||||
"src/heap/free-list.h",
|
||||
"src/heap/gc-callbacks.h",
|
||||
"src/heap/gc-idle-time-handler.cc",
|
||||
"src/heap/gc-idle-time-handler.h",
|
||||
"src/heap/gc-tracer.cc",
|
||||
"src/heap/gc-tracer-inl.h",
|
||||
"src/heap/gc-tracer.h",
|
||||
"src/heap/global-handle-marking-visitor.cc",
|
||||
"src/heap/global-handle-marking-visitor.h",
|
||||
"src/heap/heap-allocator-inl.h",
|
||||
"src/heap/heap-allocator.cc",
|
||||
"src/heap/heap-allocator.h",
|
||||
|
@ -1423,6 +1462,8 @@ filegroup(
|
|||
"src/heap/heap-inl.h",
|
||||
"src/heap/heap-layout-tracer.cc",
|
||||
"src/heap/heap-layout-tracer.h",
|
||||
"src/heap/heap-verifier.cc",
|
||||
"src/heap/heap-verifier.h",
|
||||
"src/heap/heap-write-barrier-inl.h",
|
||||
"src/heap/heap-write-barrier.cc",
|
||||
"src/heap/heap-write-barrier.h",
|
||||
|
@ -1595,8 +1636,8 @@ filegroup(
|
|||
"src/logging/local-logger.cc",
|
||||
"src/logging/local-logger.h",
|
||||
"src/logging/log-inl.h",
|
||||
"src/logging/log-utils.cc",
|
||||
"src/logging/log-utils.h",
|
||||
"src/logging/log-file.cc",
|
||||
"src/logging/log-file.h",
|
||||
"src/logging/log.cc",
|
||||
"src/logging/log.h",
|
||||
"src/logging/metrics.cc",
|
||||
|
@ -1693,6 +1734,9 @@ filegroup(
|
|||
"src/objects/js-array-buffer.h",
|
||||
"src/objects/js-array-inl.h",
|
||||
"src/objects/js-array.h",
|
||||
"src/objects/js-atomics-synchronization-inl.h",
|
||||
"src/objects/js-atomics-synchronization.h",
|
||||
"src/objects/js-atomics-synchronization.cc",
|
||||
"src/objects/js-collection-inl.h",
|
||||
"src/objects/js-collection-iterator.h",
|
||||
"src/objects/js-collection-iterator-inl.h",
|
||||
|
@ -1714,8 +1758,10 @@ filegroup(
|
|||
"src/objects/js-regexp-string-iterator.h",
|
||||
"src/objects/js-regexp.cc",
|
||||
"src/objects/js-regexp.h",
|
||||
"src/objects/js-shadow-realms.h",
|
||||
"src/objects/js-shadow-realms-inl.h",
|
||||
"src/objects/js-shadow-realm.h",
|
||||
"src/objects/js-shadow-realm-inl.h",
|
||||
"src/objects/js-shared-array.h",
|
||||
"src/objects/js-shared-array-inl.h",
|
||||
"src/objects/js-struct.h",
|
||||
"src/objects/js-struct-inl.h",
|
||||
"src/objects/js-temporal-objects.h",
|
||||
|
@ -1771,9 +1817,6 @@ filegroup(
|
|||
"src/objects/ordered-hash-table-inl.h",
|
||||
"src/objects/ordered-hash-table.cc",
|
||||
"src/objects/ordered-hash-table.h",
|
||||
"src/objects/osr-optimized-code-cache-inl.h",
|
||||
"src/objects/osr-optimized-code-cache.cc",
|
||||
"src/objects/osr-optimized-code-cache.h",
|
||||
"src/objects/primitive-heap-object-inl.h",
|
||||
"src/objects/primitive-heap-object.h",
|
||||
"src/objects/promise-inl.h",
|
||||
|
@ -1803,6 +1846,8 @@ filegroup(
|
|||
"src/objects/shared-function-info-inl.h",
|
||||
"src/objects/shared-function-info.cc",
|
||||
"src/objects/shared-function-info.h",
|
||||
"src/objects/simd.cc",
|
||||
"src/objects/simd.h",
|
||||
"src/objects/slots-atomic-inl.h",
|
||||
"src/objects/slots-inl.h",
|
||||
"src/objects/slots.h",
|
||||
|
@ -1816,6 +1861,9 @@ filegroup(
|
|||
"src/objects/string-inl.h",
|
||||
"src/objects/string-set-inl.h",
|
||||
"src/objects/string-set.h",
|
||||
"src/objects/string-forwarding-table-inl.h",
|
||||
"src/objects/string-forwarding-table.cc",
|
||||
"src/objects/string-forwarding-table.h",
|
||||
"src/objects/string-table-inl.h",
|
||||
"src/objects/string-table.cc",
|
||||
"src/objects/symbol-table.cc",
|
||||
|
@ -1994,6 +2042,7 @@ filegroup(
|
|||
"src/runtime/runtime-shadow-realm.cc",
|
||||
"src/runtime/runtime-strings.cc",
|
||||
"src/runtime/runtime-symbol.cc",
|
||||
"src/runtime/runtime-temporal.cc",
|
||||
"src/runtime/runtime-test.cc",
|
||||
"src/runtime/runtime-trace.cc",
|
||||
"src/runtime/runtime-typedarray.cc",
|
||||
|
@ -2006,6 +2055,8 @@ filegroup(
|
|||
"src/sandbox/external-pointer-table.cc",
|
||||
"src/sandbox/external-pointer-table-inl.h",
|
||||
"src/sandbox/external-pointer-table.h",
|
||||
"src/sandbox/testing.cc",
|
||||
"src/sandbox/testing.h",
|
||||
"src/sandbox/sandbox.cc",
|
||||
"src/sandbox/sandbox.h",
|
||||
"src/sandbox/sandboxed-pointer-inl.h",
|
||||
|
@ -2047,8 +2098,6 @@ filegroup(
|
|||
"src/snapshot/shared-heap-deserializer.cc",
|
||||
"src/snapshot/shared-heap-serializer.h",
|
||||
"src/snapshot/shared-heap-serializer.cc",
|
||||
"src/snapshot/snapshot-compression.cc",
|
||||
"src/snapshot/snapshot-compression.h",
|
||||
"src/snapshot/snapshot-data.cc",
|
||||
"src/snapshot/snapshot-data.h",
|
||||
"src/snapshot/snapshot-source-sink.cc",
|
||||
|
@ -2097,12 +2146,6 @@ filegroup(
|
|||
"src/tracing/traced-value.h",
|
||||
"src/tracing/tracing-category-observer.cc",
|
||||
"src/tracing/tracing-category-observer.h",
|
||||
"src/trap-handler/handler-inside-posix.h",
|
||||
"src/trap-handler/handler-inside.cc",
|
||||
"src/trap-handler/handler-outside.cc",
|
||||
"src/trap-handler/handler-shared.cc",
|
||||
"src/trap-handler/trap-handler-internal.h",
|
||||
"src/trap-handler/trap-handler.h",
|
||||
"src/utils/address-map.cc",
|
||||
"src/utils/address-map.h",
|
||||
"src/utils/allocation.cc",
|
||||
|
@ -2112,6 +2155,8 @@ filegroup(
|
|||
"src/utils/boxed-float.h",
|
||||
"src/utils/detachable-vector.cc",
|
||||
"src/utils/detachable-vector.h",
|
||||
"src/utils/hex-format.cc",
|
||||
"src/utils/hex-format.h",
|
||||
"src/utils/identity-map.cc",
|
||||
"src/utils/identity-map.h",
|
||||
"src/utils/locked-queue-inl.h",
|
||||
|
@ -2121,6 +2166,9 @@ filegroup(
|
|||
"src/utils/ostreams.cc",
|
||||
"src/utils/ostreams.h",
|
||||
"src/utils/scoped-list.h",
|
||||
"src/utils/sha-256.cc",
|
||||
"src/utils/sha-256.h",
|
||||
"src/utils/sparse-bit-vector.h",
|
||||
"src/utils/utils-inl.h",
|
||||
"src/utils/utils.cc",
|
||||
"src/utils/utils.h",
|
||||
|
@ -2386,7 +2434,11 @@ filegroup(
|
|||
],
|
||||
}) + select({
|
||||
# Only for x64 builds and for arm64 with x64 host simulator.
|
||||
"@v8//bazel/config:is_non_android_posix_x64": [
|
||||
":is_v8_enable_webassembly_on_non_android_posix_x64": [
|
||||
"src/trap-handler/handler-inside-posix.cc",
|
||||
"src/trap-handler/handler-outside-posix.cc",
|
||||
],
|
||||
"@v8//bazel/config:is_macos_arm64": [
|
||||
"src/trap-handler/handler-inside-posix.cc",
|
||||
"src/trap-handler/handler-outside-posix.cc",
|
||||
],
|
||||
|
@ -2420,16 +2472,20 @@ filegroup(
|
|||
"src/asmjs/asm-scanner.h",
|
||||
"src/asmjs/asm-types.cc",
|
||||
"src/asmjs/asm-types.h",
|
||||
"src/compiler/int64-lowering.h",
|
||||
"src/compiler/wasm-compiler.h",
|
||||
"src/compiler/wasm-escape-analysis.h",
|
||||
"src/compiler/wasm-inlining.h",
|
||||
"src/compiler/wasm-loop-peeling.h",
|
||||
"src/debug/debug-wasm-objects.cc",
|
||||
"src/debug/debug-wasm-objects.h",
|
||||
"src/debug/debug-wasm-objects-inl.h",
|
||||
"src/runtime/runtime-test-wasm.cc",
|
||||
"src/runtime/runtime-wasm.cc",
|
||||
"src/third_party/utf8-decoder/generalized-utf8-decoder.h",
|
||||
"src/trap-handler/handler-inside-posix.h",
|
||||
"src/trap-handler/handler-inside.cc",
|
||||
"src/trap-handler/handler-outside.cc",
|
||||
"src/trap-handler/handler-shared.cc",
|
||||
"src/trap-handler/trap-handler-internal.h",
|
||||
"src/trap-handler/trap-handler.h",
|
||||
"src/wasm/assembler-buffer-cache.cc",
|
||||
"src/wasm/assembler-buffer-cache.h",
|
||||
"src/wasm/baseline/liftoff-assembler.cc",
|
||||
"src/wasm/baseline/liftoff-assembler-defs.h",
|
||||
"src/wasm/baseline/liftoff-assembler.h",
|
||||
|
@ -2442,6 +2498,10 @@ filegroup(
|
|||
"src/wasm/code-space-access.cc",
|
||||
"src/wasm/code-space-access.h",
|
||||
"src/wasm/compilation-environment.h",
|
||||
"src/wasm/constant-expression.cc",
|
||||
"src/wasm/constant-expression.h",
|
||||
"src/wasm/constant-expression-interface.cc",
|
||||
"src/wasm/constant-expression-interface.h",
|
||||
"src/wasm/decoder.h",
|
||||
"src/wasm/function-body-decoder.cc",
|
||||
"src/wasm/function-body-decoder.h",
|
||||
|
@ -2450,31 +2510,33 @@ filegroup(
|
|||
"src/wasm/function-compiler.h",
|
||||
"src/wasm/graph-builder-interface.cc",
|
||||
"src/wasm/graph-builder-interface.h",
|
||||
"src/wasm/init-expr-interface.cc",
|
||||
"src/wasm/init-expr-interface.h",
|
||||
"src/wasm/jump-table-assembler.cc",
|
||||
"src/wasm/jump-table-assembler.h",
|
||||
"src/wasm/leb-helper.h",
|
||||
"src/wasm/local-decl-encoder.cc",
|
||||
"src/wasm/local-decl-encoder.h",
|
||||
"src/wasm/memory-protection-key.cc",
|
||||
"src/wasm/memory-protection-key.h",
|
||||
"src/wasm/memory-tracing.cc",
|
||||
"src/wasm/memory-tracing.h",
|
||||
"src/wasm/module-compiler.cc",
|
||||
"src/wasm/module-compiler.h",
|
||||
"src/wasm/module-decoder.cc",
|
||||
"src/wasm/module-decoder.h",
|
||||
"src/wasm/module-decoder-impl.h",
|
||||
"src/wasm/module-instantiate.cc",
|
||||
"src/wasm/module-instantiate.h",
|
||||
"src/wasm/names-provider.cc",
|
||||
"src/wasm/names-provider.h",
|
||||
"src/wasm/object-access.h",
|
||||
"src/wasm/signature-map.cc",
|
||||
"src/wasm/signature-map.h",
|
||||
"src/wasm/simd-shuffle.cc",
|
||||
"src/wasm/simd-shuffle.h",
|
||||
"src/wasm/stacks.cc",
|
||||
"src/wasm/stacks.h",
|
||||
"src/wasm/streaming-decoder.cc",
|
||||
"src/wasm/streaming-decoder.h",
|
||||
"src/wasm/string-builder.h",
|
||||
"src/wasm/string-builder-multiline.h",
|
||||
"src/wasm/struct-types.h",
|
||||
"src/wasm/sync-streaming-decoder.cc",
|
||||
"src/wasm/value-type.cc",
|
||||
|
@ -2484,6 +2546,9 @@ filegroup(
|
|||
"src/wasm/wasm-code-manager.h",
|
||||
"src/wasm/wasm-debug.cc",
|
||||
"src/wasm/wasm-debug.h",
|
||||
"src/wasm/wasm-disassembler.cc",
|
||||
"src/wasm/wasm-disassembler.h",
|
||||
"src/wasm/wasm-disassembler-impl.h",
|
||||
"src/wasm/wasm-engine.cc",
|
||||
"src/wasm/wasm-engine.h",
|
||||
"src/wasm/wasm-external-refs.cc",
|
||||
|
@ -2646,6 +2711,7 @@ filegroup(
|
|||
"src/compiler/control-equivalence.h",
|
||||
"src/compiler/control-flow-optimizer.cc",
|
||||
"src/compiler/control-flow-optimizer.h",
|
||||
"src/compiler/control-path-state.h",
|
||||
"src/compiler/csa-load-elimination.cc",
|
||||
"src/compiler/csa-load-elimination.h",
|
||||
"src/compiler/dead-code-elimination.cc",
|
||||
|
@ -2708,6 +2774,8 @@ filegroup(
|
|||
"src/compiler/js-type-hint-lowering.h",
|
||||
"src/compiler/js-typed-lowering.cc",
|
||||
"src/compiler/js-typed-lowering.h",
|
||||
"src/compiler/late-escape-analysis.cc",
|
||||
"src/compiler/late-escape-analysis.h",
|
||||
"src/compiler/linkage.cc",
|
||||
"src/compiler/linkage.h",
|
||||
"src/compiler/load-elimination.cc",
|
||||
|
@ -2793,6 +2861,26 @@ filegroup(
|
|||
"src/compiler/state-values-utils.h",
|
||||
"src/compiler/store-store-elimination.cc",
|
||||
"src/compiler/store-store-elimination.h",
|
||||
"src/compiler/turboshaft/assembler.h",
|
||||
"src/compiler/turboshaft/decompression-optimization.cc",
|
||||
"src/compiler/turboshaft/decompression-optimization.h",
|
||||
"src/compiler/turboshaft/deopt-data.h",
|
||||
"src/compiler/turboshaft/fast-hash.h",
|
||||
"src/compiler/turboshaft/graph-builder.cc",
|
||||
"src/compiler/turboshaft/graph-builder.h",
|
||||
"src/compiler/turboshaft/graph.cc",
|
||||
"src/compiler/turboshaft/graph.h",
|
||||
"src/compiler/turboshaft/graph-visualizer.cc",
|
||||
"src/compiler/turboshaft/graph-visualizer.h",
|
||||
"src/compiler/turboshaft/operations.cc",
|
||||
"src/compiler/turboshaft/operations.h",
|
||||
"src/compiler/turboshaft/optimization-phase.cc",
|
||||
"src/compiler/turboshaft/optimization-phase.h",
|
||||
"src/compiler/turboshaft/recreate-schedule.cc",
|
||||
"src/compiler/turboshaft/recreate-schedule.h",
|
||||
"src/compiler/turboshaft/sidetable.h",
|
||||
"src/compiler/turboshaft/utils.h",
|
||||
"src/compiler/turboshaft/value-numbering-assembler.h",
|
||||
"src/compiler/type-cache.cc",
|
||||
"src/compiler/type-cache.h",
|
||||
"src/compiler/type-narrowing-reducer.cc",
|
||||
|
@ -2813,10 +2901,24 @@ filegroup(
|
|||
] + select({
|
||||
":is_v8_enable_webassembly": [
|
||||
"src/compiler/int64-lowering.cc",
|
||||
"src/compiler/int64-lowering.h",
|
||||
"src/compiler/wasm-compiler-definitions.h",
|
||||
"src/compiler/wasm-compiler.cc",
|
||||
"src/compiler/wasm-loop-peeling.cc",
|
||||
"src/compiler/wasm-compiler.h",
|
||||
"src/compiler/wasm-escape-analysis.cc",
|
||||
"src/compiler/wasm-escape-analysis.h",
|
||||
"src/compiler/wasm-loop-peeling.cc",
|
||||
"src/compiler/wasm-loop-peeling.h",
|
||||
"src/compiler/wasm-gc-lowering.cc",
|
||||
"src/compiler/wasm-gc-lowering.h",
|
||||
"src/compiler/wasm-gc-operator-reducer.cc",
|
||||
"src/compiler/wasm-gc-operator-reducer.h",
|
||||
"src/compiler/wasm-graph-assembler.cc",
|
||||
"src/compiler/wasm-graph-assembler.h",
|
||||
"src/compiler/wasm-inlining.cc",
|
||||
"src/compiler/wasm-inlining.h",
|
||||
"src/compiler/wasm-typer.cc",
|
||||
"src/compiler/wasm-typer.h",
|
||||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
|
@ -2863,7 +2965,7 @@ filegroup(
|
|||
"src/builtins/builtins-proxy-gen.h",
|
||||
"src/builtins/builtins-regexp-gen.cc",
|
||||
"src/builtins/builtins-regexp-gen.h",
|
||||
"src/builtins/builtins-shadowrealm-gen.cc",
|
||||
"src/builtins/builtins-shadow-realm-gen.cc",
|
||||
"src/builtins/builtins-sharedarraybuffer-gen.cc",
|
||||
"src/builtins/builtins-string-gen.cc",
|
||||
"src/builtins/builtins-string-gen.h",
|
||||
|
@ -2966,6 +3068,8 @@ filegroup(
|
|||
"src/heap/cppgc/marking-visitor.h",
|
||||
"src/heap/cppgc/marking-worklists.cc",
|
||||
"src/heap/cppgc/marking-worklists.h",
|
||||
"src/heap/cppgc/member-storage.cc",
|
||||
"src/heap/cppgc/member-storage.h",
|
||||
"src/heap/cppgc/memory.cc",
|
||||
"src/heap/cppgc/memory.h",
|
||||
"src/heap/cppgc/metric-recorder.h",
|
||||
|
@ -3030,8 +3134,8 @@ filegroup(
|
|||
"@v8//bazel/config:is_inline_asm_s390x": ["src/heap/base/asm/s390/push_registers_asm.cc"],
|
||||
"@v8//bazel/config:is_inline_asm_riscv64": ["src/heap/base/asm/riscv64/push_registers_asm.cc"],
|
||||
"@v8//bazel/config:is_inline_asm_ppc64le": ["src/heap/base/asm/ppc/push_registers_asm.cc"],
|
||||
"@v8//bazel/config:is_msvc_asm_ia32": ["src/heap/base/asm/ia32/push_registers_masm.S"],
|
||||
"@v8//bazel/config:is_msvc_asm_x64": ["src/heap/base/asm/x64/push_registers_masm.S"],
|
||||
"@v8//bazel/config:is_msvc_asm_ia32": ["src/heap/base/asm/ia32/push_registers_masm.asm"],
|
||||
"@v8//bazel/config:is_msvc_asm_x64": ["src/heap/base/asm/x64/push_registers_masm.asm"],
|
||||
"@v8//bazel/config:is_msvc_asm_arm64": ["src/heap/base/asm/arm64/push_registers_masm.S"],
|
||||
}),
|
||||
)
|
||||
|
@ -3136,6 +3240,8 @@ filegroup(
|
|||
"src/inspector/v8-string-conversions.h",
|
||||
"src/inspector/v8-value-utils.cc",
|
||||
"src/inspector/v8-value-utils.h",
|
||||
"src/inspector/v8-webdriver-serializer.cc",
|
||||
"src/inspector/v8-webdriver-serializer.h",
|
||||
"src/inspector/value-mirror.cc",
|
||||
"src/inspector/value-mirror.h",
|
||||
":crdtp_platform_files",
|
||||
|
@ -3285,8 +3391,6 @@ py_binary(
|
|||
"third_party/inspector_protocol/lib/ValueConversions_h.template",
|
||||
"third_party/inspector_protocol/lib/Values_cpp.template",
|
||||
"third_party/inspector_protocol/lib/Values_h.template",
|
||||
"third_party/inspector_protocol/lib/base_string_adapter_cc.template",
|
||||
"third_party/inspector_protocol/lib/base_string_adapter_h.template",
|
||||
"third_party/inspector_protocol/templates/Exported_h.template",
|
||||
"third_party/inspector_protocol/templates/Imported_h.template",
|
||||
"third_party/inspector_protocol/templates/TypeBuilder_cpp.template",
|
||||
|
@ -3479,8 +3583,6 @@ v8_library(
|
|||
deps = [
|
||||
":v8_libbase",
|
||||
"//external:base_trace_event_common",
|
||||
"//external:zlib",
|
||||
"//external:zlib_compression_utils",
|
||||
],
|
||||
)
|
||||
|
||||
|
@ -3596,7 +3698,7 @@ v8_binary_non_pointer_compression(
|
|||
|
||||
alias(
|
||||
name = "v8ci",
|
||||
actual = "icu/v8",
|
||||
actual = "noicu/v8",
|
||||
)
|
||||
|
||||
# =================================================
|
||||
|
|
753
deps/v8/BUILD.gn
vendored
753
deps/v8/BUILD.gn
vendored
File diff suppressed because it is too large
Load diff
166
deps/v8/DEPS
vendored
166
deps/v8/DEPS
vendored
|
@ -12,17 +12,20 @@ vars = {
|
|||
# Fetches only the SDK boot images which match at least one of the whitelist
|
||||
# entries in a comma-separated list.
|
||||
#
|
||||
# Only the X64 and ARM64 QEMU images are downloaded by default. Developers
|
||||
# that need to boot on other target architectures or devices can opt to
|
||||
# download more boot images. Example of images include:
|
||||
# Available images:
|
||||
# Emulation:
|
||||
# - qemu.x64 (pulls terminal.qemu-x64-release)
|
||||
# - qemu.arm64 (pulls terminal.qemu-arm64-release)
|
||||
# - workstation.qemu-x64-release
|
||||
# Hardware:
|
||||
# - generic.x64 (pulls terminal.x64-debug)
|
||||
# - generic.arm64 (pulls terminal.arm64-debug)
|
||||
# - chromebook.x64 (pulls terminal.chromebook-x64-debug)
|
||||
#
|
||||
# Emulation:
|
||||
# qemu.x64, qemu.arm64
|
||||
# Hardware:
|
||||
# generic.x64, generic.arm64
|
||||
#
|
||||
# Wildcards are supported (e.g. "qemu.*").
|
||||
'checkout_fuchsia_boot_images': "qemu.x64,qemu.arm64",
|
||||
# Since the images are hundreds of MB, default to only downloading the image
|
||||
# most commonly useful for developers. Bots and developers that need to use
|
||||
# other images (e.g., qemu.arm64) can override this with additional images.
|
||||
'checkout_fuchsia_boot_images': "qemu.x64",
|
||||
|
||||
'checkout_instrumented_libraries': False,
|
||||
'checkout_ittapi': False,
|
||||
|
@ -36,27 +39,35 @@ vars = {
|
|||
'check_v8_header_includes': False,
|
||||
'checkout_reclient': False,
|
||||
|
||||
# By default, download the fuchsia sdk from the public sdk directory.
|
||||
'fuchsia_sdk_cipd_prefix': 'fuchsia/sdk/gn/',
|
||||
|
||||
# reclient CIPD package version
|
||||
'reclient_version': 're_client_version:0.40.0.40ff5a5',
|
||||
'reclient_version': 're_client_version:0.69.0.458df98-gomaip',
|
||||
|
||||
# GN CIPD package version.
|
||||
'gn_version': 'git_revision:ae110f8b525009255ba1f9ae96982176d3bfad3d',
|
||||
'gn_version': 'git_revision:b4851eb2062f76a880c07f7fa0d12913beb6d79e',
|
||||
|
||||
# luci-go CIPD package version.
|
||||
'luci_go': 'git_revision:6da0608e4fa8a3c6d1fa4f855485c0038b05bf72',
|
||||
'luci_go': 'git_revision:c93fd3c5ebdc3999eea86a7623dbd1ed4b40bc78',
|
||||
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling Fuchsia sdk
|
||||
# and whatever else without interference from each other.
|
||||
'fuchsia_version': 'version:9.20220913.3.1',
|
||||
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_build-tools_version
|
||||
# and whatever else without interference from each other.
|
||||
'android_sdk_build-tools_version': 'tRoD45SCi7UleQqSV7MrMQO1_e5P8ysphkCcj6z_cCQC',
|
||||
'android_sdk_build-tools_version': '-VRKr36Uw8L_iFqqo9nevIBgNMggND5iWxjidyjnCgsC',
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_emulator_version
|
||||
# and whatever else without interference from each other.
|
||||
'android_sdk_emulator_version': 'gMHhUuoQRKfxr-MBn3fNNXZtkAVXtOwMwT7kfx8jkIgC',
|
||||
'android_sdk_emulator_version': '9lGp8nTUCRRWGMnI_96HcKfzjnxEJKUcfvfwmA3wXNkC',
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_extras_version
|
||||
# and whatever else without interference from each other.
|
||||
'android_sdk_extras_version': 'ppQ4TnqDvBHQ3lXx5KPq97egzF5X2FFyOrVHkGmiTMQC',
|
||||
'android_sdk_extras_version': 'bY55nDqO6FAm6FkGIj09sh2KW9oqAkCGKjYok5nUvBMC',
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_patcher_version
|
||||
# and whatever else without interference from each other.
|
||||
|
@ -64,39 +75,39 @@ vars = {
|
|||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_platform-tools_version
|
||||
# and whatever else without interference from each other.
|
||||
'android_sdk_platform-tools_version': 'g7n_-r6yJd_SGRklujGB1wEt8iyr77FZTUJVS9w6O34C',
|
||||
'android_sdk_platform-tools_version': 'RSI3iwryh7URLGRgJHsCvUxj092woTPnKt4pwFcJ6L8C',
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_platforms_version
|
||||
# and whatever else without interference from each other.
|
||||
'android_sdk_platforms_version': 'lL3IGexKjYlwjO_1Ga-xwxgwbE_w-lmi2Zi1uOlWUIAC',
|
||||
'android_sdk_platforms_version': 'eo5KvW6UVor92LwZai8Zulc624BQZoCu-yn7wa1z_YcC',
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_sources_version
|
||||
# and whatever else without interference from each other.
|
||||
'android_sdk_sources_version': '7EcXjyZWkTu3sCA8d8eRXg_aCBCYt8ihXgxp29VXLs8C',
|
||||
'android_sdk_sources_version': 'qfTSF99e29-w3eIVPpfcif0Em5etyvxuicTDTntWHQMC',
|
||||
# Three lines of non-changing comments so that
|
||||
# the commit queue can handle CLs rolling android_sdk_tools-lint_version
|
||||
# and whatever else without interference from each other.
|
||||
'android_sdk_cmdline-tools_version': 'PGPmqJtSIQ84If155ba7iTU846h5WJ-bL5d_OoUWEWYC',
|
||||
'android_sdk_cmdline-tools_version': 'IPzAG-uU5zVMxohpg9-7-N0tQC1TCSW1VbrBFw7Ld04C',
|
||||
}
|
||||
|
||||
deps = {
|
||||
'base/trace_event/common':
|
||||
Var('chromium_url') + '/chromium/src/base/trace_event/common.git' + '@' + 'd115b033c4e53666b535cbd1985ffe60badad082',
|
||||
Var('chromium_url') + '/chromium/src/base/trace_event/common.git' + '@' + '521ac34ebd795939c7e16b37d9d3ddb40e8ed556',
|
||||
'build':
|
||||
Var('chromium_url') + '/chromium/src/build.git' + '@' + 'b37c340767cf9e7777d4ca5a588c34c5744df9b2',
|
||||
Var('chromium_url') + '/chromium/src/build.git' + '@' + '4157fb6cb44135013300168c9f4c5b95d04acf70',
|
||||
'buildtools':
|
||||
Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + 'c2e4795660817c2776dbabd778b92ed58c074032',
|
||||
Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + 'e713c13e2fa3b7aa9131276f27990011e1aa6a73',
|
||||
'buildtools/clang_format/script':
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git' + '@' + 'e435ad79c17b1888b34df88d6a30a094936e3836',
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git' + '@' + '8b525d2747f2584fc35d8c7e612e66f377858df7',
|
||||
'buildtools/linux64': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'gn/gn/linux-amd64',
|
||||
'package': 'gn/gn/linux-${{arch}}',
|
||||
'version': Var('gn_version'),
|
||||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': 'host_os == "linux"',
|
||||
'condition': 'host_os == "linux" and host_cpu != "s390" and host_cpu != "ppc"',
|
||||
},
|
||||
'buildtools/mac': {
|
||||
'packages': [
|
||||
|
@ -109,11 +120,11 @@ deps = {
|
|||
'condition': 'host_os == "mac"',
|
||||
},
|
||||
'buildtools/third_party/libc++/trunk':
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + '79a2e924d96e2fc1e4b937c42efd08898fa472d7',
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + 'c1e647c7c30238f7c512457eec55798e3458fd8a',
|
||||
'buildtools/third_party/libc++abi/trunk':
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + 'e025ba5dc85202540099d7cd8e72eae2d4ee9e33',
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + '5c3e02e92ae8bbc1bf1001bd9ef0d76e044ddb86',
|
||||
'buildtools/third_party/libunwind/trunk':
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + 'c39fea88739be63a2d5590a938ce19d762b915fc',
|
||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + '60a480ee1819266cf8054548454f99838583cd76',
|
||||
'buildtools/win': {
|
||||
'packages': [
|
||||
{
|
||||
|
@ -132,46 +143,26 @@ deps = {
|
|||
}
|
||||
],
|
||||
'dep_type': 'cipd',
|
||||
'condition': '(host_os == "linux" or host_os == "win") and checkout_reclient',
|
||||
'condition': '(host_os == "linux" or host_os == "mac" or host_os == "win") and checkout_reclient',
|
||||
},
|
||||
'test/benchmarks/data':
|
||||
Var('chromium_url') + '/v8/deps/third_party/benchmarks.git' + '@' + '05d7188267b4560491ff9155c5ee13e207ecd65f',
|
||||
'test/mozilla/data':
|
||||
Var('chromium_url') + '/v8/deps/third_party/mozilla-tests.git' + '@' + 'f6c578a10ea707b1a8ab0b88943fe5115ce2b9be',
|
||||
'test/test262/data':
|
||||
Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + 'd7c0a2076c2b0c1531aef7069d4abe70eec44ee3',
|
||||
'third_party/aemu-linux-x64': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/third_party/aemu/linux-amd64',
|
||||
'version': 'vRCm89BzABss-_H8vC-tLjcSf6uusZA9IBSSYtdw4_kC'
|
||||
},
|
||||
],
|
||||
'condition': 'host_os == "linux" and checkout_fuchsia',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
'third_party/aemu-mac-x64': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/third_party/aemu/mac-amd64',
|
||||
'version': 'T9bWxf8aUC5TwCFgPxpuW29Mfy-7Z9xCfXB9QO8MfU0C'
|
||||
},
|
||||
],
|
||||
'condition': 'host_os == "mac" and checkout_fuchsia',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '746197355c1705b7d4463fc75c29433c0ce2fd0d',
|
||||
'third_party/android_ndk': {
|
||||
'url': Var('chromium_url') + '/android_ndk.git' + '@' + '8388a2be5421311dc75c5f937aae13d821a27f3d',
|
||||
'condition': 'checkout_android',
|
||||
},
|
||||
'third_party/android_platform': {
|
||||
'url': Var('chromium_url') + '/chromium/src/third_party/android_platform.git' + '@' + '2760db43ffc8b074cb7960c90b5254f74a5c299a',
|
||||
'url': Var('chromium_url') + '/chromium/src/third_party/android_platform.git' + '@' + '04b33506bfd9d0e866bd8bd62f4cbf323d84dc79',
|
||||
'condition': 'checkout_android',
|
||||
},
|
||||
'third_party/android_sdk/public': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'chromium/third_party/android_sdk/public/build-tools/31.0.0',
|
||||
'package': 'chromium/third_party/android_sdk/public/build-tools/33.0.0',
|
||||
'version': Var('android_sdk_build-tools_version'),
|
||||
},
|
||||
{
|
||||
|
@ -191,7 +182,7 @@ deps = {
|
|||
'version': Var('android_sdk_platform-tools_version'),
|
||||
},
|
||||
{
|
||||
'package': 'chromium/third_party/android_sdk/public/platforms/android-31',
|
||||
'package': 'chromium/third_party/android_sdk/public/platforms/android-33',
|
||||
'version': Var('android_sdk_platforms_version'),
|
||||
},
|
||||
{
|
||||
|
@ -207,7 +198,7 @@ deps = {
|
|||
'dep_type': 'cipd',
|
||||
},
|
||||
'third_party/catapult': {
|
||||
'url': Var('chromium_url') + '/catapult.git' + '@' + '3a1ae18f882d024686144edbec3050aae055f146',
|
||||
'url': Var('chromium_url') + '/catapult.git' + '@' + '37391a1619e953e23d3441dbc61e658e881fede4',
|
||||
'condition': 'checkout_android',
|
||||
},
|
||||
'third_party/colorama/src': {
|
||||
|
@ -215,18 +206,24 @@ deps = {
|
|||
'condition': 'checkout_android',
|
||||
},
|
||||
'third_party/depot_tools':
|
||||
Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '3b97fa826eee4bd1978c4c049038b1e4f201e8f2',
|
||||
'third_party/fuchsia-sdk': {
|
||||
'url': Var('chromium_url') + '/chromium/src/third_party/fuchsia-sdk.git' + '@' + '7c9c220d13ab367d49420144a257886ebfbce278',
|
||||
Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '9ebcfa6be17c2d1e7bd72135ceab5e767ed89b7d',
|
||||
'third_party/fuchsia-sdk/sdk': {
|
||||
'packages': [
|
||||
{
|
||||
'package': Var('fuchsia_sdk_cipd_prefix') + '${{platform}}',
|
||||
'version': Var('fuchsia_version'),
|
||||
},
|
||||
],
|
||||
'condition': 'checkout_fuchsia',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
'third_party/google_benchmark/src': {
|
||||
'url': Var('chromium_url') + '/external/github.com/google/benchmark.git' + '@' + 'dc901ff9090e2b931433790cc44afc3af3b09ab2',
|
||||
'url': Var('chromium_url') + '/external/github.com/google/benchmark.git' + '@' + 'e8baf2622591569a27615b31372d1e9cc046af10',
|
||||
},
|
||||
'third_party/googletest/src':
|
||||
Var('chromium_url') + '/external/github.com/google/googletest.git' + '@' + 'af29db7ec28d6df1c7f0f745186884091e602e07',
|
||||
'third_party/icu':
|
||||
Var('chromium_url') + '/chromium/deps/icu.git' + '@' + '1fd0dbea04448c3f73fe5cb7599f9472f0f107f1',
|
||||
Var('chromium_url') + '/chromium/deps/icu.git' + '@' + '20f8ac695af59b6c830def7d4e95bfeb13dd7be5',
|
||||
'third_party/instrumented_libraries':
|
||||
Var('chromium_url') + '/chromium/src/third_party/instrumented_libraries.git' + '@' + 'e09c4b66b6e87116eb190651421f1a6e2f3b9c52',
|
||||
'third_party/ittapi': {
|
||||
|
@ -238,43 +235,23 @@ deps = {
|
|||
'third_party/jinja2':
|
||||
Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + 'ee69aa00ee8536f61db6a451f3858745cf587de6',
|
||||
'third_party/jsoncpp/source':
|
||||
Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '9059f5cad030ba11d37818847443a53918c327b1',
|
||||
Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '42e892d96e47b1f6e29844cc705e148ec4856448',
|
||||
'third_party/logdog/logdog':
|
||||
Var('chromium_url') + '/infra/luci/luci-py/client/libs/logdog' + '@' + '0b2078a90f7a638d576b3a7c407d136f2fb62399',
|
||||
'third_party/markupsafe':
|
||||
Var('chromium_url') + '/chromium/src/third_party/markupsafe.git' + '@' + '1b882ef6372b58bfd55a3285f37ed801be9137cd',
|
||||
'third_party/perfetto':
|
||||
Var('android_url') + '/platform/external/perfetto.git' + '@' + 'aa4385bc5997ecad4c633885e1b331b1115012fb',
|
||||
Var('android_url') + '/platform/external/perfetto.git' + '@' + '0eba417b2c72264fa825dc21067b9adc9b8adf70',
|
||||
'third_party/protobuf':
|
||||
Var('chromium_url') + '/external/github.com/google/protobuf'+ '@' + '6a59a2ad1f61d9696092f79b6d74368b4d7970a3',
|
||||
'third_party/qemu-linux-x64': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/qemu/linux-amd64',
|
||||
'version': '9cc486c5b18a0be515c39a280ca9a309c54cf994'
|
||||
},
|
||||
],
|
||||
'condition': 'host_os == "linux" and checkout_fuchsia',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
'third_party/qemu-mac-x64': {
|
||||
'packages': [
|
||||
{
|
||||
'package': 'fuchsia/qemu/mac-amd64',
|
||||
'version': '2d3358ae9a569b2d4a474f498b32b202a152134f'
|
||||
},
|
||||
],
|
||||
'condition': 'host_os == "mac" and checkout_fuchsia',
|
||||
'dep_type': 'cipd',
|
||||
},
|
||||
'third_party/requests': {
|
||||
'url': Var('chromium_url') + '/external/github.com/kennethreitz/requests.git' + '@' + '2c2138e811487b13020eb331482fb991fd399d4e',
|
||||
'url': Var('chromium_url') + '/external/github.com/kennethreitz/requests.git' + '@' + 'refs/tags/v2.23.0',
|
||||
'condition': 'checkout_android',
|
||||
},
|
||||
'third_party/zlib':
|
||||
Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + 'a6d209ab932df0f1c9d5b7dc67cfa74e8a3272c0',
|
||||
Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + 'f48cb14d487038d20c85680e29351e095a0fea8b',
|
||||
'tools/clang':
|
||||
Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + 'b5e2f7c16bbf3aefc9354e8fbad3de0a543f2193',
|
||||
Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '02a202a7b1fa863352c0c9fb088fd3c0cf48c978',
|
||||
'tools/luci-go': {
|
||||
'packages': [
|
||||
{
|
||||
|
@ -580,15 +557,6 @@ hooks = [
|
|||
'action': ['python3', 'build/util/lastchange.py',
|
||||
'-o', 'build/util/LASTCHANGE'],
|
||||
},
|
||||
{
|
||||
'name': 'Download Fuchsia SDK',
|
||||
'pattern': '.',
|
||||
'condition': 'checkout_fuchsia',
|
||||
'action': [
|
||||
'python3',
|
||||
'build/fuchsia/update_sdk.py',
|
||||
],
|
||||
},
|
||||
{
|
||||
'name': 'Download Fuchsia system images',
|
||||
'pattern': '.',
|
||||
|
@ -634,4 +602,14 @@ hooks = [
|
|||
'tools/generate-header-include-checks.py',
|
||||
],
|
||||
},
|
||||
{
|
||||
# Clean up build dirs for crbug.com/1337238.
|
||||
# After a libc++ roll and revert, .ninja_deps would get into a state
|
||||
# that breaks Ninja on Windows.
|
||||
# TODO(crbug.com/1337238): Remove in a month or so.
|
||||
'name': 'del_ninja_deps_cache',
|
||||
'pattern': '.',
|
||||
'condition': 'host_os == "win"',
|
||||
'action': ['python3', 'build/del_ninja_deps_cache.py'],
|
||||
},
|
||||
]
|
||||
|
|
1
deps/v8/ENG_REVIEW_OWNERS
vendored
1
deps/v8/ENG_REVIEW_OWNERS
vendored
|
@ -6,3 +6,4 @@ adamk@chromium.org
|
|||
danno@chromium.org
|
||||
hpayer@chromium.org
|
||||
verwaest@chromium.org
|
||||
vahl@chromium.org
|
||||
|
|
5
deps/v8/INFRA_OWNERS
vendored
5
deps/v8/INFRA_OWNERS
vendored
|
@ -1,4 +1,5 @@
|
|||
machenbach@chromium.org
|
||||
tmrts@chromium.org
|
||||
alexschulze@chromium.org
|
||||
almuthanna@chromium.org
|
||||
liviurau@chromium.org
|
||||
machenbach@chromium.org
|
||||
tmrts@chromium.org
|
||||
|
|
3
deps/v8/LICENSE
vendored
3
deps/v8/LICENSE
vendored
|
@ -15,8 +15,7 @@ are:
|
|||
- Strongtalk assembler, the basis of the files assembler-arm-inl.h,
|
||||
assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
|
||||
assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h,
|
||||
assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h,
|
||||
assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h.
|
||||
assembler-x64.cc, assembler-x64.h, assembler.cc and assembler.h.
|
||||
This code is copyrighted by Sun Microsystems Inc. and released
|
||||
under a 3-clause BSD license.
|
||||
|
||||
|
|
17
deps/v8/OWNERS
vendored
17
deps/v8/OWNERS
vendored
|
@ -3,20 +3,21 @@
|
|||
file:ENG_REVIEW_OWNERS
|
||||
|
||||
per-file .*=file:INFRA_OWNERS
|
||||
per-file .mailmap=file:COMMON_OWNERS
|
||||
per-file .bazelrc=file:COMMON_OWNERS
|
||||
per-file .mailmap=file:COMMON_OWNERS
|
||||
per-file codereview.settings=file:INFRA_OWNERS
|
||||
per-file AUTHORS=file:COMMON_OWNERS
|
||||
per-file BUILD.bazel=file:COMMON_OWNERS
|
||||
per-file BUILD.gn=file:COMMON_OWNERS
|
||||
per-file WORKSPACE=file:COMMON_OWNERS
|
||||
per-file DEPS=file:INFRA_OWNERS
|
||||
per-file INFRA_OWNERS=file:INFRA_OWNERS
|
||||
per-file PRESUBMIT.py=file:INFRA_OWNERS
|
||||
per-file WATCHLISTS=file:COMMON_OWNERS
|
||||
per-file WORKSPACE=file:COMMON_OWNERS
|
||||
|
||||
# For Test262 rolls.
|
||||
per-file DEPS=mathias@chromium.org
|
||||
per-file DEPS=syg@chromium.org
|
||||
per-file PRESUBMIT.py=file:INFRA_OWNERS
|
||||
per-file codereview.settings=file:INFRA_OWNERS
|
||||
|
||||
per-file AUTHORS=file:COMMON_OWNERS
|
||||
per-file WATCHLISTS=file:COMMON_OWNERS
|
||||
|
||||
# Needed by the auto_tag builder
|
||||
per-file WATCHLISTS=v8-ci-autoroll-builder@chops-service-accounts.iam.gserviceaccount.com
|
||||
|
@ -26,5 +27,5 @@ per-file ...-loong64*=file:LOONG_OWNERS
|
|||
per-file ...-mips*=file:MIPS_OWNERS
|
||||
per-file ...-mips64*=file:MIPS_OWNERS
|
||||
per-file ...-ppc*=file:PPC_OWNERS
|
||||
per-file ...-riscv64*=file:RISCV_OWNERS
|
||||
per-file ...-riscv*=file:RISCV_OWNERS
|
||||
per-file ...-s390*=file:S390_OWNERS
|
||||
|
|
14
deps/v8/PRESUBMIT.py
vendored
14
deps/v8/PRESUBMIT.py
vendored
|
@ -486,14 +486,18 @@ def _CheckNoexceptAnnotations(input_api, output_api):
|
|||
"""
|
||||
|
||||
def FilterFile(affected_file):
|
||||
return input_api.FilterSourceFile(
|
||||
affected_file,
|
||||
files_to_check=(r'src[\\\/].*', r'test[\\\/].*'),
|
||||
files_to_skip = _EXCLUDED_PATHS + (
|
||||
# Skip api.cc since we cannot easily add the 'noexcept' annotation to
|
||||
# public methods.
|
||||
r'src[\\\/]api[\\\/]api\.cc',
|
||||
# Skip src/bigint/ because it's meant to be V8-independent.
|
||||
files_to_skip=(r'src[\\\/]api[\\\/]api\.cc',
|
||||
r'src[\\\/]bigint[\\\/].*'))
|
||||
r'src[\\\/]bigint[\\\/].*',
|
||||
)
|
||||
return input_api.FilterSourceFile(
|
||||
affected_file,
|
||||
files_to_check=(r'src[\\\/].*\.cc', r'src[\\\/].*\.h',
|
||||
r'test[\\\/].*\.cc', r'test[\\\/].*\.h'),
|
||||
files_to_skip=files_to_skip)
|
||||
|
||||
# matches any class name.
|
||||
class_name = r'\b([A-Z][A-Za-z0-9_:]*)(?:::\1)?'
|
||||
|
|
2
deps/v8/WATCHLISTS
vendored
2
deps/v8/WATCHLISTS
vendored
|
@ -108,6 +108,7 @@
|
|||
'jgruber+watch@chromium.org',
|
||||
'leszeks+watch@chromium.org',
|
||||
'verwaest+watch@chromium.org',
|
||||
'victorgomes+watch@chromium.org',
|
||||
],
|
||||
'snapshot': [
|
||||
'jgruber+watch@chromium.org',
|
||||
|
@ -129,6 +130,7 @@
|
|||
'arm': [
|
||||
'v8-mips-ports@googlegroups.com',
|
||||
'v8-ppc-ports@googlegroups.com',
|
||||
'v8-risc-v-ports@chromium.org',
|
||||
],
|
||||
'merges': [
|
||||
# Only enabled on branches created with tools/release/create_release.py
|
||||
|
|
16
deps/v8/WORKSPACE
vendored
16
deps/v8/WORKSPACE
vendored
|
@ -34,22 +34,6 @@ pip_install(
|
|||
requirements = "//:bazel/requirements.txt",
|
||||
)
|
||||
|
||||
new_local_repository(
|
||||
name = "com_googlesource_chromium_zlib",
|
||||
build_file = "bazel/BUILD.zlib",
|
||||
path = "third_party/zlib",
|
||||
)
|
||||
|
||||
bind(
|
||||
name = "zlib",
|
||||
actual = "@com_googlesource_chromium_zlib//:zlib",
|
||||
)
|
||||
|
||||
bind(
|
||||
name = "zlib_compression_utils",
|
||||
actual = "@com_googlesource_chromium_zlib//:zlib_compression_utils",
|
||||
)
|
||||
|
||||
new_local_repository(
|
||||
name = "com_googlesource_chromium_icu",
|
||||
build_file = "bazel/BUILD.icu",
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright 2015 The Chromium Authors. All rights reserved.
|
||||
// Copyright 2015 The Chromium Authors
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
|
@ -404,6 +404,10 @@ struct BASE_EXPORT TraceTimestampTraits<::base::TimeTicks> {
|
|||
// - |timestamp| must be non-null or it crashes. Use DCHECK(timestamp) before
|
||||
// calling this to detect an invalid timestamp even when tracing is not
|
||||
// enabled, as the commit queue doesn't run all tests with tracing enabled.
|
||||
// Note: This legacy macro is deprecated. It should not be used in new code.
|
||||
// If thread_id is different from current thread id, it will result into
|
||||
// DCHECK failure. This note is also applicable to `_COPY` and `_END`
|
||||
// variant of this macro.
|
||||
#define TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category_group, name, id, \
|
||||
thread_id, timestamp) \
|
||||
INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \
|
||||
|
@ -1024,18 +1028,6 @@ struct BASE_EXPORT TraceTimestampTraits<::base::TimeTicks> {
|
|||
TRACE_EVENT_PHASE_DELETE_OBJECT, category_group, name, id, \
|
||||
TRACE_EVENT_FLAG_NONE)
|
||||
|
||||
// Records entering and leaving trace event contexts. |category_group| and
|
||||
// |name| specify the context category and type. |context| is a
|
||||
// snapshotted context object id.
|
||||
#define TRACE_EVENT_ENTER_CONTEXT(category_group, name, context) \
|
||||
INTERNAL_TRACE_EVENT_ADD_WITH_ID( \
|
||||
TRACE_EVENT_PHASE_ENTER_CONTEXT, category_group, name, context, \
|
||||
TRACE_EVENT_FLAG_NONE)
|
||||
#define TRACE_EVENT_LEAVE_CONTEXT(category_group, name, context) \
|
||||
INTERNAL_TRACE_EVENT_ADD_WITH_ID( \
|
||||
TRACE_EVENT_PHASE_LEAVE_CONTEXT, category_group, name, context, \
|
||||
TRACE_EVENT_FLAG_NONE)
|
||||
|
||||
// Macro to efficiently determine if a given category group is enabled.
|
||||
#define TRACE_EVENT_CATEGORY_GROUP_ENABLED(category_group, ret) \
|
||||
do { \
|
||||
|
@ -1099,12 +1091,15 @@ struct BASE_EXPORT TraceTimestampTraits<::base::TimeTicks> {
|
|||
#define TRACE_EVENT_PHASE_MEMORY_DUMP ('v')
|
||||
#define TRACE_EVENT_PHASE_MARK ('R')
|
||||
#define TRACE_EVENT_PHASE_CLOCK_SYNC ('c')
|
||||
#define TRACE_EVENT_PHASE_ENTER_CONTEXT ('(')
|
||||
#define TRACE_EVENT_PHASE_LEAVE_CONTEXT (')')
|
||||
|
||||
// Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT.
|
||||
#define TRACE_EVENT_FLAG_NONE (static_cast<unsigned int>(0))
|
||||
|
||||
// Should not be used outside this file or
|
||||
// except `trace_event_impl.cc` (implementation details).
|
||||
// If used, it will result in CHECK failure in SDK build.
|
||||
#define TRACE_EVENT_FLAG_COPY (static_cast<unsigned int>(1 << 0))
|
||||
|
||||
#define TRACE_EVENT_FLAG_HAS_ID (static_cast<unsigned int>(1 << 1))
|
||||
#define TRACE_EVENT_FLAG_SCOPE_OFFSET (static_cast<unsigned int>(1 << 2))
|
||||
#define TRACE_EVENT_FLAG_SCOPE_EXTRA (static_cast<unsigned int>(1 << 3))
|
||||
|
|
69
deps/v8/bazel/BUILD.zlib
vendored
69
deps/v8/bazel/BUILD.zlib
vendored
|
@ -1,69 +0,0 @@
|
|||
# Copyright 2021 the V8 project authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
cc_library(
|
||||
name = "zlib",
|
||||
srcs = [
|
||||
"adler32.c",
|
||||
"chromeconf.h",
|
||||
"compress.c",
|
||||
"contrib/optimizations/insert_string.h",
|
||||
"contrib/optimizations/slide_hash_neon.h",
|
||||
"cpu_features.c",
|
||||
"cpu_features.h",
|
||||
"crc32.c",
|
||||
"crc32.h",
|
||||
"deflate.c",
|
||||
"deflate.h",
|
||||
"gzclose.c",
|
||||
"gzguts.h",
|
||||
"gzlib.c",
|
||||
"gzread.c",
|
||||
"gzwrite.c",
|
||||
"infback.c",
|
||||
"inffast.c",
|
||||
"inffast.h",
|
||||
"inffixed.h",
|
||||
"inflate.c",
|
||||
"inflate.h",
|
||||
"inftrees.c",
|
||||
"inftrees.h",
|
||||
"trees.c",
|
||||
"trees.h",
|
||||
"uncompr.c",
|
||||
"zconf.h",
|
||||
"zlib.h",
|
||||
"zutil.c",
|
||||
"zutil.h",
|
||||
],
|
||||
hdrs = [
|
||||
"zlib.h",
|
||||
],
|
||||
defines = [
|
||||
"CHROMIUM_ZLIB_NO_CHROMECONF",
|
||||
"CPU_NO_SIMD",
|
||||
] + select({
|
||||
"@platforms//os:windows": [],
|
||||
"//conditions:default": [
|
||||
"HAVE_HIDDEN",
|
||||
],
|
||||
}),
|
||||
include_prefix = "third_party/zlib",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "zlib_compression_utils",
|
||||
srcs = [
|
||||
"google/compression_utils_portable.cc",
|
||||
],
|
||||
hdrs = [
|
||||
"google/compression_utils_portable.h",
|
||||
],
|
||||
include_prefix = "third_party/zlib",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//external:zlib",
|
||||
],
|
||||
)
|
8
deps/v8/bazel/config/BUILD.bazel
vendored
8
deps/v8/bazel/config/BUILD.bazel
vendored
|
@ -290,6 +290,14 @@ selects.config_setting_group(
|
|||
],
|
||||
)
|
||||
|
||||
selects.config_setting_group(
|
||||
name = "is_macos_arm64",
|
||||
match_all = [
|
||||
":is_macos",
|
||||
":is_arm64",
|
||||
],
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "is_compiler_default",
|
||||
flag_values = {
|
||||
|
|
1
deps/v8/bazel/defs.bzl
vendored
1
deps/v8/bazel/defs.bzl
vendored
|
@ -493,7 +493,6 @@ def build_config_content(cpu, icu):
|
|||
("target_cpu", cpu),
|
||||
("v8_current_cpu", cpu),
|
||||
("v8_dict_property_const_tracking", "false"),
|
||||
("v8_enable_atomic_marking_state", "false"),
|
||||
("v8_enable_atomic_object_field_writes", "false"),
|
||||
("v8_enable_concurrent_marking", "false"),
|
||||
("v8_enable_i18n_support", icu),
|
||||
|
|
2
deps/v8/gni/OWNERS
vendored
2
deps/v8/gni/OWNERS
vendored
|
@ -1,5 +1,5 @@
|
|||
file:../INFRA_OWNERS
|
||||
|
||||
per-file v8.cmx=victorgomes@chromium.org
|
||||
per-file v8.cml=victorgomes@chromium.org
|
||||
per-file release_branch_toggle.gni=v8-ci-autoroll-builder@chops-service-accounts.iam.gserviceaccount.com
|
||||
per-file release_branch_toggle.gni=vahl@chromium.org
|
15
deps/v8/gni/proto_library.gni
vendored
15
deps/v8/gni/proto_library.gni
vendored
|
@ -76,6 +76,17 @@ template("proto_library") {
|
|||
out_dir = "$root_gen_dir/" + proto_out_dir
|
||||
rel_out_dir = rebase_path(out_dir, root_build_dir)
|
||||
|
||||
# exclude_imports is only used for generating the descriptor. Therefore, the
|
||||
# check needs to be here to avoid complaints from GN about the unused
|
||||
# variable.
|
||||
if (generate_descriptor != "") {
|
||||
if (defined(invoker.exclude_imports)) {
|
||||
exclude_imports = invoker.exclude_imports
|
||||
} else {
|
||||
exclude_imports = false
|
||||
}
|
||||
}
|
||||
|
||||
# Prevent unused errors when generating descriptor only.
|
||||
if (generate_descriptor != "") {
|
||||
not_needed([ "rel_out_dir" ])
|
||||
|
@ -163,8 +174,10 @@ template("proto_library") {
|
|||
}
|
||||
if (generate_descriptor != "") {
|
||||
depfile = "$out_dir/$generate_descriptor.d"
|
||||
if (!exclude_imports) {
|
||||
args += [ "--include_imports" ]
|
||||
}
|
||||
args += [
|
||||
"--include_imports",
|
||||
"--descriptor_set_out",
|
||||
rebase_path("$out_dir/$generate_descriptor", root_build_dir),
|
||||
"--dependency_out",
|
||||
|
|
2
deps/v8/gni/protoc.py
vendored
2
deps/v8/gni/protoc.py
vendored
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 the V8 project authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
|
8
deps/v8/gni/snapshot_toolchain.gni
vendored
8
deps/v8/gni/snapshot_toolchain.gni
vendored
|
@ -64,8 +64,7 @@ if (v8_snapshot_toolchain == "") {
|
|||
current_cpu == "arm") {
|
||||
# Trying to compile 32-bit arm on arm64. Good luck!
|
||||
v8_snapshot_toolchain = current_toolchain
|
||||
} else if (host_cpu == "x64" &&
|
||||
(v8_current_cpu == "mips" || v8_current_cpu == "mips64")) {
|
||||
} else if (host_cpu == "x64" && v8_current_cpu == "mips64") {
|
||||
# We don't support snapshot generation for big-endian targets,
|
||||
# therefore snapshots will need to be built using native mksnapshot
|
||||
# in combination with qemu
|
||||
|
@ -96,7 +95,7 @@ if (v8_snapshot_toolchain == "") {
|
|||
} else {
|
||||
_cpus = "x64_v8_${v8_current_cpu}"
|
||||
}
|
||||
} else if (v8_current_cpu == "arm" || v8_current_cpu == "mipsel") {
|
||||
} else if (v8_current_cpu == "arm" || v8_current_cpu == "riscv32") {
|
||||
_cpus = "x86_v8_${v8_current_cpu}"
|
||||
} else {
|
||||
# This branch should not be reached; leave _cpus blank so the assert
|
||||
|
@ -121,7 +120,6 @@ assert(v8_snapshot_toolchain != "",
|
|||
# avoid building v8_libbase on the host more than once. On mips with big endian,
|
||||
# the snapshot toolchain is the target toolchain and, hence, can't be used.
|
||||
v8_generator_toolchain = v8_snapshot_toolchain
|
||||
if (host_cpu == "x64" &&
|
||||
(v8_current_cpu == "mips" || v8_current_cpu == "mips64")) {
|
||||
if (host_cpu == "x64" && v8_current_cpu == "mips64") {
|
||||
v8_generator_toolchain = "//build/toolchain/linux:clang_x64"
|
||||
}
|
||||
|
|
21
deps/v8/gni/v8.cml
vendored
Normal file
21
deps/v8/gni/v8.cml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2022 The V8 project authors
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
{
|
||||
include: [ "syslog/client.shard.cml" ],
|
||||
program: {
|
||||
runner: "elf",
|
||||
binary: "d8",
|
||||
},
|
||||
use: [
|
||||
{
|
||||
protocol: [
|
||||
"fuchsia.kernel.VmexResource",
|
||||
],
|
||||
},
|
||||
{
|
||||
storage: "tmp",
|
||||
path: "/tmp",
|
||||
},
|
||||
],
|
||||
}
|
52
deps/v8/gni/v8.cmx
vendored
52
deps/v8/gni/v8.cmx
vendored
|
@ -1,52 +0,0 @@
|
|||
{
|
||||
"facets": {
|
||||
"fuchsia.test": {
|
||||
"system-services": [
|
||||
"fuchsia.kernel.VmexResource"
|
||||
]
|
||||
}
|
||||
},
|
||||
"sandbox": {
|
||||
"dev": [
|
||||
"null",
|
||||
"zero"
|
||||
],
|
||||
"features": [
|
||||
"deprecated-ambient-replace-as-executable",
|
||||
"isolated-cache-storage",
|
||||
"isolated-persistent-storage",
|
||||
"isolated-temp",
|
||||
"root-ssl-certificates",
|
||||
"vulkan"
|
||||
],
|
||||
"services": [
|
||||
"fuchsia.accessibility.semantics.SemanticsManager",
|
||||
"fuchsia.camera3.DeviceWatcher",
|
||||
"fuchsia.device.NameProvider",
|
||||
"fuchsia.fonts.Provider",
|
||||
"fuchsia.intl.PropertyProvider",
|
||||
"fuchsia.kernel.VmexResource",
|
||||
"fuchsia.logger.Log",
|
||||
"fuchsia.logger.LogSink",
|
||||
"fuchsia.media.Audio",
|
||||
"fuchsia.media.SessionAudioConsumerFactory",
|
||||
"fuchsia.media.drm.Widevine",
|
||||
"fuchsia.mediacodec.CodecFactory",
|
||||
"fuchsia.memorypressure.Provider",
|
||||
"fuchsia.net.NameLookup",
|
||||
"fuchsia.net.interfaces.State",
|
||||
"fuchsia.posix.socket.Provider",
|
||||
"fuchsia.process.Launcher",
|
||||
"fuchsia.sys.Environment",
|
||||
"fuchsia.sys.Launcher",
|
||||
"fuchsia.sys.Loader",
|
||||
"fuchsia.sysmem.Allocator",
|
||||
"fuchsia.ui.input.ImeService",
|
||||
"fuchsia.ui.input.ImeVisibilityService",
|
||||
"fuchsia.ui.scenic.Scenic",
|
||||
"fuchsia.ui.policy.Presenter",
|
||||
"fuchsia.vulkan.loader.Loader",
|
||||
"fuchsia.web.ContextProvider"
|
||||
]
|
||||
}
|
||||
}
|
21
deps/v8/gni/v8.gni
vendored
21
deps/v8/gni/v8.gni
vendored
|
@ -69,6 +69,9 @@ declare_args() {
|
|||
# executed as standard JavaScript instead.
|
||||
v8_enable_webassembly = ""
|
||||
|
||||
# Enable 256-bit long vector re-vectorization pass in WASM compilation pipeline.
|
||||
v8_enable_wasm_simd256_revec = false
|
||||
|
||||
# Enable runtime call stats.
|
||||
v8_enable_runtime_call_stats = !is_on_release_branch
|
||||
|
||||
|
@ -78,6 +81,12 @@ declare_args() {
|
|||
# Scan the call stack conservatively during garbage collection.
|
||||
v8_enable_conservative_stack_scanning = false
|
||||
|
||||
# Use the object start bitmap for inner pointer resolution.
|
||||
v8_enable_inner_pointer_resolution_osb = false
|
||||
|
||||
# Use the marking bitmap for inner pointer resolution.
|
||||
v8_enable_inner_pointer_resolution_mb = false
|
||||
|
||||
v8_enable_google_benchmark = false
|
||||
|
||||
cppgc_is_standalone = false
|
||||
|
@ -88,6 +97,13 @@ declare_args() {
|
|||
# Enable young generation in cppgc.
|
||||
cppgc_enable_young_generation = false
|
||||
|
||||
# Enable pointer compression in cppgc.
|
||||
cppgc_enable_pointer_compression = false
|
||||
|
||||
# Enable 2gb cage for fast compression/decompression. Currently disabled
|
||||
# due to an increased number of OOMs.
|
||||
cppgc_enable_2gb_cage = false
|
||||
|
||||
# Enable advanced BigInt algorithms, costing about 10-30 KB binary size
|
||||
# depending on platform. Disabled on Android to save binary size.
|
||||
v8_advanced_bigint_algorithms = !is_android
|
||||
|
@ -142,7 +158,7 @@ if (is_debug && !v8_optimized_debug) {
|
|||
|
||||
# TODO(crbug.com/621335) Rework this so that we don't have the confusion
|
||||
# between "optimize_speed" and "optimize_max".
|
||||
if (((is_posix && !is_android) || is_fuchsia) && !using_sanitizer) {
|
||||
if (is_posix && !is_android && !using_sanitizer) {
|
||||
v8_add_configs += [ "//build/config/compiler:optimize_speed" ]
|
||||
} else {
|
||||
v8_add_configs += [ "//build/config/compiler:optimize_max" ]
|
||||
|
@ -183,8 +199,7 @@ if ((is_posix || is_fuchsia) &&
|
|||
}
|
||||
|
||||
# On MIPS gcc_target_rpath and ldso_path might be needed for all builds.
|
||||
if (target_cpu == "mipsel" || target_cpu == "mips64el" ||
|
||||
target_cpu == "mips" || target_cpu == "mips64") {
|
||||
if (target_cpu == "mips64el" || target_cpu == "mips64") {
|
||||
v8_add_configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
|
||||
}
|
||||
|
||||
|
|
1
deps/v8/include/cppgc/common.h
vendored
1
deps/v8/include/cppgc/common.h
vendored
|
@ -5,7 +5,6 @@
|
|||
#ifndef INCLUDE_CPPGC_COMMON_H_
|
||||
#define INCLUDE_CPPGC_COMMON_H_
|
||||
|
||||
// TODO(chromium:1056170): Remove dependency on v8.
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
namespace cppgc {
|
||||
|
|
15
deps/v8/include/cppgc/cross-thread-persistent.h
vendored
15
deps/v8/include/cppgc/cross-thread-persistent.h
vendored
|
@ -120,7 +120,7 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||
if (!IsValid(raw)) return;
|
||||
PersistentRegionLock guard;
|
||||
CrossThreadPersistentRegion& region = this->GetPersistentRegion(raw);
|
||||
SetNode(region.AllocateNode(this, &Trace));
|
||||
SetNode(region.AllocateNode(this, &TraceAsRoot));
|
||||
this->CheckPointer(raw);
|
||||
}
|
||||
|
||||
|
@ -138,7 +138,7 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||
: CrossThreadPersistentBase(raw), LocationPolicy(loc) {
|
||||
if (!IsValid(raw)) return;
|
||||
CrossThreadPersistentRegion& region = this->GetPersistentRegion(raw);
|
||||
SetNode(region.AllocateNode(this, &Trace));
|
||||
SetNode(region.AllocateNode(this, &TraceAsRoot));
|
||||
this->CheckPointer(raw);
|
||||
}
|
||||
|
||||
|
@ -349,9 +349,8 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||
return ptr && ptr != kSentinelPointer;
|
||||
}
|
||||
|
||||
static void Trace(Visitor* v, const void* ptr) {
|
||||
const auto* handle = static_cast<const BasicCrossThreadPersistent*>(ptr);
|
||||
v->TraceRoot(*handle, handle->Location());
|
||||
static void TraceAsRoot(RootVisitor& root_visitor, const void* ptr) {
|
||||
root_visitor.Trace(*static_cast<const BasicCrossThreadPersistent*>(ptr));
|
||||
}
|
||||
|
||||
void AssignUnsafe(T* ptr) {
|
||||
|
@ -378,7 +377,7 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||
SetValue(ptr);
|
||||
if (!IsValid(ptr)) return;
|
||||
PersistentRegionLock guard;
|
||||
SetNode(this->GetPersistentRegion(ptr).AllocateNode(this, &Trace));
|
||||
SetNode(this->GetPersistentRegion(ptr).AllocateNode(this, &TraceAsRoot));
|
||||
this->CheckPointer(ptr);
|
||||
}
|
||||
|
||||
|
@ -398,7 +397,7 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||
}
|
||||
SetValue(ptr);
|
||||
if (!IsValid(ptr)) return;
|
||||
SetNode(this->GetPersistentRegion(ptr).AllocateNode(this, &Trace));
|
||||
SetNode(this->GetPersistentRegion(ptr).AllocateNode(this, &TraceAsRoot));
|
||||
this->CheckPointer(ptr);
|
||||
}
|
||||
|
||||
|
@ -416,7 +415,7 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||
return static_cast<T*>(const_cast<void*>(GetValueFromGC()));
|
||||
}
|
||||
|
||||
friend class cppgc::Visitor;
|
||||
friend class internal::RootVisitor;
|
||||
};
|
||||
|
||||
template <typename T, typename LocationPolicy, typename CheckingPolicy>
|
||||
|
|
49
deps/v8/include/cppgc/heap-consistency.h
vendored
49
deps/v8/include/cppgc/heap-consistency.h
vendored
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "cppgc/internal/write-barrier.h"
|
||||
#include "cppgc/macros.h"
|
||||
#include "cppgc/member.h"
|
||||
#include "cppgc/trace-trait.h"
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
|
@ -47,6 +48,29 @@ class HeapConsistency final {
|
|||
return internal::WriteBarrier::GetWriteBarrierType(slot, value, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the required write barrier type for a specific write. This override is
|
||||
* only used for all the BasicMember types.
|
||||
*
|
||||
* \param slot Slot containing the pointer to the object. The slot itself
|
||||
* must reside in an object that has been allocated using
|
||||
* `MakeGarbageCollected()`.
|
||||
* \param value The pointer to the object held via `BasicMember`.
|
||||
* \param params Parameters that may be used for actual write barrier calls.
|
||||
* Only filled if return value indicates that a write barrier is needed. The
|
||||
* contents of the `params` are an implementation detail.
|
||||
* \returns whether a write barrier is needed and which barrier to invoke.
|
||||
*/
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
static V8_INLINE WriteBarrierType GetWriteBarrierType(
|
||||
const internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& value,
|
||||
WriteBarrierParams& params) {
|
||||
return internal::WriteBarrier::GetWriteBarrierType(
|
||||
value.GetRawSlot(), value.GetRawStorage(), params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the required write barrier type for a specific write.
|
||||
*
|
||||
|
@ -146,7 +170,25 @@ class HeapConsistency final {
|
|||
*/
|
||||
static V8_INLINE void GenerationalBarrier(const WriteBarrierParams& params,
|
||||
const void* slot) {
|
||||
internal::WriteBarrier::GenerationalBarrier(params, slot);
|
||||
internal::WriteBarrier::GenerationalBarrier<
|
||||
internal::WriteBarrier::GenerationalBarrierType::kPreciseSlot>(params,
|
||||
slot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generational barrier for maintaining consistency when running with multiple
|
||||
* generations. This version is used when slot contains uncompressed pointer.
|
||||
*
|
||||
* \param params The parameters retrieved from `GetWriteBarrierType()`.
|
||||
* \param slot Uncompressed slot containing the direct pointer to the object.
|
||||
* The slot itself must reside in an object that has been allocated using
|
||||
* `MakeGarbageCollected()`.
|
||||
*/
|
||||
static V8_INLINE void GenerationalBarrierForUncompressedSlot(
|
||||
const WriteBarrierParams& params, const void* uncompressed_slot) {
|
||||
internal::WriteBarrier::GenerationalBarrier<
|
||||
internal::WriteBarrier::GenerationalBarrierType::
|
||||
kPreciseUncompressedSlot>(params, uncompressed_slot);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -158,8 +200,9 @@ class HeapConsistency final {
|
|||
*/
|
||||
static V8_INLINE void GenerationalBarrierForSourceObject(
|
||||
const WriteBarrierParams& params, const void* inner_pointer) {
|
||||
internal::WriteBarrier::GenerationalBarrierForSourceObject(params,
|
||||
inner_pointer);
|
||||
internal::WriteBarrier::GenerationalBarrier<
|
||||
internal::WriteBarrier::GenerationalBarrierType::kImpreciseSlot>(
|
||||
params, inner_pointer);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
41
deps/v8/include/cppgc/heap-handle.h
vendored
Normal file
41
deps/v8/include/cppgc/heap-handle.h
vendored
Normal file
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2022 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef INCLUDE_CPPGC_HEAP_HANDLE_H_
|
||||
#define INCLUDE_CPPGC_HEAP_HANDLE_H_
|
||||
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
namespace cppgc {
|
||||
|
||||
namespace internal {
|
||||
class HeapBase;
|
||||
class WriteBarrierTypeForCagedHeapPolicy;
|
||||
} // namespace internal
|
||||
|
||||
/**
|
||||
* Opaque handle used for additional heap APIs.
|
||||
*/
|
||||
class HeapHandle {
|
||||
private:
|
||||
HeapHandle() = default;
|
||||
|
||||
V8_INLINE bool is_incremental_marking_in_progress() const {
|
||||
return is_incremental_marking_in_progress_;
|
||||
}
|
||||
|
||||
V8_INLINE bool is_young_generation_enabled() const {
|
||||
return is_young_generation_enabled_;
|
||||
}
|
||||
|
||||
bool is_incremental_marking_in_progress_ = false;
|
||||
bool is_young_generation_enabled_ = false;
|
||||
|
||||
friend class internal::HeapBase;
|
||||
friend class internal::WriteBarrierTypeForCagedHeapPolicy;
|
||||
};
|
||||
|
||||
} // namespace cppgc
|
||||
|
||||
#endif // INCLUDE_CPPGC_HEAP_HANDLE_H_
|
4
deps/v8/include/cppgc/heap-statistics.h
vendored
4
deps/v8/include/cppgc/heap-statistics.h
vendored
|
@ -56,7 +56,7 @@ struct HeapStatistics final {
|
|||
/** Amount of memory actually used on the page. */
|
||||
size_t used_size_bytes = 0;
|
||||
/** Statistics for object allocated on the page. Filled only when
|
||||
* NameProvider::HideInternalNames() is false. */
|
||||
* NameProvider::SupportsCppClassNamesAsObjectNames() is true. */
|
||||
std::vector<ObjectStatsEntry> object_statistics;
|
||||
};
|
||||
|
||||
|
@ -98,7 +98,7 @@ struct HeapStatistics final {
|
|||
|
||||
/** Overall committed amount of memory for the heap. */
|
||||
size_t committed_size_bytes = 0;
|
||||
/** Resident amount of memory help by the heap. */
|
||||
/** Resident amount of memory held by the heap. */
|
||||
size_t resident_size_bytes = 0;
|
||||
/** Amount of memory actually used on the heap. */
|
||||
size_t used_size_bytes = 0;
|
||||
|
|
10
deps/v8/include/cppgc/heap.h
vendored
10
deps/v8/include/cppgc/heap.h
vendored
|
@ -21,6 +21,7 @@
|
|||
namespace cppgc {
|
||||
|
||||
class AllocationHandle;
|
||||
class HeapHandle;
|
||||
|
||||
/**
|
||||
* Implementation details of cppgc. Those details are considered internal and
|
||||
|
@ -31,11 +32,6 @@ namespace internal {
|
|||
class Heap;
|
||||
} // namespace internal
|
||||
|
||||
/**
|
||||
* Used for additional heap APIs.
|
||||
*/
|
||||
class HeapHandle;
|
||||
|
||||
class V8_EXPORT Heap {
|
||||
public:
|
||||
/**
|
||||
|
@ -59,7 +55,7 @@ class V8_EXPORT Heap {
|
|||
};
|
||||
|
||||
/**
|
||||
* Specifies supported marking types
|
||||
* Specifies supported marking types.
|
||||
*/
|
||||
enum class MarkingType : uint8_t {
|
||||
/**
|
||||
|
@ -79,7 +75,7 @@ class V8_EXPORT Heap {
|
|||
};
|
||||
|
||||
/**
|
||||
* Specifies supported sweeping types
|
||||
* Specifies supported sweeping types.
|
||||
*/
|
||||
enum class SweepingType : uint8_t {
|
||||
/**
|
||||
|
|
12
deps/v8/include/cppgc/internal/api-constants.h
vendored
12
deps/v8/include/cppgc/internal/api-constants.h
vendored
|
@ -32,12 +32,22 @@ static constexpr uint16_t kFullyConstructedBitMask = uint16_t{1};
|
|||
|
||||
static constexpr size_t kPageSize = size_t{1} << 17;
|
||||
|
||||
#if defined(V8_TARGET_ARCH_ARM64) && defined(V8_OS_MACOS)
|
||||
constexpr size_t kGuardPageSize = 0;
|
||||
#else
|
||||
constexpr size_t kGuardPageSize = 4096;
|
||||
#endif
|
||||
|
||||
static constexpr size_t kLargeObjectSizeThreshold = kPageSize / 2;
|
||||
|
||||
#if defined(CPPGC_CAGED_HEAP)
|
||||
#if defined(CPPGC_2GB_CAGE)
|
||||
constexpr size_t kCagedHeapReservationSize = static_cast<size_t>(2) * kGB;
|
||||
#else // !defined(CPPGC_2GB_CAGE)
|
||||
constexpr size_t kCagedHeapReservationSize = static_cast<size_t>(4) * kGB;
|
||||
#endif // !defined(CPPGC_2GB_CAGE)
|
||||
constexpr size_t kCagedHeapReservationAlignment = kCagedHeapReservationSize;
|
||||
#endif
|
||||
#endif // defined(CPPGC_CAGED_HEAP)
|
||||
|
||||
static constexpr size_t kDefaultAlignment = sizeof(void*);
|
||||
|
||||
|
|
45
deps/v8/include/cppgc/internal/base-page-handle.h
vendored
Normal file
45
deps/v8/include/cppgc/internal/base-page-handle.h
vendored
Normal file
|
@ -0,0 +1,45 @@
|
|||
// Copyright 2022 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef INCLUDE_CPPGC_INTERNAL_BASE_PAGE_HANDLE_H_
|
||||
#define INCLUDE_CPPGC_INTERNAL_BASE_PAGE_HANDLE_H_
|
||||
|
||||
#include "cppgc/heap-handle.h"
|
||||
#include "cppgc/internal/api-constants.h"
|
||||
#include "cppgc/internal/logging.h"
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
namespace cppgc {
|
||||
namespace internal {
|
||||
|
||||
// The class is needed in the header to allow for fast access to HeapHandle in
|
||||
// the write barrier.
|
||||
class BasePageHandle {
|
||||
public:
|
||||
static V8_INLINE BasePageHandle* FromPayload(void* payload) {
|
||||
return reinterpret_cast<BasePageHandle*>(
|
||||
(reinterpret_cast<uintptr_t>(payload) &
|
||||
~(api_constants::kPageSize - 1)) +
|
||||
api_constants::kGuardPageSize);
|
||||
}
|
||||
static V8_INLINE const BasePageHandle* FromPayload(const void* payload) {
|
||||
return FromPayload(const_cast<void*>(payload));
|
||||
}
|
||||
|
||||
HeapHandle& heap_handle() { return heap_handle_; }
|
||||
const HeapHandle& heap_handle() const { return heap_handle_; }
|
||||
|
||||
protected:
|
||||
explicit BasePageHandle(HeapHandle& heap_handle) : heap_handle_(heap_handle) {
|
||||
CPPGC_DCHECK(reinterpret_cast<uintptr_t>(this) % api_constants::kPageSize ==
|
||||
api_constants::kGuardPageSize);
|
||||
}
|
||||
|
||||
HeapHandle& heap_handle_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace cppgc
|
||||
|
||||
#endif // INCLUDE_CPPGC_INTERNAL_BASE_PAGE_HANDLE_H_
|
|
@ -10,46 +10,76 @@
|
|||
#include <cstdint>
|
||||
|
||||
#include "cppgc/internal/api-constants.h"
|
||||
#include "cppgc/internal/caged-heap.h"
|
||||
#include "cppgc/internal/logging.h"
|
||||
#include "cppgc/platform.h"
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
#if __cpp_lib_bitopts
|
||||
#include <bit>
|
||||
#endif // __cpp_lib_bitopts
|
||||
|
||||
#if defined(CPPGC_CAGED_HEAP)
|
||||
|
||||
namespace cppgc {
|
||||
namespace internal {
|
||||
|
||||
class HeapBase;
|
||||
class HeapBaseHandle;
|
||||
|
||||
#if defined(CPPGC_YOUNG_GENERATION)
|
||||
|
||||
// AgeTable is the bytemap needed for the fast generation check in the write
|
||||
// barrier. AgeTable contains entries that correspond to 512 bytes memory
|
||||
// barrier. AgeTable contains entries that correspond to 4096 bytes memory
|
||||
// regions (cards). Each entry in the table represents generation of the objects
|
||||
// that reside on the corresponding card (young, old or mixed).
|
||||
class AgeTable final {
|
||||
class V8_EXPORT AgeTable final {
|
||||
static constexpr size_t kRequiredSize = 1 * api_constants::kMB;
|
||||
static constexpr size_t kAllocationGranularity =
|
||||
api_constants::kAllocationGranularity;
|
||||
|
||||
public:
|
||||
// Represents age of the objects living on a single card.
|
||||
enum class Age : uint8_t { kOld, kYoung, kMixed };
|
||||
// When setting age for a range, consider or ignore ages of the adjacent
|
||||
// cards.
|
||||
enum class AdjacentCardsPolicy : uint8_t { kConsider, kIgnore };
|
||||
|
||||
static constexpr size_t kCardSizeInBytes =
|
||||
(api_constants::kCagedHeapReservationSize / kAllocationGranularity) /
|
||||
kRequiredSize;
|
||||
api_constants::kCagedHeapReservationSize / kRequiredSize;
|
||||
|
||||
void SetAge(uintptr_t cage_offset, Age age) {
|
||||
table_[card(cage_offset)] = age;
|
||||
}
|
||||
|
||||
V8_INLINE Age GetAge(uintptr_t cage_offset) const {
|
||||
return table_[card(cage_offset)];
|
||||
}
|
||||
|
||||
void Reset(PageAllocator* allocator);
|
||||
void SetAgeForRange(uintptr_t cage_offset_begin, uintptr_t cage_offset_end,
|
||||
Age age, AdjacentCardsPolicy adjacent_cards_policy);
|
||||
|
||||
Age GetAgeForRange(uintptr_t cage_offset_begin,
|
||||
uintptr_t cage_offset_end) const;
|
||||
|
||||
void ResetForTesting();
|
||||
|
||||
private:
|
||||
V8_INLINE size_t card(uintptr_t offset) const {
|
||||
constexpr size_t kGranularityBits =
|
||||
#if __cpp_lib_bitopts
|
||||
std::countr_zero(static_cast<uint32_t>(kCardSizeInBytes));
|
||||
#elif V8_HAS_BUILTIN_CTZ
|
||||
__builtin_ctz(static_cast<uint32_t>(kCardSizeInBytes));
|
||||
#else //! V8_HAS_BUILTIN_CTZ
|
||||
// Hardcode and check with assert.
|
||||
#if defined(CPPGC_2GB_CAGE)
|
||||
11;
|
||||
#else // !defined(CPPGC_2GB_CAGE)
|
||||
12;
|
||||
#endif // !defined(CPPGC_2GB_CAGE)
|
||||
#endif // !V8_HAS_BUILTIN_CTZ
|
||||
static_assert((1 << kGranularityBits) == kCardSizeInBytes);
|
||||
const size_t entry = offset >> kGranularityBits;
|
||||
CPPGC_DCHECK(table_.size() > entry);
|
||||
return entry;
|
||||
|
@ -64,10 +94,10 @@ static_assert(sizeof(AgeTable) == 1 * api_constants::kMB,
|
|||
#endif // CPPGC_YOUNG_GENERATION
|
||||
|
||||
struct CagedHeapLocalData final {
|
||||
CagedHeapLocalData(HeapBase&, PageAllocator&);
|
||||
V8_INLINE static CagedHeapLocalData& Get() {
|
||||
return *reinterpret_cast<CagedHeapLocalData*>(CagedHeapBase::GetBase());
|
||||
}
|
||||
|
||||
bool is_incremental_marking_in_progress = false;
|
||||
HeapBase& heap_base;
|
||||
#if defined(CPPGC_YOUNG_GENERATION)
|
||||
AgeTable age_table;
|
||||
#endif
|
||||
|
@ -76,4 +106,6 @@ struct CagedHeapLocalData final {
|
|||
} // namespace internal
|
||||
} // namespace cppgc
|
||||
|
||||
#endif // defined(CPPGC_CAGED_HEAP)
|
||||
|
||||
#endif // INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_
|
||||
|
|
61
deps/v8/include/cppgc/internal/caged-heap.h
vendored
Normal file
61
deps/v8/include/cppgc/internal/caged-heap.h
vendored
Normal file
|
@ -0,0 +1,61 @@
|
|||
// Copyright 2022 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_H_
|
||||
#define INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_H_
|
||||
|
||||
#include <climits>
|
||||
#include <cstddef>
|
||||
|
||||
#include "cppgc/internal/api-constants.h"
|
||||
#include "cppgc/internal/base-page-handle.h"
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
#if defined(CPPGC_CAGED_HEAP)
|
||||
|
||||
namespace cppgc {
|
||||
namespace internal {
|
||||
|
||||
class V8_EXPORT CagedHeapBase {
|
||||
public:
|
||||
V8_INLINE static uintptr_t OffsetFromAddress(const void* address) {
|
||||
return reinterpret_cast<uintptr_t>(address) &
|
||||
(api_constants::kCagedHeapReservationAlignment - 1);
|
||||
}
|
||||
|
||||
V8_INLINE static bool IsWithinCage(const void* address) {
|
||||
CPPGC_DCHECK(g_heap_base_);
|
||||
return (reinterpret_cast<uintptr_t>(address) &
|
||||
~(api_constants::kCagedHeapReservationAlignment - 1)) ==
|
||||
g_heap_base_;
|
||||
}
|
||||
|
||||
V8_INLINE static bool AreWithinCage(const void* addr1, const void* addr2) {
|
||||
#if defined(CPPGC_2GB_CAGE)
|
||||
static constexpr size_t kHalfWordShift = sizeof(uint32_t) * CHAR_BIT - 1;
|
||||
#else //! defined(CPPGC_2GB_CAGE)
|
||||
static constexpr size_t kHalfWordShift = sizeof(uint32_t) * CHAR_BIT;
|
||||
#endif //! defined(CPPGC_2GB_CAGE)
|
||||
static_assert((static_cast<size_t>(1) << kHalfWordShift) ==
|
||||
api_constants::kCagedHeapReservationSize);
|
||||
CPPGC_DCHECK(g_heap_base_);
|
||||
return !(((reinterpret_cast<uintptr_t>(addr1) ^ g_heap_base_) |
|
||||
(reinterpret_cast<uintptr_t>(addr2) ^ g_heap_base_)) >>
|
||||
kHalfWordShift);
|
||||
}
|
||||
|
||||
V8_INLINE static uintptr_t GetBase() { return g_heap_base_; }
|
||||
|
||||
private:
|
||||
friend class CagedHeap;
|
||||
|
||||
static uintptr_t g_heap_base_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace cppgc
|
||||
|
||||
#endif // defined(CPPGC_CAGED_HEAP)
|
||||
|
||||
#endif // INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_H_
|
1
deps/v8/include/cppgc/internal/gc-info.h
vendored
1
deps/v8/include/cppgc/internal/gc-info.h
vendored
|
@ -48,7 +48,6 @@ struct V8_EXPORT EnsureGCInfoIndexTrait final {
|
|||
static GCInfoIndex EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&,
|
||||
TraceCallback,
|
||||
FinalizationCallback,
|
||||
|
||||
NameCallback);
|
||||
static GCInfoIndex EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&,
|
||||
TraceCallback,
|
||||
|
|
236
deps/v8/include/cppgc/internal/member-storage.h
vendored
Normal file
236
deps/v8/include/cppgc/internal/member-storage.h
vendored
Normal file
|
@ -0,0 +1,236 @@
|
|||
// Copyright 2022 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef INCLUDE_CPPGC_INTERNAL_MEMBER_STORAGE_H_
|
||||
#define INCLUDE_CPPGC_INTERNAL_MEMBER_STORAGE_H_
|
||||
|
||||
#include <atomic>
|
||||
#include <cstddef>
|
||||
#include <type_traits>
|
||||
|
||||
#include "cppgc/internal/api-constants.h"
|
||||
#include "cppgc/internal/logging.h"
|
||||
#include "cppgc/sentinel-pointer.h"
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
namespace cppgc {
|
||||
namespace internal {
|
||||
|
||||
#if defined(CPPGC_POINTER_COMPRESSION)
|
||||
|
||||
#if defined(__clang__)
|
||||
// Attribute const allows the compiler to assume that CageBaseGlobal::g_base_
|
||||
// doesn't change (e.g. across calls) and thereby avoid redundant loads.
|
||||
#define CPPGC_CONST __attribute__((const))
|
||||
#define CPPGC_REQUIRE_CONSTANT_INIT \
|
||||
__attribute__((require_constant_initialization))
|
||||
#else // defined(__clang__)
|
||||
#define CPPGC_CONST
|
||||
#define CPPGC_REQUIRE_CONSTANT_INIT
|
||||
#endif // defined(__clang__)
|
||||
|
||||
class CageBaseGlobal final {
|
||||
public:
|
||||
V8_INLINE CPPGC_CONST static uintptr_t Get() {
|
||||
CPPGC_DCHECK(IsBaseConsistent());
|
||||
return g_base_;
|
||||
}
|
||||
|
||||
V8_INLINE CPPGC_CONST static bool IsSet() {
|
||||
CPPGC_DCHECK(IsBaseConsistent());
|
||||
return (g_base_ & ~kLowerHalfWordMask) != 0;
|
||||
}
|
||||
|
||||
private:
|
||||
// We keep the lower halfword as ones to speed up decompression.
|
||||
static constexpr uintptr_t kLowerHalfWordMask =
|
||||
(api_constants::kCagedHeapReservationAlignment - 1);
|
||||
|
||||
static V8_EXPORT uintptr_t g_base_ CPPGC_REQUIRE_CONSTANT_INIT;
|
||||
|
||||
CageBaseGlobal() = delete;
|
||||
|
||||
V8_INLINE static bool IsBaseConsistent() {
|
||||
return kLowerHalfWordMask == (g_base_ & kLowerHalfWordMask);
|
||||
}
|
||||
|
||||
friend class CageBaseGlobalUpdater;
|
||||
};
|
||||
|
||||
#undef CPPGC_REQUIRE_CONSTANT_INIT
|
||||
#undef CPPGC_CONST
|
||||
|
||||
class CompressedPointer final {
|
||||
public:
|
||||
using IntegralType = uint32_t;
|
||||
|
||||
V8_INLINE CompressedPointer() : value_(0u) {}
|
||||
V8_INLINE explicit CompressedPointer(const void* ptr)
|
||||
: value_(Compress(ptr)) {}
|
||||
V8_INLINE explicit CompressedPointer(std::nullptr_t) : value_(0u) {}
|
||||
V8_INLINE explicit CompressedPointer(SentinelPointer)
|
||||
: value_(kCompressedSentinel) {}
|
||||
|
||||
V8_INLINE const void* Load() const { return Decompress(value_); }
|
||||
V8_INLINE const void* LoadAtomic() const {
|
||||
return Decompress(
|
||||
reinterpret_cast<const std::atomic<IntegralType>&>(value_).load(
|
||||
std::memory_order_relaxed));
|
||||
}
|
||||
|
||||
V8_INLINE void Store(const void* ptr) { value_ = Compress(ptr); }
|
||||
V8_INLINE void StoreAtomic(const void* value) {
|
||||
reinterpret_cast<std::atomic<IntegralType>&>(value_).store(
|
||||
Compress(value), std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
V8_INLINE void Clear() { value_ = 0u; }
|
||||
V8_INLINE bool IsCleared() const { return !value_; }
|
||||
|
||||
V8_INLINE bool IsSentinel() const { return value_ == kCompressedSentinel; }
|
||||
|
||||
V8_INLINE uint32_t GetAsInteger() const { return value_; }
|
||||
|
||||
V8_INLINE friend bool operator==(CompressedPointer a, CompressedPointer b) {
|
||||
return a.value_ == b.value_;
|
||||
}
|
||||
V8_INLINE friend bool operator!=(CompressedPointer a, CompressedPointer b) {
|
||||
return a.value_ != b.value_;
|
||||
}
|
||||
V8_INLINE friend bool operator<(CompressedPointer a, CompressedPointer b) {
|
||||
return a.value_ < b.value_;
|
||||
}
|
||||
V8_INLINE friend bool operator<=(CompressedPointer a, CompressedPointer b) {
|
||||
return a.value_ <= b.value_;
|
||||
}
|
||||
V8_INLINE friend bool operator>(CompressedPointer a, CompressedPointer b) {
|
||||
return a.value_ > b.value_;
|
||||
}
|
||||
V8_INLINE friend bool operator>=(CompressedPointer a, CompressedPointer b) {
|
||||
return a.value_ >= b.value_;
|
||||
}
|
||||
|
||||
static V8_INLINE IntegralType Compress(const void* ptr) {
|
||||
static_assert(
|
||||
SentinelPointer::kSentinelValue == 0b10,
|
||||
"The compression scheme relies on the sentinel encoded as 0b10");
|
||||
static constexpr size_t kGigaCageMask =
|
||||
~(api_constants::kCagedHeapReservationAlignment - 1);
|
||||
|
||||
CPPGC_DCHECK(CageBaseGlobal::IsSet());
|
||||
const uintptr_t base = CageBaseGlobal::Get();
|
||||
CPPGC_DCHECK(!ptr || ptr == kSentinelPointer ||
|
||||
(base & kGigaCageMask) ==
|
||||
(reinterpret_cast<uintptr_t>(ptr) & kGigaCageMask));
|
||||
|
||||
#if defined(CPPGC_2GB_CAGE)
|
||||
// Truncate the pointer.
|
||||
auto compressed =
|
||||
static_cast<IntegralType>(reinterpret_cast<uintptr_t>(ptr));
|
||||
#else // !defined(CPPGC_2GB_CAGE)
|
||||
const auto uptr = reinterpret_cast<uintptr_t>(ptr);
|
||||
// Shift the pointer by one and truncate.
|
||||
auto compressed = static_cast<IntegralType>(uptr >> 1);
|
||||
#endif // !defined(CPPGC_2GB_CAGE)
|
||||
// Normal compressed pointers must have the MSB set.
|
||||
CPPGC_DCHECK((!compressed || compressed == kCompressedSentinel) ||
|
||||
(compressed & (1 << 31)));
|
||||
return compressed;
|
||||
}
|
||||
|
||||
static V8_INLINE void* Decompress(IntegralType ptr) {
|
||||
CPPGC_DCHECK(CageBaseGlobal::IsSet());
|
||||
const uintptr_t base = CageBaseGlobal::Get();
|
||||
// Treat compressed pointer as signed and cast it to uint64_t, which will
|
||||
// sign-extend it.
|
||||
#if defined(CPPGC_2GB_CAGE)
|
||||
const uint64_t mask = static_cast<uint64_t>(static_cast<int32_t>(ptr));
|
||||
#else // !defined(CPPGC_2GB_CAGE)
|
||||
// Then, shift the result by one. It's important to shift the unsigned
|
||||
// value, as otherwise it would result in undefined behavior.
|
||||
const uint64_t mask = static_cast<uint64_t>(static_cast<int32_t>(ptr)) << 1;
|
||||
#endif // !defined(CPPGC_2GB_CAGE)
|
||||
return reinterpret_cast<void*>(mask & base);
|
||||
}
|
||||
|
||||
private:
|
||||
#if defined(CPPGC_2GB_CAGE)
|
||||
static constexpr IntegralType kCompressedSentinel =
|
||||
SentinelPointer::kSentinelValue;
|
||||
#else // !defined(CPPGC_2GB_CAGE)
|
||||
static constexpr IntegralType kCompressedSentinel =
|
||||
SentinelPointer::kSentinelValue >> 1;
|
||||
#endif // !defined(CPPGC_2GB_CAGE)
|
||||
// All constructors initialize `value_`. Do not add a default value here as it
|
||||
// results in a non-atomic write on some builds, even when the atomic version
|
||||
// of the constructor is used.
|
||||
IntegralType value_;
|
||||
};
|
||||
|
||||
#endif // defined(CPPGC_POINTER_COMPRESSION)
|
||||
|
||||
class RawPointer final {
|
||||
public:
|
||||
using IntegralType = uintptr_t;
|
||||
|
||||
V8_INLINE RawPointer() : ptr_(nullptr) {}
|
||||
V8_INLINE explicit RawPointer(const void* ptr) : ptr_(ptr) {}
|
||||
|
||||
V8_INLINE const void* Load() const { return ptr_; }
|
||||
V8_INLINE const void* LoadAtomic() const {
|
||||
return reinterpret_cast<const std::atomic<const void*>&>(ptr_).load(
|
||||
std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
V8_INLINE void Store(const void* ptr) { ptr_ = ptr; }
|
||||
V8_INLINE void StoreAtomic(const void* ptr) {
|
||||
reinterpret_cast<std::atomic<const void*>&>(ptr_).store(
|
||||
ptr, std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
V8_INLINE void Clear() { ptr_ = nullptr; }
|
||||
V8_INLINE bool IsCleared() const { return !ptr_; }
|
||||
|
||||
V8_INLINE bool IsSentinel() const { return ptr_ == kSentinelPointer; }
|
||||
|
||||
V8_INLINE uintptr_t GetAsInteger() const {
|
||||
return reinterpret_cast<uintptr_t>(ptr_);
|
||||
}
|
||||
|
||||
V8_INLINE friend bool operator==(RawPointer a, RawPointer b) {
|
||||
return a.ptr_ == b.ptr_;
|
||||
}
|
||||
V8_INLINE friend bool operator!=(RawPointer a, RawPointer b) {
|
||||
return a.ptr_ != b.ptr_;
|
||||
}
|
||||
V8_INLINE friend bool operator<(RawPointer a, RawPointer b) {
|
||||
return a.ptr_ < b.ptr_;
|
||||
}
|
||||
V8_INLINE friend bool operator<=(RawPointer a, RawPointer b) {
|
||||
return a.ptr_ <= b.ptr_;
|
||||
}
|
||||
V8_INLINE friend bool operator>(RawPointer a, RawPointer b) {
|
||||
return a.ptr_ > b.ptr_;
|
||||
}
|
||||
V8_INLINE friend bool operator>=(RawPointer a, RawPointer b) {
|
||||
return a.ptr_ >= b.ptr_;
|
||||
}
|
||||
|
||||
private:
|
||||
// All constructors initialize `ptr_`. Do not add a default value here as it
|
||||
// results in a non-atomic write on some builds, even when the atomic version
|
||||
// of the constructor is used.
|
||||
const void* ptr_;
|
||||
};
|
||||
|
||||
#if defined(CPPGC_POINTER_COMPRESSION)
|
||||
using MemberStorage = CompressedPointer;
|
||||
#else // !defined(CPPGC_POINTER_COMPRESSION)
|
||||
using MemberStorage = RawPointer;
|
||||
#endif // !defined(CPPGC_POINTER_COMPRESSION)
|
||||
|
||||
} // namespace internal
|
||||
} // namespace cppgc
|
||||
|
||||
#endif // INCLUDE_CPPGC_INTERNAL_MEMBER_STORAGE_H_
|
27
deps/v8/include/cppgc/internal/name-trait.h
vendored
27
deps/v8/include/cppgc/internal/name-trait.h
vendored
|
@ -6,6 +6,7 @@
|
|||
#define INCLUDE_CPPGC_INTERNAL_NAME_TRAIT_H_
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <type_traits>
|
||||
|
||||
#include "cppgc/name-provider.h"
|
||||
|
@ -58,6 +59,11 @@ struct HeapObjectName {
|
|||
bool name_was_hidden;
|
||||
};
|
||||
|
||||
enum class HeapObjectNameForUnnamedObject : uint8_t {
|
||||
kUseClassNameIfSupported,
|
||||
kUseHiddenName,
|
||||
};
|
||||
|
||||
class V8_EXPORT NameTraitBase {
|
||||
protected:
|
||||
static HeapObjectName GetNameFromTypeSignature(const char*);
|
||||
|
@ -78,16 +84,24 @@ class NameTrait final : public NameTraitBase {
|
|||
#endif // !CPPGC_SUPPORTS_OBJECT_NAMES
|
||||
}
|
||||
|
||||
static HeapObjectName GetName(const void* obj) {
|
||||
return GetNameFor(static_cast<const T*>(obj));
|
||||
static HeapObjectName GetName(
|
||||
const void* obj, HeapObjectNameForUnnamedObject name_retrieval_mode) {
|
||||
return GetNameFor(static_cast<const T*>(obj), name_retrieval_mode);
|
||||
}
|
||||
|
||||
private:
|
||||
static HeapObjectName GetNameFor(const NameProvider* name_provider) {
|
||||
static HeapObjectName GetNameFor(const NameProvider* name_provider,
|
||||
HeapObjectNameForUnnamedObject) {
|
||||
// Objects inheriting from `NameProvider` are not considered unnamed as
|
||||
// users already provided a name for them.
|
||||
return {name_provider->GetHumanReadableName(), false};
|
||||
}
|
||||
|
||||
static HeapObjectName GetNameFor(...) {
|
||||
static HeapObjectName GetNameFor(
|
||||
const void*, HeapObjectNameForUnnamedObject name_retrieval_mode) {
|
||||
if (name_retrieval_mode == HeapObjectNameForUnnamedObject::kUseHiddenName)
|
||||
return {NameProvider::kHiddenName, true};
|
||||
|
||||
#if CPPGC_SUPPORTS_COMPILE_TIME_TYPENAME
|
||||
return {GetTypename<T>(), false};
|
||||
#elif CPPGC_SUPPORTS_OBJECT_NAMES
|
||||
|
@ -102,7 +116,7 @@ class NameTrait final : public NameTraitBase {
|
|||
|
||||
static const HeapObjectName leaky_name =
|
||||
GetNameFromTypeSignature(PRETTY_FUNCTION_VALUE);
|
||||
return {leaky_name, false};
|
||||
return leaky_name;
|
||||
|
||||
#undef PRETTY_FUNCTION_VALUE
|
||||
|
||||
|
@ -112,7 +126,8 @@ class NameTrait final : public NameTraitBase {
|
|||
}
|
||||
};
|
||||
|
||||
using NameCallback = HeapObjectName (*)(const void*);
|
||||
using NameCallback = HeapObjectName (*)(const void*,
|
||||
HeapObjectNameForUnnamedObject);
|
||||
|
||||
} // namespace internal
|
||||
} // namespace cppgc
|
||||
|
|
24
deps/v8/include/cppgc/internal/persistent-node.h
vendored
24
deps/v8/include/cppgc/internal/persistent-node.h
vendored
|
@ -14,13 +14,11 @@
|
|||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
namespace cppgc {
|
||||
|
||||
class Visitor;
|
||||
|
||||
namespace internal {
|
||||
|
||||
class CrossThreadPersistentRegion;
|
||||
class FatalOutOfMemoryHandler;
|
||||
class RootVisitor;
|
||||
|
||||
// PersistentNode represents a variant of two states:
|
||||
// 1) traceable node with a back pointer to the Persistent object;
|
||||
|
@ -32,7 +30,7 @@ class PersistentNode final {
|
|||
PersistentNode(const PersistentNode&) = delete;
|
||||
PersistentNode& operator=(const PersistentNode&) = delete;
|
||||
|
||||
void InitializeAsUsedNode(void* owner, TraceCallback trace) {
|
||||
void InitializeAsUsedNode(void* owner, TraceRootCallback trace) {
|
||||
CPPGC_DCHECK(trace);
|
||||
owner_ = owner;
|
||||
trace_ = trace;
|
||||
|
@ -53,9 +51,9 @@ class PersistentNode final {
|
|||
return next_;
|
||||
}
|
||||
|
||||
void Trace(Visitor* visitor) const {
|
||||
void Trace(RootVisitor& root_visitor) const {
|
||||
CPPGC_DCHECK(IsUsed());
|
||||
trace_(visitor, owner_);
|
||||
trace_(root_visitor, owner_);
|
||||
}
|
||||
|
||||
bool IsUsed() const { return trace_; }
|
||||
|
@ -73,7 +71,7 @@ class PersistentNode final {
|
|||
void* owner_ = nullptr;
|
||||
PersistentNode* next_;
|
||||
};
|
||||
TraceCallback trace_ = nullptr;
|
||||
TraceRootCallback trace_ = nullptr;
|
||||
};
|
||||
|
||||
class V8_EXPORT PersistentRegionBase {
|
||||
|
@ -86,7 +84,7 @@ class V8_EXPORT PersistentRegionBase {
|
|||
PersistentRegionBase(const PersistentRegionBase&) = delete;
|
||||
PersistentRegionBase& operator=(const PersistentRegionBase&) = delete;
|
||||
|
||||
void Trace(Visitor*);
|
||||
void Iterate(RootVisitor&);
|
||||
|
||||
size_t NodesInUse() const;
|
||||
|
||||
|
@ -96,7 +94,7 @@ class V8_EXPORT PersistentRegionBase {
|
|||
explicit PersistentRegionBase(const FatalOutOfMemoryHandler& oom_handler);
|
||||
|
||||
PersistentNode* TryAllocateNodeFromFreeList(void* owner,
|
||||
TraceCallback trace) {
|
||||
TraceRootCallback trace) {
|
||||
PersistentNode* node = nullptr;
|
||||
if (V8_LIKELY(free_list_head_)) {
|
||||
node = free_list_head_;
|
||||
|
@ -118,7 +116,7 @@ class V8_EXPORT PersistentRegionBase {
|
|||
}
|
||||
|
||||
PersistentNode* RefillFreeListAndAllocateNode(void* owner,
|
||||
TraceCallback trace);
|
||||
TraceRootCallback trace);
|
||||
|
||||
private:
|
||||
template <typename PersistentBaseClass>
|
||||
|
@ -145,7 +143,7 @@ class V8_EXPORT PersistentRegion final : public PersistentRegionBase {
|
|||
PersistentRegion(const PersistentRegion&) = delete;
|
||||
PersistentRegion& operator=(const PersistentRegion&) = delete;
|
||||
|
||||
V8_INLINE PersistentNode* AllocateNode(void* owner, TraceCallback trace) {
|
||||
V8_INLINE PersistentNode* AllocateNode(void* owner, TraceRootCallback trace) {
|
||||
CPPGC_DCHECK(IsCreationThread());
|
||||
auto* node = TryAllocateNodeFromFreeList(owner, trace);
|
||||
if (V8_LIKELY(node)) return node;
|
||||
|
@ -189,7 +187,7 @@ class V8_EXPORT CrossThreadPersistentRegion final
|
|||
CrossThreadPersistentRegion& operator=(const CrossThreadPersistentRegion&) =
|
||||
delete;
|
||||
|
||||
V8_INLINE PersistentNode* AllocateNode(void* owner, TraceCallback trace) {
|
||||
V8_INLINE PersistentNode* AllocateNode(void* owner, TraceRootCallback trace) {
|
||||
PersistentRegionLock::AssertLocked();
|
||||
auto* node = TryAllocateNodeFromFreeList(owner, trace);
|
||||
if (V8_LIKELY(node)) return node;
|
||||
|
@ -202,7 +200,7 @@ class V8_EXPORT CrossThreadPersistentRegion final
|
|||
PersistentRegionBase::FreeNode(node);
|
||||
}
|
||||
|
||||
void Trace(Visitor*);
|
||||
void Iterate(RootVisitor&);
|
||||
|
||||
size_t NodesInUse() const;
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <cstdint>
|
||||
#include <type_traits>
|
||||
|
||||
#include "cppgc/internal/member-storage.h"
|
||||
#include "cppgc/internal/write-barrier.h"
|
||||
#include "cppgc/sentinel-pointer.h"
|
||||
#include "cppgc/source-location.h"
|
||||
|
@ -27,15 +28,34 @@ class WeakMemberTag;
|
|||
class UntracedMemberTag;
|
||||
|
||||
struct DijkstraWriteBarrierPolicy {
|
||||
static void InitializingBarrier(const void*, const void*) {
|
||||
V8_INLINE static void InitializingBarrier(const void*, const void*) {
|
||||
// Since in initializing writes the source object is always white, having no
|
||||
// barrier doesn't break the tri-color invariant.
|
||||
}
|
||||
static void AssigningBarrier(const void* slot, const void* value) {
|
||||
|
||||
V8_INLINE static void AssigningBarrier(const void* slot, const void* value) {
|
||||
WriteBarrier::Params params;
|
||||
switch (WriteBarrier::GetWriteBarrierType(slot, value, params)) {
|
||||
const WriteBarrier::Type type =
|
||||
WriteBarrier::GetWriteBarrierType(slot, value, params);
|
||||
WriteBarrier(type, params, slot, value);
|
||||
}
|
||||
|
||||
V8_INLINE static void AssigningBarrier(const void* slot,
|
||||
MemberStorage storage) {
|
||||
WriteBarrier::Params params;
|
||||
const WriteBarrier::Type type =
|
||||
WriteBarrier::GetWriteBarrierType(slot, storage, params);
|
||||
WriteBarrier(type, params, slot, storage.Load());
|
||||
}
|
||||
|
||||
private:
|
||||
V8_INLINE static void WriteBarrier(WriteBarrier::Type type,
|
||||
const WriteBarrier::Params& params,
|
||||
const void* slot, const void* value) {
|
||||
switch (type) {
|
||||
case WriteBarrier::Type::kGenerational:
|
||||
WriteBarrier::GenerationalBarrier(params, slot);
|
||||
WriteBarrier::GenerationalBarrier<
|
||||
WriteBarrier::GenerationalBarrierType::kPreciseSlot>(params, slot);
|
||||
break;
|
||||
case WriteBarrier::Type::kMarking:
|
||||
WriteBarrier::DijkstraMarkingBarrier(params, value);
|
||||
|
@ -47,8 +67,9 @@ struct DijkstraWriteBarrierPolicy {
|
|||
};
|
||||
|
||||
struct NoWriteBarrierPolicy {
|
||||
static void InitializingBarrier(const void*, const void*) {}
|
||||
static void AssigningBarrier(const void*, const void*) {}
|
||||
V8_INLINE static void InitializingBarrier(const void*, const void*) {}
|
||||
V8_INLINE static void AssigningBarrier(const void*, const void*) {}
|
||||
V8_INLINE static void AssigningBarrier(const void*, MemberStorage) {}
|
||||
};
|
||||
|
||||
class V8_EXPORT SameThreadEnabledCheckingPolicyBase {
|
||||
|
@ -89,7 +110,7 @@ class V8_EXPORT SameThreadEnabledCheckingPolicy
|
|||
|
||||
class DisabledCheckingPolicy {
|
||||
protected:
|
||||
void CheckPointer(const void*) {}
|
||||
V8_INLINE void CheckPointer(const void*) {}
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
|
|
226
deps/v8/include/cppgc/internal/write-barrier.h
vendored
226
deps/v8/include/cppgc/internal/write-barrier.h
vendored
|
@ -8,9 +8,11 @@
|
|||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
#include "cppgc/heap-handle.h"
|
||||
#include "cppgc/heap-state.h"
|
||||
#include "cppgc/internal/api-constants.h"
|
||||
#include "cppgc/internal/atomic-entry-flag.h"
|
||||
#include "cppgc/internal/member-storage.h"
|
||||
#include "cppgc/platform.h"
|
||||
#include "cppgc/sentinel-pointer.h"
|
||||
#include "cppgc/trace-trait.h"
|
||||
|
@ -18,6 +20,7 @@
|
|||
|
||||
#if defined(CPPGC_CAGED_HEAP)
|
||||
#include "cppgc/internal/caged-heap-local-data.h"
|
||||
#include "cppgc/internal/caged-heap.h"
|
||||
#endif
|
||||
|
||||
namespace cppgc {
|
||||
|
@ -40,16 +43,18 @@ class V8_EXPORT WriteBarrier final {
|
|||
kGenerational,
|
||||
};
|
||||
|
||||
enum class GenerationalBarrierType : uint8_t {
|
||||
kPreciseSlot,
|
||||
kPreciseUncompressedSlot,
|
||||
kImpreciseSlot,
|
||||
};
|
||||
|
||||
struct Params {
|
||||
HeapHandle* heap = nullptr;
|
||||
#if V8_ENABLE_CHECKS
|
||||
Type type = Type::kNone;
|
||||
#endif // !V8_ENABLE_CHECKS
|
||||
#if defined(CPPGC_CAGED_HEAP)
|
||||
uintptr_t start = 0;
|
||||
CagedHeapLocalData& caged_heap() const {
|
||||
return *reinterpret_cast<CagedHeapLocalData*>(start);
|
||||
}
|
||||
uintptr_t slot_offset = 0;
|
||||
uintptr_t value_offset = 0;
|
||||
#endif // CPPGC_CAGED_HEAP
|
||||
|
@ -63,6 +68,9 @@ class V8_EXPORT WriteBarrier final {
|
|||
// Returns the required write barrier for a given `slot` and `value`.
|
||||
static V8_INLINE Type GetWriteBarrierType(const void* slot, const void* value,
|
||||
Params& params);
|
||||
// Returns the required write barrier for a given `slot` and `value`.
|
||||
static V8_INLINE Type GetWriteBarrierType(const void* slot, MemberStorage,
|
||||
Params& params);
|
||||
// Returns the required write barrier for a given `slot`.
|
||||
template <typename HeapHandleCallback>
|
||||
static V8_INLINE Type GetWriteBarrierType(const void* slot, Params& params,
|
||||
|
@ -78,15 +86,13 @@ class V8_EXPORT WriteBarrier final {
|
|||
static V8_INLINE void SteeleMarkingBarrier(const Params& params,
|
||||
const void* object);
|
||||
#if defined(CPPGC_YOUNG_GENERATION)
|
||||
template <GenerationalBarrierType>
|
||||
static V8_INLINE void GenerationalBarrier(const Params& params,
|
||||
const void* slot);
|
||||
static V8_INLINE void GenerationalBarrierForSourceObject(
|
||||
const Params& params, const void* inner_pointer);
|
||||
#else // !CPPGC_YOUNG_GENERATION
|
||||
template <GenerationalBarrierType>
|
||||
static V8_INLINE void GenerationalBarrier(const Params& params,
|
||||
const void* slot) {}
|
||||
static V8_INLINE void GenerationalBarrierForSourceObject(
|
||||
const Params& params, const void* inner_pointer) {}
|
||||
const void* slot){}
|
||||
#endif // CPPGC_YOUNG_GENERATION
|
||||
|
||||
#if V8_ENABLE_CHECKS
|
||||
|
@ -95,12 +101,10 @@ class V8_EXPORT WriteBarrier final {
|
|||
static void CheckParams(Type expected_type, const Params& params) {}
|
||||
#endif // !V8_ENABLE_CHECKS
|
||||
|
||||
// The IncrementalOrConcurrentUpdater class allows cppgc internal to update
|
||||
// |incremental_or_concurrent_marking_flag_|.
|
||||
class IncrementalOrConcurrentMarkingFlagUpdater;
|
||||
static bool IsAnyIncrementalOrConcurrentMarking() {
|
||||
return incremental_or_concurrent_marking_flag_.MightBeEntered();
|
||||
}
|
||||
// The FlagUpdater class allows cppgc internal to update
|
||||
// |write_barrier_enabled_|.
|
||||
class FlagUpdater;
|
||||
static bool IsEnabled() { return write_barrier_enabled_.MightBeEntered(); }
|
||||
|
||||
private:
|
||||
WriteBarrier() = delete;
|
||||
|
@ -125,17 +129,23 @@ class V8_EXPORT WriteBarrier final {
|
|||
static CagedHeapLocalData& GetLocalData(HeapHandle&);
|
||||
static void GenerationalBarrierSlow(const CagedHeapLocalData& local_data,
|
||||
const AgeTable& age_table,
|
||||
const void* slot, uintptr_t value_offset);
|
||||
const void* slot, uintptr_t value_offset,
|
||||
HeapHandle* heap_handle);
|
||||
static void GenerationalBarrierForUncompressedSlotSlow(
|
||||
const CagedHeapLocalData& local_data, const AgeTable& age_table,
|
||||
const void* slot, uintptr_t value_offset, HeapHandle* heap_handle);
|
||||
static void GenerationalBarrierForSourceObjectSlow(
|
||||
const CagedHeapLocalData& local_data, const void* object);
|
||||
const CagedHeapLocalData& local_data, const void* object,
|
||||
HeapHandle* heap_handle);
|
||||
#endif // CPPGC_YOUNG_GENERATION
|
||||
|
||||
static AtomicEntryFlag incremental_or_concurrent_marking_flag_;
|
||||
static AtomicEntryFlag write_barrier_enabled_;
|
||||
};
|
||||
|
||||
template <WriteBarrier::Type type>
|
||||
V8_INLINE WriteBarrier::Type SetAndReturnType(WriteBarrier::Params& params) {
|
||||
if (type == WriteBarrier::Type::kNone) return WriteBarrier::Type::kNone;
|
||||
if constexpr (type == WriteBarrier::Type::kNone)
|
||||
return WriteBarrier::Type::kNone;
|
||||
#if V8_ENABLE_CHECKS
|
||||
params.type = type;
|
||||
#endif // !V8_ENABLE_CHECKS
|
||||
|
@ -152,6 +162,13 @@ class V8_EXPORT WriteBarrierTypeForCagedHeapPolicy final {
|
|||
return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
|
||||
}
|
||||
|
||||
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
|
||||
static V8_INLINE WriteBarrier::Type Get(const void* slot, MemberStorage value,
|
||||
WriteBarrier::Params& params,
|
||||
HeapHandleCallback callback) {
|
||||
return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
|
||||
}
|
||||
|
||||
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
|
||||
static V8_INLINE WriteBarrier::Type Get(const void* value,
|
||||
WriteBarrier::Params& params,
|
||||
|
@ -166,69 +183,77 @@ class V8_EXPORT WriteBarrierTypeForCagedHeapPolicy final {
|
|||
static V8_INLINE WriteBarrier::Type GetNoSlot(const void* value,
|
||||
WriteBarrier::Params& params,
|
||||
HeapHandleCallback) {
|
||||
if (!TryGetCagedHeap(value, value, params)) {
|
||||
return WriteBarrier::Type::kNone;
|
||||
}
|
||||
if (V8_UNLIKELY(params.caged_heap().is_incremental_marking_in_progress)) {
|
||||
const bool within_cage = CagedHeapBase::IsWithinCage(value);
|
||||
if (!within_cage) return WriteBarrier::Type::kNone;
|
||||
|
||||
// We know that |value| points either within the normal page or to the
|
||||
// beginning of large-page, so extract the page header by bitmasking.
|
||||
BasePageHandle* page =
|
||||
BasePageHandle::FromPayload(const_cast<void*>(value));
|
||||
|
||||
HeapHandle& heap_handle = page->heap_handle();
|
||||
if (V8_UNLIKELY(heap_handle.is_incremental_marking_in_progress())) {
|
||||
return SetAndReturnType<WriteBarrier::Type::kMarking>(params);
|
||||
}
|
||||
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
}
|
||||
|
||||
template <WriteBarrier::ValueMode value_mode>
|
||||
struct ValueModeDispatch;
|
||||
|
||||
static V8_INLINE bool TryGetCagedHeap(const void* slot, const void* value,
|
||||
WriteBarrier::Params& params) {
|
||||
// TODO(chromium:1056170): Check if the null check can be folded in with
|
||||
// the rest of the write barrier.
|
||||
if (!value) return false;
|
||||
params.start = reinterpret_cast<uintptr_t>(value) &
|
||||
~(api_constants::kCagedHeapReservationAlignment - 1);
|
||||
const uintptr_t slot_offset =
|
||||
reinterpret_cast<uintptr_t>(slot) - params.start;
|
||||
if (slot_offset > api_constants::kCagedHeapReservationSize) {
|
||||
// Check if slot is on stack or value is sentinel or nullptr. This relies
|
||||
// on the fact that kSentinelPointer is encoded as 0x1.
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Returns whether marking is in progress. If marking is not in progress
|
||||
// sets the start of the cage accordingly.
|
||||
//
|
||||
// TODO(chromium:1056170): Create fast path on API.
|
||||
static bool IsMarking(const HeapHandle&, WriteBarrier::Params&);
|
||||
};
|
||||
|
||||
template <>
|
||||
struct WriteBarrierTypeForCagedHeapPolicy::ValueModeDispatch<
|
||||
WriteBarrier::ValueMode::kValuePresent> {
|
||||
template <typename HeapHandleCallback>
|
||||
static V8_INLINE WriteBarrier::Type Get(const void* slot,
|
||||
MemberStorage storage,
|
||||
WriteBarrier::Params& params,
|
||||
HeapHandleCallback) {
|
||||
if (V8_LIKELY(!WriteBarrier::IsEnabled()))
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
|
||||
return BarrierEnabledGet(slot, storage.Load(), params);
|
||||
}
|
||||
|
||||
template <typename HeapHandleCallback>
|
||||
static V8_INLINE WriteBarrier::Type Get(const void* slot, const void* value,
|
||||
WriteBarrier::Params& params,
|
||||
HeapHandleCallback) {
|
||||
#if !defined(CPPGC_YOUNG_GENERATION)
|
||||
if (V8_LIKELY(!WriteBarrier::IsAnyIncrementalOrConcurrentMarking())) {
|
||||
if (V8_LIKELY(!WriteBarrier::IsEnabled()))
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
}
|
||||
#endif // !CPPGC_YOUNG_GENERATION
|
||||
bool within_cage = TryGetCagedHeap(slot, value, params);
|
||||
if (!within_cage) {
|
||||
return WriteBarrier::Type::kNone;
|
||||
}
|
||||
if (V8_LIKELY(!params.caged_heap().is_incremental_marking_in_progress)) {
|
||||
|
||||
return BarrierEnabledGet(slot, value, params);
|
||||
}
|
||||
|
||||
private:
|
||||
static V8_INLINE WriteBarrier::Type BarrierEnabledGet(
|
||||
const void* slot, const void* value, WriteBarrier::Params& params) {
|
||||
const bool within_cage = CagedHeapBase::AreWithinCage(slot, value);
|
||||
if (!within_cage) return WriteBarrier::Type::kNone;
|
||||
|
||||
// We know that |value| points either within the normal page or to the
|
||||
// beginning of large-page, so extract the page header by bitmasking.
|
||||
BasePageHandle* page =
|
||||
BasePageHandle::FromPayload(const_cast<void*>(value));
|
||||
|
||||
HeapHandle& heap_handle = page->heap_handle();
|
||||
if (V8_LIKELY(!heap_handle.is_incremental_marking_in_progress())) {
|
||||
#if defined(CPPGC_YOUNG_GENERATION)
|
||||
params.heap = reinterpret_cast<HeapHandle*>(params.start);
|
||||
params.slot_offset = reinterpret_cast<uintptr_t>(slot) - params.start;
|
||||
params.value_offset = reinterpret_cast<uintptr_t>(value) - params.start;
|
||||
if (!heap_handle.is_young_generation_enabled())
|
||||
return WriteBarrier::Type::kNone;
|
||||
params.heap = &heap_handle;
|
||||
params.slot_offset = CagedHeapBase::OffsetFromAddress(slot);
|
||||
params.value_offset = CagedHeapBase::OffsetFromAddress(value);
|
||||
return SetAndReturnType<WriteBarrier::Type::kGenerational>(params);
|
||||
#else // !CPPGC_YOUNG_GENERATION
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
#endif // !CPPGC_YOUNG_GENERATION
|
||||
}
|
||||
params.heap = reinterpret_cast<HeapHandle*>(params.start);
|
||||
|
||||
// Use marking barrier.
|
||||
params.heap = &heap_handle;
|
||||
return SetAndReturnType<WriteBarrier::Type::kMarking>(params);
|
||||
}
|
||||
};
|
||||
|
@ -240,28 +265,28 @@ struct WriteBarrierTypeForCagedHeapPolicy::ValueModeDispatch<
|
|||
static V8_INLINE WriteBarrier::Type Get(const void* slot, const void*,
|
||||
WriteBarrier::Params& params,
|
||||
HeapHandleCallback callback) {
|
||||
#if defined(CPPGC_YOUNG_GENERATION)
|
||||
if (V8_LIKELY(!WriteBarrier::IsEnabled()))
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
|
||||
HeapHandle& handle = callback();
|
||||
if (V8_LIKELY(!IsMarking(handle, params))) {
|
||||
// params.start is populated by IsMarking().
|
||||
#if defined(CPPGC_YOUNG_GENERATION)
|
||||
if (V8_LIKELY(!handle.is_incremental_marking_in_progress())) {
|
||||
if (!handle.is_young_generation_enabled()) {
|
||||
return WriteBarrier::Type::kNone;
|
||||
}
|
||||
params.heap = &handle;
|
||||
params.slot_offset = reinterpret_cast<uintptr_t>(slot) - params.start;
|
||||
// params.value_offset stays 0.
|
||||
if (params.slot_offset > api_constants::kCagedHeapReservationSize) {
|
||||
// Check if slot is on stack.
|
||||
// Check if slot is on stack.
|
||||
if (V8_UNLIKELY(!CagedHeapBase::IsWithinCage(slot))) {
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
}
|
||||
params.slot_offset = CagedHeapBase::OffsetFromAddress(slot);
|
||||
return SetAndReturnType<WriteBarrier::Type::kGenerational>(params);
|
||||
}
|
||||
#else // !CPPGC_YOUNG_GENERATION
|
||||
if (V8_LIKELY(!WriteBarrier::IsAnyIncrementalOrConcurrentMarking())) {
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
}
|
||||
HeapHandle& handle = callback();
|
||||
#else // !defined(CPPGC_YOUNG_GENERATION)
|
||||
if (V8_UNLIKELY(!subtle::HeapState::IsMarking(handle))) {
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
}
|
||||
#endif // !CPPGC_YOUNG_GENERATION
|
||||
#endif // !defined(CPPGC_YOUNG_GENERATION)
|
||||
params.heap = &handle;
|
||||
return SetAndReturnType<WriteBarrier::Type::kMarking>(params);
|
||||
}
|
||||
|
@ -278,6 +303,16 @@ class V8_EXPORT WriteBarrierTypeForNonCagedHeapPolicy final {
|
|||
return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
|
||||
}
|
||||
|
||||
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
|
||||
static V8_INLINE WriteBarrier::Type Get(const void* slot, MemberStorage value,
|
||||
WriteBarrier::Params& params,
|
||||
HeapHandleCallback callback) {
|
||||
// `MemberStorage` will always be `RawPointer` for non-caged heap builds.
|
||||
// Just convert to `void*` in this case.
|
||||
return ValueModeDispatch<value_mode>::Get(slot, value.Load(), params,
|
||||
callback);
|
||||
}
|
||||
|
||||
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
|
||||
static V8_INLINE WriteBarrier::Type Get(const void* value,
|
||||
WriteBarrier::Params& params,
|
||||
|
@ -310,7 +345,7 @@ struct WriteBarrierTypeForNonCagedHeapPolicy::ValueModeDispatch<
|
|||
if (object <= static_cast<void*>(kSentinelPointer)) {
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
}
|
||||
if (V8_LIKELY(!WriteBarrier::IsAnyIncrementalOrConcurrentMarking())) {
|
||||
if (V8_LIKELY(!WriteBarrier::IsEnabled())) {
|
||||
return SetAndReturnType<WriteBarrier::Type::kNone>(params);
|
||||
}
|
||||
if (IsMarking(object, ¶ms.heap)) {
|
||||
|
@ -327,7 +362,7 @@ struct WriteBarrierTypeForNonCagedHeapPolicy::ValueModeDispatch<
|
|||
static V8_INLINE WriteBarrier::Type Get(const void*, const void*,
|
||||
WriteBarrier::Params& params,
|
||||
HeapHandleCallback callback) {
|
||||
if (V8_UNLIKELY(WriteBarrier::IsAnyIncrementalOrConcurrentMarking())) {
|
||||
if (V8_UNLIKELY(WriteBarrier::IsEnabled())) {
|
||||
HeapHandle& handle = callback();
|
||||
if (IsMarking(handle)) {
|
||||
params.heap = &handle;
|
||||
|
@ -345,6 +380,13 @@ WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
|
|||
params, []() {});
|
||||
}
|
||||
|
||||
// static
|
||||
WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
|
||||
const void* slot, MemberStorage value, WriteBarrier::Params& params) {
|
||||
return WriteBarrierTypePolicy::Get<ValueMode::kValuePresent>(slot, value,
|
||||
params, []() {});
|
||||
}
|
||||
|
||||
// static
|
||||
template <typename HeapHandleCallback>
|
||||
WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
|
||||
|
@ -397,34 +439,32 @@ void WriteBarrier::SteeleMarkingBarrier(const Params& params,
|
|||
}
|
||||
|
||||
#if defined(CPPGC_YOUNG_GENERATION)
|
||||
|
||||
// static
|
||||
template <WriteBarrier::GenerationalBarrierType type>
|
||||
void WriteBarrier::GenerationalBarrier(const Params& params, const void* slot) {
|
||||
CheckParams(Type::kGenerational, params);
|
||||
|
||||
const CagedHeapLocalData& local_data = params.caged_heap();
|
||||
const CagedHeapLocalData& local_data = CagedHeapLocalData::Get();
|
||||
const AgeTable& age_table = local_data.age_table;
|
||||
|
||||
// Bail out if the slot is in young generation.
|
||||
// Bail out if the slot (precise or imprecise) is in young generation.
|
||||
if (V8_LIKELY(age_table.GetAge(params.slot_offset) == AgeTable::Age::kYoung))
|
||||
return;
|
||||
|
||||
GenerationalBarrierSlow(local_data, age_table, slot, params.value_offset);
|
||||
}
|
||||
|
||||
// static
|
||||
void WriteBarrier::GenerationalBarrierForSourceObject(
|
||||
const Params& params, const void* inner_pointer) {
|
||||
CheckParams(Type::kGenerational, params);
|
||||
|
||||
const CagedHeapLocalData& local_data = params.caged_heap();
|
||||
const AgeTable& age_table = local_data.age_table;
|
||||
|
||||
// Assume that if the first element is in young generation, the whole range is
|
||||
// in young generation.
|
||||
if (V8_LIKELY(age_table.GetAge(params.slot_offset) == AgeTable::Age::kYoung))
|
||||
return;
|
||||
|
||||
GenerationalBarrierForSourceObjectSlow(local_data, inner_pointer);
|
||||
// Dispatch between different types of barriers.
|
||||
// TODO(chromium:1029379): Consider reload local_data in the slow path to
|
||||
// reduce register pressure.
|
||||
if constexpr (type == GenerationalBarrierType::kPreciseSlot) {
|
||||
GenerationalBarrierSlow(local_data, age_table, slot, params.value_offset,
|
||||
params.heap);
|
||||
} else if constexpr (type ==
|
||||
GenerationalBarrierType::kPreciseUncompressedSlot) {
|
||||
GenerationalBarrierForUncompressedSlotSlow(
|
||||
local_data, age_table, slot, params.value_offset, params.heap);
|
||||
} else {
|
||||
GenerationalBarrierForSourceObjectSlow(local_data, slot, params.heap);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // !CPPGC_YOUNG_GENERATION
|
||||
|
|
15
deps/v8/include/cppgc/liveness-broker.h
vendored
15
deps/v8/include/cppgc/liveness-broker.h
vendored
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include "cppgc/heap.h"
|
||||
#include "cppgc/member.h"
|
||||
#include "cppgc/sentinel-pointer.h"
|
||||
#include "cppgc/trace-trait.h"
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
|
@ -44,24 +45,24 @@ class V8_EXPORT LivenessBroker final {
|
|||
public:
|
||||
template <typename T>
|
||||
bool IsHeapObjectAlive(const T* object) const {
|
||||
// nullptr objects are considered alive to allow weakness to be used from
|
||||
// - nullptr objects are considered alive to allow weakness to be used from
|
||||
// stack while running into a conservative GC. Treating nullptr as dead
|
||||
// would mean that e.g. custom collectins could not be strongified on stack.
|
||||
return !object ||
|
||||
// would mean that e.g. custom collections could not be strongified on
|
||||
// stack.
|
||||
// - Sentinel pointers are also preserved in weakness and not cleared.
|
||||
return !object || object == kSentinelPointer ||
|
||||
IsHeapObjectAliveImpl(
|
||||
TraceTrait<T>::GetTraceDescriptor(object).base_object_payload);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool IsHeapObjectAlive(const WeakMember<T>& weak_member) const {
|
||||
return (weak_member != kSentinelPointer) &&
|
||||
IsHeapObjectAlive<T>(weak_member.Get());
|
||||
return IsHeapObjectAlive<T>(weak_member.Get());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool IsHeapObjectAlive(const UntracedMember<T>& untraced_member) const {
|
||||
return (untraced_member != kSentinelPointer) &&
|
||||
IsHeapObjectAlive<T>(untraced_member.Get());
|
||||
return IsHeapObjectAlive<T>(untraced_member.Get());
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
452
deps/v8/include/cppgc/member.h
vendored
452
deps/v8/include/cppgc/member.h
vendored
|
@ -9,6 +9,8 @@
|
|||
#include <cstddef>
|
||||
#include <type_traits>
|
||||
|
||||
#include "cppgc/internal/api-constants.h"
|
||||
#include "cppgc/internal/member-storage.h"
|
||||
#include "cppgc/internal/pointer-policies.h"
|
||||
#include "cppgc/sentinel-pointer.h"
|
||||
#include "cppgc/type-traits.h"
|
||||
|
@ -16,6 +18,10 @@
|
|||
|
||||
namespace cppgc {
|
||||
|
||||
namespace subtle {
|
||||
class HeapConsistency;
|
||||
} // namespace subtle
|
||||
|
||||
class Visitor;
|
||||
|
||||
namespace internal {
|
||||
|
@ -23,33 +29,46 @@ namespace internal {
|
|||
// MemberBase always refers to the object as const object and defers to
|
||||
// BasicMember on casting to the right type as needed.
|
||||
class MemberBase {
|
||||
public:
|
||||
#if defined(CPPGC_POINTER_COMPRESSION)
|
||||
using RawStorage = CompressedPointer;
|
||||
#else // !defined(CPPGC_POINTER_COMPRESSION)
|
||||
using RawStorage = RawPointer;
|
||||
#endif // !defined(CPPGC_POINTER_COMPRESSION)
|
||||
protected:
|
||||
struct AtomicInitializerTag {};
|
||||
|
||||
MemberBase() : raw_(nullptr) {}
|
||||
explicit MemberBase(const void* value) : raw_(value) {}
|
||||
MemberBase(const void* value, AtomicInitializerTag) { SetRawAtomic(value); }
|
||||
|
||||
const void** GetRawSlot() const { return &raw_; }
|
||||
const void* GetRaw() const { return raw_; }
|
||||
void SetRaw(void* value) { raw_ = value; }
|
||||
|
||||
const void* GetRawAtomic() const {
|
||||
return reinterpret_cast<const std::atomic<const void*>*>(&raw_)->load(
|
||||
std::memory_order_relaxed);
|
||||
}
|
||||
void SetRawAtomic(const void* value) {
|
||||
reinterpret_cast<std::atomic<const void*>*>(&raw_)->store(
|
||||
value, std::memory_order_relaxed);
|
||||
V8_INLINE MemberBase() = default;
|
||||
V8_INLINE explicit MemberBase(const void* value) : raw_(value) {}
|
||||
V8_INLINE MemberBase(const void* value, AtomicInitializerTag) {
|
||||
SetRawAtomic(value);
|
||||
}
|
||||
|
||||
void ClearFromGC() const { raw_ = nullptr; }
|
||||
V8_INLINE explicit MemberBase(RawStorage raw) : raw_(raw) {}
|
||||
V8_INLINE explicit MemberBase(std::nullptr_t) : raw_(nullptr) {}
|
||||
V8_INLINE explicit MemberBase(SentinelPointer s) : raw_(s) {}
|
||||
|
||||
V8_INLINE const void** GetRawSlot() const {
|
||||
return reinterpret_cast<const void**>(const_cast<MemberBase*>(this));
|
||||
}
|
||||
V8_INLINE const void* GetRaw() const { return raw_.Load(); }
|
||||
V8_INLINE void SetRaw(void* value) { raw_.Store(value); }
|
||||
|
||||
V8_INLINE const void* GetRawAtomic() const { return raw_.LoadAtomic(); }
|
||||
V8_INLINE void SetRawAtomic(const void* value) { raw_.StoreAtomic(value); }
|
||||
|
||||
V8_INLINE RawStorage GetRawStorage() const { return raw_; }
|
||||
V8_INLINE void SetRawStorageAtomic(RawStorage other) {
|
||||
reinterpret_cast<std::atomic<RawStorage>&>(raw_).store(
|
||||
other, std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
V8_INLINE bool IsCleared() const { return raw_.IsCleared(); }
|
||||
|
||||
V8_INLINE void ClearFromGC() const { raw_.Clear(); }
|
||||
|
||||
private:
|
||||
// All constructors initialize `raw_`. Do not add a default value here as it
|
||||
// results in a non-atomic write on some builds, even when the atomic version
|
||||
// of the constructor is used.
|
||||
mutable const void* raw_;
|
||||
mutable RawStorage raw_;
|
||||
};
|
||||
|
||||
// The basic class from which all Member classes are 'generated'.
|
||||
|
@ -59,134 +78,184 @@ class BasicMember final : private MemberBase, private CheckingPolicy {
|
|||
public:
|
||||
using PointeeType = T;
|
||||
|
||||
constexpr BasicMember() = default;
|
||||
constexpr BasicMember(std::nullptr_t) {} // NOLINT
|
||||
BasicMember(SentinelPointer s) : MemberBase(s) {} // NOLINT
|
||||
BasicMember(T* raw) : MemberBase(raw) { // NOLINT
|
||||
InitializingWriteBarrier();
|
||||
V8_INLINE constexpr BasicMember() = default;
|
||||
V8_INLINE constexpr BasicMember(std::nullptr_t) {} // NOLINT
|
||||
V8_INLINE BasicMember(SentinelPointer s) : MemberBase(s) {} // NOLINT
|
||||
V8_INLINE BasicMember(T* raw) : MemberBase(raw) { // NOLINT
|
||||
InitializingWriteBarrier(raw);
|
||||
this->CheckPointer(Get());
|
||||
}
|
||||
BasicMember(T& raw) : BasicMember(&raw) {} // NOLINT
|
||||
V8_INLINE BasicMember(T& raw) // NOLINT
|
||||
: BasicMember(&raw) {}
|
||||
|
||||
// Atomic ctor. Using the AtomicInitializerTag forces BasicMember to
|
||||
// initialize using atomic assignments. This is required for preventing
|
||||
// data races with concurrent marking.
|
||||
using AtomicInitializerTag = MemberBase::AtomicInitializerTag;
|
||||
BasicMember(std::nullptr_t, AtomicInitializerTag atomic)
|
||||
V8_INLINE BasicMember(std::nullptr_t, AtomicInitializerTag atomic)
|
||||
: MemberBase(nullptr, atomic) {}
|
||||
BasicMember(SentinelPointer s, AtomicInitializerTag atomic)
|
||||
V8_INLINE BasicMember(SentinelPointer s, AtomicInitializerTag atomic)
|
||||
: MemberBase(s, atomic) {}
|
||||
BasicMember(T* raw, AtomicInitializerTag atomic) : MemberBase(raw, atomic) {
|
||||
InitializingWriteBarrier();
|
||||
V8_INLINE BasicMember(T* raw, AtomicInitializerTag atomic)
|
||||
: MemberBase(raw, atomic) {
|
||||
InitializingWriteBarrier(raw);
|
||||
this->CheckPointer(Get());
|
||||
}
|
||||
BasicMember(T& raw, AtomicInitializerTag atomic)
|
||||
V8_INLINE BasicMember(T& raw, AtomicInitializerTag atomic)
|
||||
: BasicMember(&raw, atomic) {}
|
||||
|
||||
// Copy ctor.
|
||||
BasicMember(const BasicMember& other) : BasicMember(other.Get()) {}
|
||||
// Allow heterogeneous construction.
|
||||
V8_INLINE BasicMember(const BasicMember& other)
|
||||
: BasicMember(other.GetRawStorage()) {}
|
||||
|
||||
// Heterogeneous copy constructors. When the source pointer have a different
|
||||
// type, perform a compress-decompress round, because the source pointer may
|
||||
// need to be adjusted.
|
||||
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
||||
typename OtherCheckingPolicy,
|
||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||
BasicMember( // NOLINT
|
||||
std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
|
||||
V8_INLINE BasicMember( // NOLINT
|
||||
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>& other)
|
||||
: BasicMember(other.GetRawStorage()) {}
|
||||
|
||||
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
||||
typename OtherCheckingPolicy,
|
||||
std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
|
||||
V8_INLINE BasicMember( // NOLINT
|
||||
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>& other)
|
||||
: BasicMember(other.Get()) {}
|
||||
|
||||
// Move ctor.
|
||||
BasicMember(BasicMember&& other) noexcept : BasicMember(other.Get()) {
|
||||
V8_INLINE BasicMember(BasicMember&& other) noexcept
|
||||
: BasicMember(other.GetRawStorage()) {
|
||||
other.Clear();
|
||||
}
|
||||
// Allow heterogeneous move construction.
|
||||
|
||||
// Heterogeneous move constructors. When the source pointer have a different
|
||||
// type, perform a compress-decompress round, because the source pointer may
|
||||
// need to be adjusted.
|
||||
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
||||
typename OtherCheckingPolicy,
|
||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||
BasicMember(BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>&& other) noexcept
|
||||
std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
|
||||
V8_INLINE BasicMember(BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>&& other) noexcept
|
||||
: BasicMember(other.GetRawStorage()) {
|
||||
other.Clear();
|
||||
}
|
||||
|
||||
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
||||
typename OtherCheckingPolicy,
|
||||
std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
|
||||
V8_INLINE BasicMember(BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>&& other) noexcept
|
||||
: BasicMember(other.Get()) {
|
||||
other.Clear();
|
||||
}
|
||||
|
||||
// Construction from Persistent.
|
||||
template <typename U, typename PersistentWeaknessPolicy,
|
||||
typename PersistentLocationPolicy,
|
||||
typename PersistentCheckingPolicy,
|
||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||
BasicMember(const BasicPersistent<U, PersistentWeaknessPolicy,
|
||||
PersistentLocationPolicy,
|
||||
PersistentCheckingPolicy>& p)
|
||||
V8_INLINE BasicMember(const BasicPersistent<U, PersistentWeaknessPolicy,
|
||||
PersistentLocationPolicy,
|
||||
PersistentCheckingPolicy>& p)
|
||||
: BasicMember(p.Get()) {}
|
||||
|
||||
// Copy assignment.
|
||||
BasicMember& operator=(const BasicMember& other) {
|
||||
return operator=(other.Get());
|
||||
V8_INLINE BasicMember& operator=(const BasicMember& other) {
|
||||
return operator=(other.GetRawStorage());
|
||||
}
|
||||
// Allow heterogeneous copy assignment.
|
||||
|
||||
// Heterogeneous copy assignment. When the source pointer have a different
|
||||
// type, perform a compress-decompress round, because the source pointer may
|
||||
// need to be adjusted.
|
||||
template <typename U, typename OtherWeaknessTag, typename OtherBarrierPolicy,
|
||||
typename OtherCheckingPolicy,
|
||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||
BasicMember& operator=(
|
||||
typename OtherCheckingPolicy>
|
||||
V8_INLINE BasicMember& operator=(
|
||||
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>& other) {
|
||||
return operator=(other.Get());
|
||||
if constexpr (internal::IsDecayedSameV<T, U>) {
|
||||
return operator=(other.GetRawStorage());
|
||||
} else {
|
||||
static_assert(internal::IsStrictlyBaseOfV<T, U>);
|
||||
return operator=(other.Get());
|
||||
}
|
||||
}
|
||||
|
||||
// Move assignment.
|
||||
BasicMember& operator=(BasicMember&& other) noexcept {
|
||||
operator=(other.Get());
|
||||
V8_INLINE BasicMember& operator=(BasicMember&& other) noexcept {
|
||||
operator=(other.GetRawStorage());
|
||||
other.Clear();
|
||||
return *this;
|
||||
}
|
||||
// Heterogeneous move assignment.
|
||||
|
||||
// Heterogeneous move assignment. When the source pointer have a different
|
||||
// type, perform a compress-decompress round, because the source pointer may
|
||||
// need to be adjusted.
|
||||
template <typename U, typename OtherWeaknessTag, typename OtherBarrierPolicy,
|
||||
typename OtherCheckingPolicy,
|
||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||
BasicMember& operator=(BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>&& other) noexcept {
|
||||
operator=(other.Get());
|
||||
typename OtherCheckingPolicy>
|
||||
V8_INLINE BasicMember& operator=(
|
||||
BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>&& other) noexcept {
|
||||
if constexpr (internal::IsDecayedSameV<T, U>) {
|
||||
operator=(other.GetRawStorage());
|
||||
} else {
|
||||
static_assert(internal::IsStrictlyBaseOfV<T, U>);
|
||||
operator=(other.Get());
|
||||
}
|
||||
other.Clear();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Assignment from Persistent.
|
||||
template <typename U, typename PersistentWeaknessPolicy,
|
||||
typename PersistentLocationPolicy,
|
||||
typename PersistentCheckingPolicy,
|
||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||
BasicMember& operator=(
|
||||
V8_INLINE BasicMember& operator=(
|
||||
const BasicPersistent<U, PersistentWeaknessPolicy,
|
||||
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
||||
other) {
|
||||
return operator=(other.Get());
|
||||
}
|
||||
BasicMember& operator=(T* other) {
|
||||
|
||||
V8_INLINE BasicMember& operator=(T* other) {
|
||||
SetRawAtomic(other);
|
||||
AssigningWriteBarrier();
|
||||
AssigningWriteBarrier(other);
|
||||
this->CheckPointer(Get());
|
||||
return *this;
|
||||
}
|
||||
BasicMember& operator=(std::nullptr_t) {
|
||||
|
||||
V8_INLINE BasicMember& operator=(std::nullptr_t) {
|
||||
Clear();
|
||||
return *this;
|
||||
}
|
||||
BasicMember& operator=(SentinelPointer s) {
|
||||
V8_INLINE BasicMember& operator=(SentinelPointer s) {
|
||||
SetRawAtomic(s);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename OtherWeaknessTag, typename OtherBarrierPolicy,
|
||||
typename OtherCheckingPolicy>
|
||||
void Swap(BasicMember<T, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>& other) {
|
||||
T* tmp = Get();
|
||||
V8_INLINE void Swap(BasicMember<T, OtherWeaknessTag, OtherBarrierPolicy,
|
||||
OtherCheckingPolicy>& other) {
|
||||
auto tmp = GetRawStorage();
|
||||
*this = other;
|
||||
other = tmp;
|
||||
}
|
||||
|
||||
explicit operator bool() const { return Get(); }
|
||||
operator T*() const { return Get(); }
|
||||
T* operator->() const { return Get(); }
|
||||
T& operator*() const { return *Get(); }
|
||||
V8_INLINE explicit operator bool() const { return !IsCleared(); }
|
||||
V8_INLINE operator T*() const { return Get(); }
|
||||
V8_INLINE T* operator->() const { return Get(); }
|
||||
V8_INLINE T& operator*() const { return *Get(); }
|
||||
|
||||
// CFI cast exemption to allow passing SentinelPointer through T* and support
|
||||
// heterogeneous assignments between different Member and Persistent handles
|
||||
// based on their actual types.
|
||||
V8_CLANG_NO_SANITIZE("cfi-unrelated-cast") T* Get() const {
|
||||
V8_INLINE V8_CLANG_NO_SANITIZE("cfi-unrelated-cast") T* Get() const {
|
||||
// Executed by the mutator, hence non atomic load.
|
||||
//
|
||||
// The const_cast below removes the constness from MemberBase storage. The
|
||||
|
@ -195,59 +264,262 @@ class BasicMember final : private MemberBase, private CheckingPolicy {
|
|||
return static_cast<T*>(const_cast<void*>(MemberBase::GetRaw()));
|
||||
}
|
||||
|
||||
void Clear() { SetRawAtomic(nullptr); }
|
||||
V8_INLINE void Clear() { SetRawStorageAtomic(RawStorage{}); }
|
||||
|
||||
T* Release() {
|
||||
V8_INLINE T* Release() {
|
||||
T* result = Get();
|
||||
Clear();
|
||||
return result;
|
||||
}
|
||||
|
||||
const T** GetSlotForTesting() const {
|
||||
V8_INLINE const T** GetSlotForTesting() const {
|
||||
return reinterpret_cast<const T**>(GetRawSlot());
|
||||
}
|
||||
|
||||
V8_INLINE RawStorage GetRawStorage() const {
|
||||
return MemberBase::GetRawStorage();
|
||||
}
|
||||
|
||||
private:
|
||||
const T* GetRawAtomic() const {
|
||||
V8_INLINE explicit BasicMember(RawStorage raw) : MemberBase(raw) {
|
||||
InitializingWriteBarrier(Get());
|
||||
this->CheckPointer(Get());
|
||||
}
|
||||
|
||||
V8_INLINE BasicMember& operator=(RawStorage other) {
|
||||
SetRawStorageAtomic(other);
|
||||
AssigningWriteBarrier();
|
||||
this->CheckPointer(Get());
|
||||
return *this;
|
||||
}
|
||||
|
||||
V8_INLINE const T* GetRawAtomic() const {
|
||||
return static_cast<const T*>(MemberBase::GetRawAtomic());
|
||||
}
|
||||
|
||||
void InitializingWriteBarrier() const {
|
||||
WriteBarrierPolicy::InitializingBarrier(GetRawSlot(), GetRaw());
|
||||
V8_INLINE void InitializingWriteBarrier(T* value) const {
|
||||
WriteBarrierPolicy::InitializingBarrier(GetRawSlot(), value);
|
||||
}
|
||||
void AssigningWriteBarrier() const {
|
||||
WriteBarrierPolicy::AssigningBarrier(GetRawSlot(), GetRaw());
|
||||
V8_INLINE void AssigningWriteBarrier(T* value) const {
|
||||
WriteBarrierPolicy::AssigningBarrier(GetRawSlot(), value);
|
||||
}
|
||||
V8_INLINE void AssigningWriteBarrier() const {
|
||||
WriteBarrierPolicy::AssigningBarrier(GetRawSlot(), GetRawStorage());
|
||||
}
|
||||
|
||||
void ClearFromGC() const { MemberBase::ClearFromGC(); }
|
||||
V8_INLINE void ClearFromGC() const { MemberBase::ClearFromGC(); }
|
||||
|
||||
T* GetFromGC() const { return Get(); }
|
||||
V8_INLINE T* GetFromGC() const { return Get(); }
|
||||
|
||||
friend class cppgc::subtle::HeapConsistency;
|
||||
friend class cppgc::Visitor;
|
||||
template <typename U>
|
||||
friend struct cppgc::TraceTrait;
|
||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||
typename CheckingPolicy1>
|
||||
friend class BasicMember;
|
||||
};
|
||||
|
||||
// Member equality operators.
|
||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
||||
bool operator==(const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1,
|
||||
CheckingPolicy1>& member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2,
|
||||
CheckingPolicy2>& member2) {
|
||||
return member1.Get() == member2.Get();
|
||||
V8_INLINE bool operator==(
|
||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
||||
member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
||||
member2) {
|
||||
if constexpr (internal::IsDecayedSameV<T1, T2>) {
|
||||
// Check compressed pointers if types are the same.
|
||||
return member1.GetRawStorage() == member2.GetRawStorage();
|
||||
} else {
|
||||
static_assert(internal::IsStrictlyBaseOfV<T1, T2> ||
|
||||
internal::IsStrictlyBaseOfV<T2, T1>);
|
||||
// Otherwise, check decompressed pointers.
|
||||
return member1.Get() == member2.Get();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
||||
bool operator!=(const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1,
|
||||
CheckingPolicy1>& member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2,
|
||||
CheckingPolicy2>& member2) {
|
||||
V8_INLINE bool operator!=(
|
||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
||||
member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
||||
member2) {
|
||||
return !(member1 == member2);
|
||||
}
|
||||
|
||||
// Equality with raw pointers.
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy, typename U>
|
||||
V8_INLINE bool operator==(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member,
|
||||
U* raw) {
|
||||
// Never allow comparison with erased pointers.
|
||||
static_assert(!internal::IsDecayedSameV<void, U>);
|
||||
|
||||
if constexpr (internal::IsDecayedSameV<T, U>) {
|
||||
// Check compressed pointers if types are the same.
|
||||
return member.GetRawStorage() == MemberBase::RawStorage(raw);
|
||||
} else if constexpr (internal::IsStrictlyBaseOfV<T, U>) {
|
||||
// Cast the raw pointer to T, which may adjust the pointer.
|
||||
return member.GetRawStorage() ==
|
||||
MemberBase::RawStorage(static_cast<T*>(raw));
|
||||
} else {
|
||||
// Otherwise, decompressed the member.
|
||||
return member.Get() == raw;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy, typename U>
|
||||
V8_INLINE bool operator!=(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member,
|
||||
U* raw) {
|
||||
return !(member == raw);
|
||||
}
|
||||
|
||||
template <typename T, typename U, typename WeaknessTag,
|
||||
typename WriteBarrierPolicy, typename CheckingPolicy>
|
||||
V8_INLINE bool operator==(T* raw,
|
||||
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member) {
|
||||
return member == raw;
|
||||
}
|
||||
|
||||
template <typename T, typename U, typename WeaknessTag,
|
||||
typename WriteBarrierPolicy, typename CheckingPolicy>
|
||||
V8_INLINE bool operator!=(T* raw,
|
||||
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member) {
|
||||
return !(raw == member);
|
||||
}
|
||||
|
||||
// Equality with sentinel.
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator==(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member,
|
||||
SentinelPointer) {
|
||||
return member.GetRawStorage().IsSentinel();
|
||||
}
|
||||
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator!=(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member,
|
||||
SentinelPointer s) {
|
||||
return !(member == s);
|
||||
}
|
||||
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator==(SentinelPointer s,
|
||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member) {
|
||||
return member == s;
|
||||
}
|
||||
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator!=(SentinelPointer s,
|
||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member) {
|
||||
return !(s == member);
|
||||
}
|
||||
|
||||
// Equality with nullptr.
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator==(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member,
|
||||
std::nullptr_t) {
|
||||
return !static_cast<bool>(member);
|
||||
}
|
||||
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator!=(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member,
|
||||
std::nullptr_t n) {
|
||||
return !(member == n);
|
||||
}
|
||||
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator==(std::nullptr_t n,
|
||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member) {
|
||||
return member == n;
|
||||
}
|
||||
|
||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||
typename CheckingPolicy>
|
||||
V8_INLINE bool operator!=(std::nullptr_t n,
|
||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||
CheckingPolicy>& member) {
|
||||
return !(n == member);
|
||||
}
|
||||
|
||||
// Relational operators.
|
||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
||||
V8_INLINE bool operator<(
|
||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
||||
member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
||||
member2) {
|
||||
static_assert(
|
||||
internal::IsDecayedSameV<T1, T2>,
|
||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||
return member1.GetRawStorage() < member2.GetRawStorage();
|
||||
}
|
||||
|
||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
||||
V8_INLINE bool operator<=(
|
||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
||||
member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
||||
member2) {
|
||||
static_assert(
|
||||
internal::IsDecayedSameV<T1, T2>,
|
||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||
return member1.GetRawStorage() <= member2.GetRawStorage();
|
||||
}
|
||||
|
||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
||||
V8_INLINE bool operator>(
|
||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
||||
member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
||||
member2) {
|
||||
static_assert(
|
||||
internal::IsDecayedSameV<T1, T2>,
|
||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||
return member1.GetRawStorage() > member2.GetRawStorage();
|
||||
}
|
||||
|
||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
||||
V8_INLINE bool operator>=(
|
||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
||||
member1,
|
||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
||||
member2) {
|
||||
static_assert(
|
||||
internal::IsDecayedSameV<T1, T2>,
|
||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||
return member1.GetRawStorage() >= member2.GetRawStorage();
|
||||
}
|
||||
|
||||
template <typename T, typename WriteBarrierPolicy, typename CheckingPolicy>
|
||||
struct IsWeak<
|
||||
internal::BasicMember<T, WeakMemberTag, WriteBarrierPolicy, CheckingPolicy>>
|
||||
|
|
8
deps/v8/include/cppgc/name-provider.h
vendored
8
deps/v8/include/cppgc/name-provider.h
vendored
|
@ -37,15 +37,15 @@ class V8_EXPORT NameProvider {
|
|||
static constexpr const char kNoNameDeducible[] = "<No name>";
|
||||
|
||||
/**
|
||||
* Indicating whether internal names are hidden or not.
|
||||
* Indicating whether the build supports extracting C++ names as object names.
|
||||
*
|
||||
* @returns true if C++ names should be hidden and represented by kHiddenName.
|
||||
*/
|
||||
static constexpr bool HideInternalNames() {
|
||||
static constexpr bool SupportsCppClassNamesAsObjectNames() {
|
||||
#if CPPGC_SUPPORTS_OBJECT_NAMES
|
||||
return false;
|
||||
#else // !CPPGC_SUPPORTS_OBJECT_NAMES
|
||||
return true;
|
||||
#else // !CPPGC_SUPPORTS_OBJECT_NAMES
|
||||
return false;
|
||||
#endif // !CPPGC_SUPPORTS_OBJECT_NAMES
|
||||
}
|
||||
|
||||
|
|
14
deps/v8/include/cppgc/persistent.h
vendored
14
deps/v8/include/cppgc/persistent.h
vendored
|
@ -16,9 +16,6 @@
|
|||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
namespace cppgc {
|
||||
|
||||
class Visitor;
|
||||
|
||||
namespace internal {
|
||||
|
||||
// PersistentBase always refers to the object as const object and defers to
|
||||
|
@ -78,7 +75,7 @@ class BasicPersistent final : public PersistentBase,
|
|||
: PersistentBase(raw), LocationPolicy(loc) {
|
||||
if (!IsValid()) return;
|
||||
SetNode(WeaknessPolicy::GetPersistentRegion(GetValue())
|
||||
.AllocateNode(this, &BasicPersistent::Trace));
|
||||
.AllocateNode(this, &TraceAsRoot));
|
||||
this->CheckPointer(Get());
|
||||
}
|
||||
|
||||
|
@ -221,9 +218,8 @@ class BasicPersistent final : public PersistentBase,
|
|||
}
|
||||
|
||||
private:
|
||||
static void Trace(Visitor* v, const void* ptr) {
|
||||
const auto* persistent = static_cast<const BasicPersistent*>(ptr);
|
||||
v->TraceRoot(*persistent, persistent->Location());
|
||||
static void TraceAsRoot(RootVisitor& root_visitor, const void* ptr) {
|
||||
root_visitor.Trace(*static_cast<const BasicPersistent*>(ptr));
|
||||
}
|
||||
|
||||
bool IsValid() const {
|
||||
|
@ -247,7 +243,7 @@ class BasicPersistent final : public PersistentBase,
|
|||
SetValue(ptr);
|
||||
if (!IsValid()) return;
|
||||
SetNode(WeaknessPolicy::GetPersistentRegion(GetValue())
|
||||
.AllocateNode(this, &BasicPersistent::Trace));
|
||||
.AllocateNode(this, &TraceAsRoot));
|
||||
this->CheckPointer(Get());
|
||||
}
|
||||
|
||||
|
@ -264,7 +260,7 @@ class BasicPersistent final : public PersistentBase,
|
|||
return static_cast<T*>(const_cast<void*>(GetValue()));
|
||||
}
|
||||
|
||||
friend class cppgc::Visitor;
|
||||
friend class internal::RootVisitor;
|
||||
};
|
||||
|
||||
template <typename T1, typename WeaknessPolicy1, typename LocationPolicy1,
|
||||
|
|
4
deps/v8/include/cppgc/platform.h
vendored
4
deps/v8/include/cppgc/platform.h
vendored
|
@ -132,8 +132,8 @@ class V8_EXPORT Platform {
|
|||
*
|
||||
* Can be called multiple times when paired with `ShutdownProcess()`.
|
||||
*
|
||||
* \param page_allocator The allocator used for maintaining meta data. Must not
|
||||
* change between multiple calls to InitializeProcess.
|
||||
* \param page_allocator The allocator used for maintaining meta data. Must stay
|
||||
* always alive and not change between multiple calls to InitializeProcess.
|
||||
*/
|
||||
V8_EXPORT void InitializeProcess(PageAllocator* page_allocator);
|
||||
|
||||
|
|
2
deps/v8/include/cppgc/sentinel-pointer.h
vendored
2
deps/v8/include/cppgc/sentinel-pointer.h
vendored
|
@ -13,9 +13,9 @@ namespace internal {
|
|||
// Special tag type used to denote some sentinel member. The semantics of the
|
||||
// sentinel is defined by the embedder.
|
||||
struct SentinelPointer {
|
||||
static constexpr intptr_t kSentinelValue = 0b10;
|
||||
template <typename T>
|
||||
operator T*() const {
|
||||
static constexpr intptr_t kSentinelValue = 1;
|
||||
return reinterpret_cast<T*>(kSentinelValue);
|
||||
}
|
||||
// Hidden friends.
|
||||
|
|
4
deps/v8/include/cppgc/trace-trait.h
vendored
4
deps/v8/include/cppgc/trace-trait.h
vendored
|
@ -16,6 +16,10 @@ class Visitor;
|
|||
|
||||
namespace internal {
|
||||
|
||||
class RootVisitor;
|
||||
|
||||
using TraceRootCallback = void (*)(RootVisitor&, const void* object);
|
||||
|
||||
// Implementation of the default TraceTrait handling GarbageCollected and
|
||||
// GarbageCollectedMixin.
|
||||
template <typename T,
|
||||
|
|
9
deps/v8/include/cppgc/type-traits.h
vendored
9
deps/v8/include/cppgc/type-traits.h
vendored
|
@ -170,6 +170,15 @@ struct IsComplete {
|
|||
decltype(IsSizeOfKnown(std::declval<T*>()))::value;
|
||||
};
|
||||
|
||||
template <typename T, typename U>
|
||||
constexpr bool IsDecayedSameV =
|
||||
std::is_same_v<std::decay_t<T>, std::decay_t<U>>;
|
||||
|
||||
template <typename B, typename D>
|
||||
constexpr bool IsStrictlyBaseOfV =
|
||||
std::is_base_of_v<std::decay_t<B>, std::decay_t<D>> &&
|
||||
!IsDecayedSameV<B, D>;
|
||||
|
||||
} // namespace internal
|
||||
|
||||
/**
|
||||
|
|
146
deps/v8/include/cppgc/visitor.h
vendored
146
deps/v8/include/cppgc/visitor.h
vendored
|
@ -62,22 +62,6 @@ class V8_EXPORT Visitor {
|
|||
|
||||
virtual ~Visitor() = default;
|
||||
|
||||
/**
|
||||
* Trace method for raw pointers. Prefer the versions for managed pointers.
|
||||
*
|
||||
* \param member Reference retaining an object.
|
||||
*/
|
||||
template <typename T>
|
||||
void Trace(const T* t) {
|
||||
static_assert(sizeof(T), "Pointee type must be fully defined.");
|
||||
static_assert(internal::IsGarbageCollectedOrMixinType<T>::value,
|
||||
"T must be GarbageCollected or GarbageCollectedMixin type");
|
||||
if (!t) {
|
||||
return;
|
||||
}
|
||||
Visit(t, TraceTrait<T>::GetTraceDescriptor(t));
|
||||
}
|
||||
|
||||
/**
|
||||
* Trace method for Member.
|
||||
*
|
||||
|
@ -87,7 +71,7 @@ class V8_EXPORT Visitor {
|
|||
void Trace(const Member<T>& member) {
|
||||
const T* value = member.GetRawAtomic();
|
||||
CPPGC_DCHECK(value != kSentinelPointer);
|
||||
Trace(value);
|
||||
TraceImpl(value);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -231,23 +215,33 @@ class V8_EXPORT Visitor {
|
|||
void TraceStrongly(const WeakMember<T>& weak_member) {
|
||||
const T* value = weak_member.GetRawAtomic();
|
||||
CPPGC_DCHECK(value != kSentinelPointer);
|
||||
Trace(value);
|
||||
TraceImpl(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trace method for weak containers.
|
||||
* Trace method for retaining containers strongly.
|
||||
*
|
||||
* \param object reference of the weak container.
|
||||
* \param object reference to the container.
|
||||
*/
|
||||
template <typename T>
|
||||
void TraceStrongContainer(const T* object) {
|
||||
TraceImpl(object);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trace method for retaining containers weakly.
|
||||
*
|
||||
* \param object reference to the container.
|
||||
* \param callback to be invoked.
|
||||
* \param data custom data that is passed to the callback.
|
||||
* \param callback_data custom data that is passed to the callback.
|
||||
*/
|
||||
template <typename T>
|
||||
void TraceWeakContainer(const T* object, WeakCallback callback,
|
||||
const void* data) {
|
||||
const void* callback_data) {
|
||||
if (!object) return;
|
||||
VisitWeakContainer(object, TraceTrait<T>::GetTraceDescriptor(object),
|
||||
TraceTrait<T>::GetWeakTraceDescriptor(object), callback,
|
||||
data);
|
||||
callback_data);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -255,6 +249,7 @@ class V8_EXPORT Visitor {
|
|||
* compactable space. Such references maybe be arbitrarily moved by the GC.
|
||||
*
|
||||
* \param slot location of reference to object that might be moved by the GC.
|
||||
* The slot must contain an uncompressed pointer.
|
||||
*/
|
||||
template <typename T>
|
||||
void RegisterMovableReference(const T** slot) {
|
||||
|
@ -297,9 +292,6 @@ class V8_EXPORT Visitor {
|
|||
virtual void Visit(const void* self, TraceDescriptor) {}
|
||||
virtual void VisitWeak(const void* self, TraceDescriptor, WeakCallback,
|
||||
const void* weak_member) {}
|
||||
virtual void VisitRoot(const void*, TraceDescriptor, const SourceLocation&) {}
|
||||
virtual void VisitWeakRoot(const void* self, TraceDescriptor, WeakCallback,
|
||||
const void* weak_root, const SourceLocation&) {}
|
||||
virtual void VisitEphemeron(const void* key, const void* value,
|
||||
TraceDescriptor value_desc) {}
|
||||
virtual void VisitWeakContainer(const void* self, TraceDescriptor strong_desc,
|
||||
|
@ -320,44 +312,20 @@ class V8_EXPORT Visitor {
|
|||
static void HandleWeak(const LivenessBroker& info, const void* object) {
|
||||
const PointerType* weak = static_cast<const PointerType*>(object);
|
||||
auto* raw_ptr = weak->GetFromGC();
|
||||
// Sentinel values are preserved for weak pointers.
|
||||
if (raw_ptr == kSentinelPointer) return;
|
||||
if (!info.IsHeapObjectAlive(raw_ptr)) {
|
||||
weak->ClearFromGC();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Persistent,
|
||||
std::enable_if_t<Persistent::IsStrongPersistent::value>* = nullptr>
|
||||
void TraceRoot(const Persistent& p, const SourceLocation& loc) {
|
||||
using PointeeType = typename Persistent::PointeeType;
|
||||
static_assert(sizeof(PointeeType),
|
||||
"Persistent's pointee type must be fully defined");
|
||||
static_assert(internal::IsGarbageCollectedOrMixinType<PointeeType>::value,
|
||||
"Persistent's pointee type must be GarbageCollected or "
|
||||
"GarbageCollectedMixin");
|
||||
auto* ptr = p.GetFromGC();
|
||||
if (!ptr) {
|
||||
template <typename T>
|
||||
void TraceImpl(const T* t) {
|
||||
static_assert(sizeof(T), "Pointee type must be fully defined.");
|
||||
static_assert(internal::IsGarbageCollectedOrMixinType<T>::value,
|
||||
"T must be GarbageCollected or GarbageCollectedMixin type");
|
||||
if (!t) {
|
||||
return;
|
||||
}
|
||||
VisitRoot(ptr, TraceTrait<PointeeType>::GetTraceDescriptor(ptr), loc);
|
||||
}
|
||||
|
||||
template <
|
||||
typename WeakPersistent,
|
||||
std::enable_if_t<!WeakPersistent::IsStrongPersistent::value>* = nullptr>
|
||||
void TraceRoot(const WeakPersistent& p, const SourceLocation& loc) {
|
||||
using PointeeType = typename WeakPersistent::PointeeType;
|
||||
static_assert(sizeof(PointeeType),
|
||||
"Persistent's pointee type must be fully defined");
|
||||
static_assert(internal::IsGarbageCollectedOrMixinType<PointeeType>::value,
|
||||
"Persistent's pointee type must be GarbageCollected or "
|
||||
"GarbageCollectedMixin");
|
||||
static_assert(!internal::IsAllocatedOnCompactableSpace<PointeeType>::value,
|
||||
"Weak references to compactable objects are not allowed");
|
||||
auto* ptr = p.GetFromGC();
|
||||
VisitWeakRoot(ptr, TraceTrait<PointeeType>::GetTraceDescriptor(ptr),
|
||||
&HandleWeak<WeakPersistent>, &p, loc);
|
||||
Visit(t, TraceTrait<T>::GetTraceDescriptor(t));
|
||||
}
|
||||
|
||||
#if V8_ENABLE_CHECKS
|
||||
|
@ -374,6 +342,70 @@ class V8_EXPORT Visitor {
|
|||
friend class internal::VisitorBase;
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
|
||||
class V8_EXPORT RootVisitor {
|
||||
public:
|
||||
explicit RootVisitor(Visitor::Key) {}
|
||||
|
||||
virtual ~RootVisitor() = default;
|
||||
|
||||
template <typename AnyStrongPersistentType,
|
||||
std::enable_if_t<
|
||||
AnyStrongPersistentType::IsStrongPersistent::value>* = nullptr>
|
||||
void Trace(const AnyStrongPersistentType& p) {
|
||||
using PointeeType = typename AnyStrongPersistentType::PointeeType;
|
||||
const void* object = Extract(p);
|
||||
if (!object) {
|
||||
return;
|
||||
}
|
||||
VisitRoot(object, TraceTrait<PointeeType>::GetTraceDescriptor(object),
|
||||
p.Location());
|
||||
}
|
||||
|
||||
template <typename AnyWeakPersistentType,
|
||||
std::enable_if_t<
|
||||
!AnyWeakPersistentType::IsStrongPersistent::value>* = nullptr>
|
||||
void Trace(const AnyWeakPersistentType& p) {
|
||||
using PointeeType = typename AnyWeakPersistentType::PointeeType;
|
||||
static_assert(!internal::IsAllocatedOnCompactableSpace<PointeeType>::value,
|
||||
"Weak references to compactable objects are not allowed");
|
||||
const void* object = Extract(p);
|
||||
if (!object) {
|
||||
return;
|
||||
}
|
||||
VisitWeakRoot(object, TraceTrait<PointeeType>::GetTraceDescriptor(object),
|
||||
&HandleWeak<AnyWeakPersistentType>, &p, p.Location());
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void VisitRoot(const void*, TraceDescriptor, const SourceLocation&) {}
|
||||
virtual void VisitWeakRoot(const void* self, TraceDescriptor, WeakCallback,
|
||||
const void* weak_root, const SourceLocation&) {}
|
||||
|
||||
private:
|
||||
template <typename AnyPersistentType>
|
||||
static const void* Extract(AnyPersistentType& p) {
|
||||
using PointeeType = typename AnyPersistentType::PointeeType;
|
||||
static_assert(sizeof(PointeeType),
|
||||
"Persistent's pointee type must be fully defined");
|
||||
static_assert(internal::IsGarbageCollectedOrMixinType<PointeeType>::value,
|
||||
"Persistent's pointee type must be GarbageCollected or "
|
||||
"GarbageCollectedMixin");
|
||||
return p.GetFromGC();
|
||||
}
|
||||
|
||||
template <typename PointerType>
|
||||
static void HandleWeak(const LivenessBroker& info, const void* object) {
|
||||
const PointerType* weak = static_cast<const PointerType*>(object);
|
||||
auto* raw_ptr = weak->GetFromGC();
|
||||
if (!info.IsHeapObjectAlive(raw_ptr)) {
|
||||
weak->ClearFromGC();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace cppgc
|
||||
|
||||
#endif // INCLUDE_CPPGC_VISITOR_H_
|
||||
|
|
113
deps/v8/include/js_protocol.pdl
vendored
113
deps/v8/include/js_protocol.pdl
vendored
|
@ -113,6 +113,11 @@ domain Debugger
|
|||
Runtime.RemoteObject this
|
||||
# The value being returned, if the function is at return point.
|
||||
optional Runtime.RemoteObject returnValue
|
||||
# Valid only while the VM is paused and indicates whether this frame
|
||||
# can be restarted or not. Note that a `true` value here does not
|
||||
# guarantee that Debugger#restartFrame with this CallFrameId will be
|
||||
# successful, but it is very likely.
|
||||
experimental optional boolean canBeRestarted
|
||||
|
||||
# Scope description.
|
||||
type Scope extends object
|
||||
|
@ -239,6 +244,40 @@ domain Debugger
|
|||
# Wasm bytecode.
|
||||
optional binary bytecode
|
||||
|
||||
experimental type WasmDisassemblyChunk extends object
|
||||
properties
|
||||
# The next chunk of disassembled lines.
|
||||
array of string lines
|
||||
# The bytecode offsets describing the start of each line.
|
||||
array of integer bytecodeOffsets
|
||||
|
||||
experimental command disassembleWasmModule
|
||||
parameters
|
||||
# Id of the script to disassemble
|
||||
Runtime.ScriptId scriptId
|
||||
returns
|
||||
# For large modules, return a stream from which additional chunks of
|
||||
# disassembly can be read successively.
|
||||
optional string streamId
|
||||
# The total number of lines in the disassembly text.
|
||||
integer totalNumberOfLines
|
||||
# The offsets of all function bodies, in the format [start1, end1,
|
||||
# start2, end2, ...] where all ends are exclusive.
|
||||
array of integer functionBodyOffsets
|
||||
# The first chunk of disassembly.
|
||||
WasmDisassemblyChunk chunk
|
||||
|
||||
# Disassemble the next chunk of lines for the module corresponding to the
|
||||
# stream. If disassembly is complete, this API will invalidate the streamId
|
||||
# and return an empty chunk. Any subsequent calls for the now invalid stream
|
||||
# will return errors.
|
||||
experimental command nextWasmDisassemblyChunk
|
||||
parameters
|
||||
string streamId
|
||||
returns
|
||||
# The next chunk of disassembly.
|
||||
WasmDisassemblyChunk chunk
|
||||
|
||||
# This command is deprecated. Use getScriptSource instead.
|
||||
deprecated command getWasmBytecode
|
||||
parameters
|
||||
|
@ -268,18 +307,35 @@ domain Debugger
|
|||
parameters
|
||||
BreakpointId breakpointId
|
||||
|
||||
# Restarts particular call frame from the beginning.
|
||||
deprecated command restartFrame
|
||||
# Restarts particular call frame from the beginning. The old, deprecated
|
||||
# behavior of `restartFrame` is to stay paused and allow further CDP commands
|
||||
# after a restart was scheduled. This can cause problems with restarting, so
|
||||
# we now continue execution immediatly after it has been scheduled until we
|
||||
# reach the beginning of the restarted frame.
|
||||
#
|
||||
# To stay back-wards compatible, `restartFrame` now expects a `mode`
|
||||
# parameter to be present. If the `mode` parameter is missing, `restartFrame`
|
||||
# errors out.
|
||||
#
|
||||
# The various return values are deprecated and `callFrames` is always empty.
|
||||
# Use the call frames from the `Debugger#paused` events instead, that fires
|
||||
# once V8 pauses at the beginning of the restarted function.
|
||||
command restartFrame
|
||||
parameters
|
||||
# Call frame identifier to evaluate on.
|
||||
CallFrameId callFrameId
|
||||
# The `mode` parameter must be present and set to 'StepInto', otherwise
|
||||
# `restartFrame` will error out.
|
||||
experimental optional enum mode
|
||||
# Pause at the beginning of the restarted function
|
||||
StepInto
|
||||
returns
|
||||
# New stack trace.
|
||||
array of CallFrame callFrames
|
||||
deprecated array of CallFrame callFrames
|
||||
# Async stack trace, if any.
|
||||
optional Runtime.StackTrace asyncStackTrace
|
||||
deprecated optional Runtime.StackTrace asyncStackTrace
|
||||
# Async stack trace, if any.
|
||||
experimental optional Runtime.StackTraceId asyncStackTraceId
|
||||
deprecated optional Runtime.StackTraceId asyncStackTraceId
|
||||
|
||||
# Resumes JavaScript execution.
|
||||
command resume
|
||||
|
@ -419,6 +475,12 @@ domain Debugger
|
|||
Runtime.CallArgument newValue
|
||||
|
||||
# Edits JavaScript source live.
|
||||
#
|
||||
# In general, functions that are currently on the stack can not be edited with
|
||||
# a single exception: If the edited function is the top-most stack frame and
|
||||
# that is the only activation of that function on the stack. In this case
|
||||
# the live edit will be successful and a `Debugger.restartFrame` for the
|
||||
# top-most function is automatically triggered.
|
||||
command setScriptSource
|
||||
parameters
|
||||
# Id of the script to edit.
|
||||
|
@ -428,16 +490,27 @@ domain Debugger
|
|||
# If true the change will not actually be applied. Dry run may be used to get result
|
||||
# description without actually modifying the code.
|
||||
optional boolean dryRun
|
||||
# If true, then `scriptSource` is allowed to change the function on top of the stack
|
||||
# as long as the top-most stack frame is the only activation of that function.
|
||||
experimental optional boolean allowTopFrameEditing
|
||||
returns
|
||||
# New stack trace in case editing has happened while VM was stopped.
|
||||
optional array of CallFrame callFrames
|
||||
deprecated optional array of CallFrame callFrames
|
||||
# Whether current call stack was modified after applying the changes.
|
||||
optional boolean stackChanged
|
||||
deprecated optional boolean stackChanged
|
||||
# Async stack trace, if any.
|
||||
optional Runtime.StackTrace asyncStackTrace
|
||||
deprecated optional Runtime.StackTrace asyncStackTrace
|
||||
# Async stack trace, if any.
|
||||
experimental optional Runtime.StackTraceId asyncStackTraceId
|
||||
# Exception details if any.
|
||||
deprecated optional Runtime.StackTraceId asyncStackTraceId
|
||||
# Whether the operation was successful or not. Only `Ok` denotes a
|
||||
# successful live edit while the other enum variants denote why
|
||||
# the live edit failed.
|
||||
experimental enum status
|
||||
Ok
|
||||
CompileError
|
||||
BlockedByActiveGenerator
|
||||
BlockedByActiveFunction
|
||||
# Exception details if any. Only present when `status` is `CompileError`.
|
||||
optional Runtime.ExceptionDetails exceptionDetails
|
||||
|
||||
# Makes page not interrupt on any pauses (breakpoint, exception, dom exception etc).
|
||||
|
@ -554,7 +627,7 @@ domain Debugger
|
|||
integer endColumn
|
||||
# Specifies script creation context.
|
||||
Runtime.ExecutionContextId executionContextId
|
||||
# Content hash of the script.
|
||||
# Content hash of the script, SHA-256.
|
||||
string hash
|
||||
# Embedder-specific auxiliary data.
|
||||
optional object executionContextAuxData
|
||||
|
@ -593,7 +666,7 @@ domain Debugger
|
|||
integer endColumn
|
||||
# Specifies script creation context.
|
||||
Runtime.ExecutionContextId executionContextId
|
||||
# Content hash of the script.
|
||||
# Content hash of the script, SHA-256.
|
||||
string hash
|
||||
# Embedder-specific auxiliary data.
|
||||
optional object executionContextAuxData
|
||||
|
@ -708,18 +781,24 @@ experimental domain HeapProfiler
|
|||
# If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken
|
||||
# when the tracking is stopped.
|
||||
optional boolean reportProgress
|
||||
optional boolean treatGlobalObjectsAsRoots
|
||||
# Deprecated in favor of `exposeInternals`.
|
||||
deprecated optional boolean treatGlobalObjectsAsRoots
|
||||
# If true, numerical values are included in the snapshot
|
||||
optional boolean captureNumericValue
|
||||
# If true, exposes internals of the snapshot.
|
||||
experimental optional boolean exposeInternals
|
||||
|
||||
command takeHeapSnapshot
|
||||
parameters
|
||||
# If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken.
|
||||
optional boolean reportProgress
|
||||
# If true, a raw snapshot without artificial roots will be generated
|
||||
optional boolean treatGlobalObjectsAsRoots
|
||||
# If true, a raw snapshot without artificial roots will be generated.
|
||||
# Deprecated in favor of `exposeInternals`.
|
||||
deprecated optional boolean treatGlobalObjectsAsRoots
|
||||
# If true, numerical values are included in the snapshot
|
||||
optional boolean captureNumericValue
|
||||
# If true, exposes internals of the snapshot.
|
||||
experimental optional boolean exposeInternals
|
||||
|
||||
event addHeapSnapshotChunk
|
||||
parameters
|
||||
|
@ -1342,7 +1421,9 @@ domain Runtime
|
|||
optional string objectGroup
|
||||
# Whether to throw an exception if side effect cannot be ruled out during evaluation.
|
||||
experimental optional boolean throwOnSideEffect
|
||||
# Whether the result should be serialized according to https://w3c.github.io/webdriver-bidi.
|
||||
# Whether the result should contain `webDriverValue`, serialized according to
|
||||
# https://w3c.github.io/webdriver-bidi. This is mutually exclusive with `returnByValue`, but
|
||||
# resulting `objectId` is still provided.
|
||||
experimental optional boolean generateWebDriverValue
|
||||
returns
|
||||
# Call result.
|
||||
|
|
24
deps/v8/include/v8-callbacks.h
vendored
24
deps/v8/include/v8-callbacks.h
vendored
|
@ -12,6 +12,7 @@
|
|||
#include "cppgc/common.h"
|
||||
#include "v8-data.h" // NOLINT(build/include_directory)
|
||||
#include "v8-local-handle.h" // NOLINT(build/include_directory)
|
||||
#include "v8-promise.h" // NOLINT(build/include_directory)
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
#if defined(V8_OS_WIN)
|
||||
|
@ -105,7 +106,7 @@ struct JitCodeEvent {
|
|||
size_t line_number_table_size;
|
||||
};
|
||||
|
||||
wasm_source_info_t* wasm_source_info;
|
||||
wasm_source_info_t* wasm_source_info = nullptr;
|
||||
|
||||
union {
|
||||
// Only valid for CODE_ADDED.
|
||||
|
@ -216,7 +217,13 @@ using AddHistogramSampleCallback = void (*)(void* histogram, int sample);
|
|||
|
||||
using FatalErrorCallback = void (*)(const char* location, const char* message);
|
||||
|
||||
using OOMErrorCallback = void (*)(const char* location, bool is_heap_oom);
|
||||
struct OOMDetails {
|
||||
bool is_heap_oom = false;
|
||||
const char* detail = nullptr;
|
||||
};
|
||||
|
||||
using OOMErrorCallback = void (*)(const char* location,
|
||||
const OOMDetails& details);
|
||||
|
||||
using MessageCallback = void (*)(Local<Message> message, Local<Value> data);
|
||||
|
||||
|
@ -231,8 +238,11 @@ enum class CrashKeyId {
|
|||
kIsolateAddress,
|
||||
kReadonlySpaceFirstPageAddress,
|
||||
kMapSpaceFirstPageAddress,
|
||||
kCodeRangeBaseAddress,
|
||||
kCodeSpaceFirstPageAddress,
|
||||
kDumpType,
|
||||
kSnapshotChecksumCalculated,
|
||||
kSnapshotChecksumExpected,
|
||||
};
|
||||
|
||||
using AddCrashKeyCallback = void (*)(CrashKeyId id, const std::string& value);
|
||||
|
@ -300,6 +310,13 @@ using ApiImplementationCallback = void (*)(const FunctionCallbackInfo<Value>&);
|
|||
// --- Callback for WebAssembly.compileStreaming ---
|
||||
using WasmStreamingCallback = void (*)(const FunctionCallbackInfo<Value>&);
|
||||
|
||||
enum class WasmAsyncSuccess { kSuccess, kFail };
|
||||
|
||||
// --- Callback called when async WebAssembly operations finish ---
|
||||
using WasmAsyncResolvePromiseCallback = void (*)(
|
||||
Isolate* isolate, Local<Context> context, Local<Promise::Resolver> resolver,
|
||||
Local<Value> result, WasmAsyncSuccess success);
|
||||
|
||||
// --- Callback for loading source map file for Wasm profiling support
|
||||
using WasmLoadSourceMapCallback = Local<String> (*)(Isolate* isolate,
|
||||
const char* name);
|
||||
|
@ -310,9 +327,6 @@ using WasmSimdEnabledCallback = bool (*)(Local<Context> context);
|
|||
// --- Callback for checking if WebAssembly exceptions are enabled ---
|
||||
using WasmExceptionsEnabledCallback = bool (*)(Local<Context> context);
|
||||
|
||||
// --- Callback for checking if WebAssembly dynamic tiering is enabled ---
|
||||
using WasmDynamicTieringEnabledCallback = bool (*)(Local<Context> context);
|
||||
|
||||
// --- Callback for checking if the SharedArrayBuffer constructor is enabled ---
|
||||
using SharedArrayBufferConstructorEnabledCallback =
|
||||
bool (*)(Local<Context> context);
|
||||
|
|
20
deps/v8/include/v8-context.h
vendored
20
deps/v8/include/v8-context.h
vendored
|
@ -244,6 +244,12 @@ class V8_EXPORT Context : public Data {
|
|||
*/
|
||||
void SetErrorMessageForCodeGenerationFromStrings(Local<String> message);
|
||||
|
||||
/**
|
||||
* Sets the error description for the exception that is thrown when
|
||||
* wasm code generation is not allowed.
|
||||
*/
|
||||
void SetErrorMessageForWasmCodeGeneration(Local<String> message);
|
||||
|
||||
/**
|
||||
* Return data that was previously attached to the context snapshot via
|
||||
* SnapshotCreator, and removes the reference to it.
|
||||
|
@ -374,15 +380,13 @@ void* Context::GetAlignedPointerFromEmbedderData(int index) {
|
|||
A ctx = *reinterpret_cast<const A*>(this);
|
||||
A embedder_data =
|
||||
I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset);
|
||||
int value_offset =
|
||||
I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index);
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
value_offset += I::kEmbedderDataSlotRawPayloadOffset;
|
||||
#endif
|
||||
internal::Isolate* isolate = I::GetIsolateForSandbox(ctx);
|
||||
int value_offset = I::kEmbedderDataArrayHeaderSize +
|
||||
(I::kEmbedderDataSlotSize * index) +
|
||||
I::kEmbedderDataSlotExternalPointerOffset;
|
||||
Isolate* isolate = I::GetIsolateForSandbox(ctx);
|
||||
return reinterpret_cast<void*>(
|
||||
I::ReadExternalPointerField(isolate, embedder_data, value_offset,
|
||||
internal::kEmbedderDataSlotPayloadTag));
|
||||
I::ReadExternalPointerField<internal::kEmbedderDataSlotPayloadTag>(
|
||||
isolate, embedder_data, value_offset));
|
||||
#else
|
||||
return SlowGetAlignedPointerFromEmbedderData(index);
|
||||
#endif
|
||||
|
|
15
deps/v8/include/v8-cppgc.h
vendored
15
deps/v8/include/v8-cppgc.h
vendored
|
@ -77,11 +77,20 @@ struct WrapperDescriptor final {
|
|||
};
|
||||
|
||||
struct V8_EXPORT CppHeapCreateParams {
|
||||
CppHeapCreateParams(const CppHeapCreateParams&) = delete;
|
||||
CppHeapCreateParams& operator=(const CppHeapCreateParams&) = delete;
|
||||
|
||||
std::vector<std::unique_ptr<cppgc::CustomSpaceBase>> custom_spaces;
|
||||
WrapperDescriptor wrapper_descriptor;
|
||||
/**
|
||||
* Specifies which kind of marking are supported by the heap. The type may be
|
||||
* further reduced via runtime flags when attaching the heap to an Isolate.
|
||||
*/
|
||||
cppgc::Heap::MarkingType marking_support =
|
||||
cppgc::Heap::MarkingType::kIncrementalAndConcurrent;
|
||||
/**
|
||||
* Specifies which kind of sweeping is supported by the heap. The type may be
|
||||
* further reduced via runtime flags when attaching the heap to an Isolate.
|
||||
*/
|
||||
cppgc::Heap::SweepingType sweeping_support =
|
||||
cppgc::Heap::SweepingType::kIncrementalAndConcurrent;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
5
deps/v8/include/v8-date.h
vendored
5
deps/v8/include/v8-date.h
vendored
|
@ -27,6 +27,11 @@ class V8_EXPORT Date : public Object {
|
|||
*/
|
||||
double ValueOf() const;
|
||||
|
||||
/**
|
||||
* Generates ISO string representation.
|
||||
*/
|
||||
v8::Local<v8::String> ToISOString() const;
|
||||
|
||||
V8_INLINE static Date* Cast(Value* value) {
|
||||
#ifdef V8_ENABLE_CHECKS
|
||||
CheckCast(value);
|
||||
|
|
11
deps/v8/include/v8-embedder-heap.h
vendored
11
deps/v8/include/v8-embedder-heap.h
vendored
|
@ -69,7 +69,12 @@ class V8_EXPORT EmbedderRootsHandler {
|
|||
* trace through its heap and use reporter to report each JavaScript object
|
||||
* reachable from any of the given wrappers.
|
||||
*/
|
||||
class V8_EXPORT EmbedderHeapTracer {
|
||||
class V8_EXPORT
|
||||
// GCC doesn't like combining __attribute__(()) with [[deprecated]].
|
||||
#ifdef __clang__
|
||||
V8_DEPRECATE_SOON("Use CppHeap when working with v8::TracedReference.")
|
||||
#endif // __clang__
|
||||
EmbedderHeapTracer {
|
||||
public:
|
||||
using EmbedderStackState = cppgc::EmbedderStackState;
|
||||
|
||||
|
@ -205,10 +210,10 @@ class V8_EXPORT EmbedderHeapTracer {
|
|||
* Returns the v8::Isolate this tracer is attached too and |nullptr| if it
|
||||
* is not attached to any v8::Isolate.
|
||||
*/
|
||||
v8::Isolate* isolate() const { return isolate_; }
|
||||
v8::Isolate* isolate() const { return v8_isolate_; }
|
||||
|
||||
protected:
|
||||
v8::Isolate* isolate_ = nullptr;
|
||||
v8::Isolate* v8_isolate_ = nullptr;
|
||||
|
||||
friend class internal::LocalEmbedderHeapTracer;
|
||||
};
|
||||
|
|
2
deps/v8/include/v8-exception.h
vendored
2
deps/v8/include/v8-exception.h
vendored
|
@ -197,7 +197,7 @@ class V8_EXPORT TryCatch {
|
|||
|
||||
void ResetInternal();
|
||||
|
||||
internal::Isolate* isolate_;
|
||||
internal::Isolate* i_isolate_;
|
||||
TryCatch* next_;
|
||||
void* exception_;
|
||||
void* message_obj_;
|
||||
|
|
57
deps/v8/include/v8-fast-api-calls.h
vendored
57
deps/v8/include/v8-fast-api-calls.h
vendored
|
@ -240,6 +240,7 @@ class CTypeInfo {
|
|||
enum class Type : uint8_t {
|
||||
kVoid,
|
||||
kBool,
|
||||
kUint8,
|
||||
kInt32,
|
||||
kUint32,
|
||||
kInt64,
|
||||
|
@ -302,8 +303,9 @@ class CTypeInfo {
|
|||
constexpr Flags GetFlags() const { return flags_; }
|
||||
|
||||
static constexpr bool IsIntegralType(Type type) {
|
||||
return type == Type::kInt32 || type == Type::kUint32 ||
|
||||
type == Type::kInt64 || type == Type::kUint64;
|
||||
return type == Type::kUint8 || type == Type::kInt32 ||
|
||||
type == Type::kUint32 || type == Type::kInt64 ||
|
||||
type == Type::kUint64;
|
||||
}
|
||||
|
||||
static constexpr bool IsFloatingPointType(Type type) {
|
||||
|
@ -429,6 +431,7 @@ struct AnyCType {
|
|||
double double_value;
|
||||
Local<Object> object_value;
|
||||
Local<Array> sequence_value;
|
||||
const FastApiTypedArray<uint8_t>* uint8_ta_value;
|
||||
const FastApiTypedArray<int32_t>* int32_ta_value;
|
||||
const FastApiTypedArray<uint32_t>* uint32_ta_value;
|
||||
const FastApiTypedArray<int64_t>* int64_ta_value;
|
||||
|
@ -544,7 +547,7 @@ struct FastApiCallbackOptions {
|
|||
* returned instance may be filled with mock data.
|
||||
*/
|
||||
static FastApiCallbackOptions CreateForTesting(Isolate* isolate) {
|
||||
return {false, {0}};
|
||||
return {false, {0}, nullptr};
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -566,8 +569,13 @@ struct FastApiCallbackOptions {
|
|||
*/
|
||||
union {
|
||||
uintptr_t data_ptr;
|
||||
v8::Value data;
|
||||
v8::Local<v8::Value> data;
|
||||
};
|
||||
|
||||
/**
|
||||
* When called from WebAssembly, a view of the calling module's memory.
|
||||
*/
|
||||
FastApiTypedArray<uint8_t>* const wasm_memory;
|
||||
};
|
||||
|
||||
namespace internal {
|
||||
|
@ -648,7 +656,8 @@ struct CTypeInfoTraits {};
|
|||
V(int64_t, kInt64) \
|
||||
V(uint64_t, kUint64) \
|
||||
V(float, kFloat32) \
|
||||
V(double, kFloat64)
|
||||
V(double, kFloat64) \
|
||||
V(uint8_t, kUint8)
|
||||
|
||||
// Same as above, but includes deprecated types for compatibility.
|
||||
#define ALL_C_TYPES(V) \
|
||||
|
@ -687,7 +696,8 @@ PRIMITIVE_C_TYPES(DEFINE_TYPE_INFO_TRAITS)
|
|||
V(int64_t, kInt64) \
|
||||
V(uint64_t, kUint64) \
|
||||
V(float, kFloat32) \
|
||||
V(double, kFloat64)
|
||||
V(double, kFloat64) \
|
||||
V(uint8_t, kUint8)
|
||||
|
||||
TYPED_ARRAY_C_TYPES(SPECIALIZE_GET_TYPE_INFO_HELPER_FOR_TA)
|
||||
|
||||
|
@ -802,6 +812,16 @@ class CFunctionBuilderWithFunction {
|
|||
std::make_index_sequence<sizeof...(ArgBuilders)>());
|
||||
}
|
||||
|
||||
// Provided for testing purposes.
|
||||
template <typename Ret, typename... Args>
|
||||
auto Patch(Ret (*patching_func)(Args...)) {
|
||||
static_assert(
|
||||
sizeof...(Args) == sizeof...(ArgBuilders),
|
||||
"The patching function must have the same number of arguments.");
|
||||
fn_ = reinterpret_cast<void*>(patching_func);
|
||||
return *this;
|
||||
}
|
||||
|
||||
auto Build() {
|
||||
static CFunctionInfoImpl<RetBuilder, ArgBuilders...> instance;
|
||||
return CFunction(fn_, &instance);
|
||||
|
@ -881,31 +901,6 @@ static constexpr CTypeInfo kTypeInfoFloat64 =
|
|||
* to the requested destination type, is considered unsupported. The operation
|
||||
* returns true on success. `type_info` will be used for conversions.
|
||||
*/
|
||||
template <const CTypeInfo* type_info, typename T>
|
||||
V8_DEPRECATED(
|
||||
"Use TryToCopyAndConvertArrayToCppBuffer<CTypeInfo::Identifier, T>()")
|
||||
bool V8_EXPORT V8_WARN_UNUSED_RESULT
|
||||
TryCopyAndConvertArrayToCppBuffer(Local<Array> src, T* dst,
|
||||
uint32_t max_length);
|
||||
|
||||
template <>
|
||||
V8_DEPRECATED(
|
||||
"Use TryToCopyAndConvertArrayToCppBuffer<CTypeInfo::Identifier, T>()")
|
||||
inline bool V8_WARN_UNUSED_RESULT
|
||||
TryCopyAndConvertArrayToCppBuffer<&kTypeInfoInt32, int32_t>(
|
||||
Local<Array> src, int32_t* dst, uint32_t max_length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
template <>
|
||||
V8_DEPRECATED(
|
||||
"Use TryToCopyAndConvertArrayToCppBuffer<CTypeInfo::Identifier, T>()")
|
||||
inline bool V8_WARN_UNUSED_RESULT
|
||||
TryCopyAndConvertArrayToCppBuffer<&kTypeInfoFloat64, double>(
|
||||
Local<Array> src, double* dst, uint32_t max_length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
template <CTypeInfo::Identifier type_info_id, typename T>
|
||||
bool V8_EXPORT V8_WARN_UNUSED_RESULT TryToCopyAndConvertArrayToCppBuffer(
|
||||
Local<Array> src, T* dst, uint32_t max_length);
|
||||
|
|
8
deps/v8/include/v8-function.h
vendored
8
deps/v8/include/v8-function.h
vendored
|
@ -106,6 +106,14 @@ class V8_EXPORT Function : public Object {
|
|||
V8_WARN_UNUSED_RESULT MaybeLocal<String> FunctionProtoToString(
|
||||
Local<Context> context);
|
||||
|
||||
/**
|
||||
* Returns true if the function does nothing.
|
||||
* The function returns false on error.
|
||||
* Note that this function is experimental. Embedders should not rely on
|
||||
* this existing. We may remove this function in the future.
|
||||
*/
|
||||
V8_WARN_UNUSED_RESULT bool Experimental_IsNopFunction() const;
|
||||
|
||||
ScriptOrigin GetScriptOrigin() const;
|
||||
V8_INLINE static Function* Cast(Value* value) {
|
||||
#ifdef V8_ENABLE_CHECKS
|
||||
|
|
72
deps/v8/include/v8-initialization.h
vendored
72
deps/v8/include/v8-initialization.h
vendored
|
@ -100,9 +100,6 @@ class V8_EXPORT V8 {
|
|||
const int kBuildConfiguration =
|
||||
(internal::PointerCompressionIsEnabled() ? kPointerCompression : 0) |
|
||||
(internal::SmiValuesAre31Bits() ? k31BitSmis : 0) |
|
||||
(internal::SandboxedExternalPointersAreEnabled()
|
||||
? kSandboxedExternalPointers
|
||||
: 0) |
|
||||
(internal::SandboxIsEnabled() ? kSandbox : 0);
|
||||
return Initialize(kBuildConfiguration);
|
||||
}
|
||||
|
@ -184,30 +181,19 @@ class V8_EXPORT V8 {
|
|||
* V8 was disposed.
|
||||
*/
|
||||
static void DisposePlatform();
|
||||
V8_DEPRECATED("Use DisposePlatform()")
|
||||
static void ShutdownPlatform() { DisposePlatform(); }
|
||||
|
||||
#ifdef V8_SANDBOX
|
||||
//
|
||||
// Sandbox related API.
|
||||
//
|
||||
// This API is not yet stable and subject to changes in the future.
|
||||
//
|
||||
|
||||
#if defined(V8_ENABLE_SANDBOX)
|
||||
/**
|
||||
* Initializes the V8 sandbox.
|
||||
* Returns true if the sandbox is configured securely.
|
||||
*
|
||||
* This must be invoked after the platform was initialized but before V8 is
|
||||
* initialized. The sandbox is torn down during platform shutdown.
|
||||
* Returns true on success, false otherwise.
|
||||
*
|
||||
* TODO(saelo) Once it is no longer optional to initialize the sandbox when
|
||||
* compiling with V8_SANDBOX, the sandbox initialization will likely happen
|
||||
* as part of V8::Initialize, at which point this function should be removed.
|
||||
* If V8 cannot create a regular sandbox during initialization, for example
|
||||
* because not enough virtual address space can be reserved, it will instead
|
||||
* create a fallback sandbox that still allows it to function normally but
|
||||
* does not have the same security properties as a regular sandbox. This API
|
||||
* can be used to determine if such a fallback sandbox is being used, in
|
||||
* which case it will return false.
|
||||
*/
|
||||
static bool InitializeSandbox();
|
||||
V8_DEPRECATE_SOON("Use InitializeSandbox()")
|
||||
static bool InitializeVirtualMemoryCage() { return InitializeSandbox(); }
|
||||
static bool IsSandboxConfiguredSecurely();
|
||||
|
||||
/**
|
||||
* Provides access to the virtual address subspace backing the sandbox.
|
||||
|
@ -220,39 +206,29 @@ class V8_EXPORT V8 {
|
|||
* and so in particular the contents of pages allocagted in this virtual
|
||||
* address space, arbitrarily and concurrently. Due to this, it is
|
||||
* recommended to to only place pure data buffers in them.
|
||||
*
|
||||
* This function must only be called after initializing the sandbox.
|
||||
*/
|
||||
static VirtualAddressSpace* GetSandboxAddressSpace();
|
||||
V8_DEPRECATE_SOON("Use GetSandboxAddressSpace()")
|
||||
static PageAllocator* GetVirtualMemoryCagePageAllocator();
|
||||
|
||||
/**
|
||||
* Returns the size of the sandbox in bytes.
|
||||
*
|
||||
* If the sandbox has not been initialized, or if the initialization failed,
|
||||
* this returns zero.
|
||||
* This represents the size of the address space that V8 can directly address
|
||||
* and in which it allocates its objects.
|
||||
*/
|
||||
static size_t GetSandboxSizeInBytes();
|
||||
V8_DEPRECATE_SOON("Use GetSandboxSizeInBytes()")
|
||||
static size_t GetVirtualMemoryCageSizeInBytes() {
|
||||
return GetSandboxSizeInBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the sandbox is configured securely.
|
||||
* Returns the size of the address space reservation backing the sandbox.
|
||||
*
|
||||
* If V8 cannot create a proper sandbox, it will fall back to creating a
|
||||
* sandbox that doesn't have the desired security properties but at least
|
||||
* still allows V8 to function. This API can be used to determine if such an
|
||||
* insecure sandbox is being used, in which case it will return false.
|
||||
* This may be larger than the sandbox (i.e. |GetSandboxSizeInBytes()|) due
|
||||
* to surrounding guard regions, or may be smaller than the sandbox in case a
|
||||
* fallback sandbox is being used, which will use a smaller virtual address
|
||||
* space reservation. In the latter case this will also be different from
|
||||
* |GetSandboxAddressSpace()->size()| as that will cover a larger part of the
|
||||
* address space than what has actually been reserved.
|
||||
*/
|
||||
static bool IsSandboxConfiguredSecurely();
|
||||
V8_DEPRECATE_SOON("Use IsSandboxConfiguredSecurely()")
|
||||
static bool IsUsingSecureVirtualMemoryCage() {
|
||||
return IsSandboxConfiguredSecurely();
|
||||
}
|
||||
#endif
|
||||
static size_t GetSandboxReservationSizeInBytes();
|
||||
#endif // V8_ENABLE_SANDBOX
|
||||
|
||||
/**
|
||||
* Activate trap-based bounds checking for WebAssembly.
|
||||
|
@ -273,7 +249,7 @@ class V8_EXPORT V8 {
|
|||
* exceptions in V8-generated code.
|
||||
*/
|
||||
static void SetUnhandledExceptionCallback(
|
||||
UnhandledExceptionCallback unhandled_exception_callback);
|
||||
UnhandledExceptionCallback callback);
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -281,8 +257,7 @@ class V8_EXPORT V8 {
|
|||
* v8 has encountered a fatal failure to allocate memory and is about to
|
||||
* terminate.
|
||||
*/
|
||||
|
||||
static void SetFatalMemoryErrorCallback(OOMErrorCallback oom_error_callback);
|
||||
static void SetFatalMemoryErrorCallback(OOMErrorCallback callback);
|
||||
|
||||
/**
|
||||
* Get statistics about the shared memory usage.
|
||||
|
@ -295,8 +270,7 @@ class V8_EXPORT V8 {
|
|||
enum BuildConfigurationFeatures {
|
||||
kPointerCompression = 1 << 0,
|
||||
k31BitSmis = 1 << 1,
|
||||
kSandboxedExternalPointers = 1 << 2,
|
||||
kSandbox = 1 << 3,
|
||||
kSandbox = 1 << 2,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
20
deps/v8/include/v8-inspector.h
vendored
20
deps/v8/include/v8-inspector.h
vendored
|
@ -207,10 +207,10 @@ class V8_EXPORT V8InspectorSession {
|
|||
|
||||
class V8_EXPORT WebDriverValue {
|
||||
public:
|
||||
explicit WebDriverValue(StringView type, v8::MaybeLocal<v8::Value> value = {})
|
||||
: type(type), value(value) {}
|
||||
|
||||
StringView type;
|
||||
explicit WebDriverValue(std::unique_ptr<StringBuffer> type,
|
||||
v8::MaybeLocal<v8::Value> value = {})
|
||||
: type(std::move(type)), value(value) {}
|
||||
std::unique_ptr<StringBuffer> type;
|
||||
v8::MaybeLocal<v8::Value> value;
|
||||
};
|
||||
|
||||
|
@ -219,6 +219,9 @@ class V8_EXPORT V8InspectorClient {
|
|||
virtual ~V8InspectorClient() = default;
|
||||
|
||||
virtual void runMessageLoopOnPause(int contextGroupId) {}
|
||||
virtual void runMessageLoopOnInstrumentationPause(int contextGroupId) {
|
||||
runMessageLoopOnPause(contextGroupId);
|
||||
}
|
||||
virtual void quitMessageLoopOnPause() {}
|
||||
virtual void runIfWaitingForDebugger(int contextGroupId) {}
|
||||
|
||||
|
@ -361,9 +364,12 @@ class V8_EXPORT V8Inspector {
|
|||
virtual void sendNotification(std::unique_ptr<StringBuffer> message) = 0;
|
||||
virtual void flushProtocolNotifications() = 0;
|
||||
};
|
||||
virtual std::unique_ptr<V8InspectorSession> connect(int contextGroupId,
|
||||
Channel*,
|
||||
StringView state) = 0;
|
||||
enum ClientTrustLevel { kUntrusted, kFullyTrusted };
|
||||
virtual std::unique_ptr<V8InspectorSession> connect(
|
||||
int contextGroupId, Channel*, StringView state,
|
||||
ClientTrustLevel client_trust_level) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// API methods.
|
||||
virtual std::unique_ptr<V8StackTrace> createStackTrace(
|
||||
|
|
441
deps/v8/include/v8-internal.h
vendored
441
deps/v8/include/v8-internal.h
vendored
|
@ -8,6 +8,8 @@
|
|||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <type_traits>
|
||||
|
||||
#include "v8-version.h" // NOLINT(build/include_directory)
|
||||
|
@ -50,6 +52,7 @@ const int kHeapObjectTag = 1;
|
|||
const int kWeakHeapObjectTag = 3;
|
||||
const int kHeapObjectTagSize = 2;
|
||||
const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
|
||||
const intptr_t kHeapObjectReferenceTagMask = 1 << (kHeapObjectTagSize - 1);
|
||||
|
||||
// Tag information for fowarding pointers stored in object headers.
|
||||
// 0b00 at the lowest 2 bits in the header indicates that the map word is a
|
||||
|
@ -157,15 +160,7 @@ V8_INLINE static constexpr internal::Address IntToSmi(int value) {
|
|||
* Sandbox related types, constants, and functions.
|
||||
*/
|
||||
constexpr bool SandboxIsEnabled() {
|
||||
#ifdef V8_SANDBOX
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
constexpr bool SandboxedExternalPointersAreEnabled() {
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
#ifdef V8_ENABLE_SANDBOX
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
|
@ -176,19 +171,18 @@ constexpr bool SandboxedExternalPointersAreEnabled() {
|
|||
// for example by storing them as offset rather than as raw pointers.
|
||||
using SandboxedPointer_t = Address;
|
||||
|
||||
// ExternalPointers point to objects located outside the sandbox. When sandboxed
|
||||
// external pointers are enabled, these are stored in an external pointer table
|
||||
// and referenced from HeapObjects through indices.
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
using ExternalPointer_t = uint32_t;
|
||||
#else
|
||||
using ExternalPointer_t = Address;
|
||||
#endif
|
||||
|
||||
#ifdef V8_SANDBOX_IS_AVAILABLE
|
||||
#ifdef V8_ENABLE_SANDBOX
|
||||
|
||||
// Size of the sandbox, excluding the guard regions surrounding it.
|
||||
#ifdef V8_TARGET_OS_ANDROID
|
||||
// On Android, most 64-bit devices seem to be configured with only 39 bits of
|
||||
// virtual address space for userspace. As such, limit the sandbox to 128GB (a
|
||||
// quarter of the total available address space).
|
||||
constexpr size_t kSandboxSizeLog2 = 37; // 128 GB
|
||||
#else
|
||||
// Everywhere else use a 1TB sandbox.
|
||||
constexpr size_t kSandboxSizeLog2 = 40; // 1 TB
|
||||
#endif // V8_OS_ANDROID
|
||||
constexpr size_t kSandboxSize = 1ULL << kSandboxSizeLog2;
|
||||
|
||||
// Required alignment of the sandbox. For simplicity, we require the
|
||||
|
@ -213,20 +207,6 @@ static_assert((kSandboxGuardRegionSize % kSandboxAlignment) == 0,
|
|||
"The size of the guard regions around the sandbox must be a "
|
||||
"multiple of its required alignment.");
|
||||
|
||||
// Minimum size of the sandbox, excluding the guard regions surrounding it. If
|
||||
// the virtual memory reservation for the sandbox fails, its size is currently
|
||||
// halved until either the reservation succeeds or the minimum size is reached.
|
||||
// A minimum of 32GB allows the 4GB pointer compression region as well as the
|
||||
// ArrayBuffer partition and two 10GB Wasm memory cages to fit into the
|
||||
// sandbox. 32GB should also be the minimum possible size of the userspace
|
||||
// address space as there are some machine configurations with only 36 virtual
|
||||
// address bits.
|
||||
constexpr size_t kSandboxMinimumSize = 32ULL * GB;
|
||||
|
||||
static_assert(kSandboxMinimumSize <= kSandboxSize,
|
||||
"The minimal size of the sandbox must be smaller or equal to the "
|
||||
"regular size.");
|
||||
|
||||
// On OSes where reserving virtual memory is too expensive to reserve the
|
||||
// entire address space backing the sandbox, notably Windows pre 8.1, we create
|
||||
// a partially reserved sandbox that doesn't actually reserve most of the
|
||||
|
@ -239,82 +219,253 @@ static_assert(kSandboxMinimumSize <= kSandboxSize,
|
|||
// well as the ArrayBuffer partition.
|
||||
constexpr size_t kSandboxMinimumReservationSize = 8ULL * GB;
|
||||
|
||||
static_assert(kSandboxMinimumSize > kPtrComprCageReservationSize,
|
||||
"The sandbox must be larger than the pointer compression cage "
|
||||
"contained within it.");
|
||||
static_assert(kSandboxMinimumReservationSize > kPtrComprCageReservationSize,
|
||||
"The minimum reservation size for a sandbox must be larger than "
|
||||
"the pointer compression cage contained within it.");
|
||||
|
||||
// For now, even if the sandbox is enabled, we still allow backing stores to be
|
||||
// allocated outside of it as fallback. This will simplify the initial rollout.
|
||||
// However, if sandboxed pointers are also enabled, we must always place
|
||||
// backing stores inside the sandbox as they will be referenced though them.
|
||||
#ifdef V8_SANDBOXED_POINTERS
|
||||
constexpr bool kAllowBackingStoresOutsideSandbox = false;
|
||||
#else
|
||||
constexpr bool kAllowBackingStoresOutsideSandbox = true;
|
||||
#endif // V8_SANDBOXED_POINTERS
|
||||
#endif // V8_ENABLE_SANDBOX
|
||||
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
|
||||
// The size of the virtual memory reservation for an external pointer table.
|
||||
// This determines the maximum number of entries in a table. Using a maximum
|
||||
// size allows omitting bounds checks on table accesses if the indices are
|
||||
// guaranteed (e.g. through shifting) to be below the maximum index. This
|
||||
// value must be a power of two.
|
||||
static const size_t kExternalPointerTableReservationSize = 128 * MB;
|
||||
static const size_t kExternalPointerTableReservationSize = 512 * MB;
|
||||
|
||||
// The maximum number of entries in an external pointer table.
|
||||
static const size_t kMaxSandboxedExternalPointers =
|
||||
static const size_t kMaxExternalPointers =
|
||||
kExternalPointerTableReservationSize / kApiSystemPointerSize;
|
||||
|
||||
// The external pointer table indices stored in HeapObjects as external
|
||||
// pointers are shifted to the left by this amount to guarantee that they are
|
||||
// smaller than the maximum table size.
|
||||
static const uint32_t kExternalPointerIndexShift = 8;
|
||||
static_assert((1 << (32 - kExternalPointerIndexShift)) ==
|
||||
kMaxSandboxedExternalPointers,
|
||||
static const uint32_t kExternalPointerIndexShift = 6;
|
||||
static_assert((1 << (32 - kExternalPointerIndexShift)) == kMaxExternalPointers,
|
||||
"kExternalPointerTableReservationSize and "
|
||||
"kExternalPointerIndexShift don't match");
|
||||
|
||||
#endif // V8_SANDBOX_IS_AVAILABLE
|
||||
#else // !V8_COMPRESS_POINTERS
|
||||
|
||||
// If sandboxed external pointers are enabled, these tag values will be ORed
|
||||
// with the external pointers in the external pointer table to prevent use of
|
||||
// pointers of the wrong type. When a pointer is loaded, it is ANDed with the
|
||||
// inverse of the expected type's tag. The tags are constructed in a way that
|
||||
// guarantees that a failed type check will result in one or more of the top
|
||||
// bits of the pointer to be set, rendering the pointer inacessible. Besides
|
||||
// the type tag bits (48 through 62), the tags also have the GC mark bit (63)
|
||||
// set, so that the mark bit is automatically set when a pointer is written
|
||||
// into the external pointer table (in which case it is clearly alive) and is
|
||||
// cleared when the pointer is loaded. The exception to this is the free entry
|
||||
// tag, which doesn't have the mark bit set, as the entry is not alive. This
|
||||
// Needed for the V8.SandboxedExternalPointersCount histogram.
|
||||
static const size_t kMaxExternalPointers = 0;
|
||||
|
||||
#endif // V8_COMPRESS_POINTERS
|
||||
|
||||
// A ExternalPointerHandle represents a (opaque) reference to an external
|
||||
// pointer that can be stored inside the sandbox. A ExternalPointerHandle has
|
||||
// meaning only in combination with an (active) Isolate as it references an
|
||||
// external pointer stored in the currently active Isolate's
|
||||
// ExternalPointerTable. Internally, an ExternalPointerHandles is simply an
|
||||
// index into an ExternalPointerTable that is shifted to the left to guarantee
|
||||
// that it is smaller than the size of the table.
|
||||
using ExternalPointerHandle = uint32_t;
|
||||
|
||||
// ExternalPointers point to objects located outside the sandbox. When
|
||||
// sandboxed external pointers are enabled, these are stored on heap as
|
||||
// ExternalPointerHandles, otherwise they are simply raw pointers.
|
||||
#ifdef V8_ENABLE_SANDBOX
|
||||
using ExternalPointer_t = ExternalPointerHandle;
|
||||
#else
|
||||
using ExternalPointer_t = Address;
|
||||
#endif
|
||||
|
||||
// When the sandbox is enabled, external pointers are stored in an external
|
||||
// pointer table and are referenced from HeapObjects through an index (a
|
||||
// "handle"). When stored in the table, the pointers are tagged with per-type
|
||||
// tags to prevent type confusion attacks between different external objects.
|
||||
// Besides type information bits, these tags also contain the GC marking bit
|
||||
// which indicates whether the pointer table entry is currently alive. When a
|
||||
// pointer is written into the table, the tag is ORed into the top bits. When
|
||||
// that pointer is later loaded from the table, it is ANDed with the inverse of
|
||||
// the expected tag. If the expected and actual type differ, this will leave
|
||||
// some of the top bits of the pointer set, rendering the pointer inaccessible.
|
||||
// The AND operation also removes the GC marking bit from the pointer.
|
||||
//
|
||||
// The tags are constructed such that UNTAG(TAG(0, T1), T2) != 0 for any two
|
||||
// (distinct) tags T1 and T2. In practice, this is achieved by generating tags
|
||||
// that all have the same number of zeroes and ones but different bit patterns.
|
||||
// With N type tag bits, this allows for (N choose N/2) possible type tags.
|
||||
// Besides the type tag bits, the tags also have the GC marking bit set so that
|
||||
// the marking bit is automatically set when a pointer is written into the
|
||||
// external pointer table (in which case it is clearly alive) and is cleared
|
||||
// when the pointer is loaded. The exception to this is the free entry tag,
|
||||
// which doesn't have the mark bit set, as the entry is not alive. This
|
||||
// construction allows performing the type check and removing GC marking bits
|
||||
// (the MSB) from the pointer at the same time.
|
||||
// Note: this scheme assumes a 48-bit address space and will likely break if
|
||||
// more virtual address bits are used.
|
||||
constexpr uint64_t kExternalPointerTagMask = 0xffff000000000000;
|
||||
// from the pointer in one efficient operation (bitwise AND). The number of
|
||||
// available bits is limited in the following way: on x64, bits [47, 64) are
|
||||
// generally available for tagging (userspace has 47 address bits available).
|
||||
// On Arm64, userspace typically has a 40 or 48 bit address space. However, due
|
||||
// to top-byte ignore (TBI) and memory tagging (MTE), the top byte is unusable
|
||||
// for type checks as type-check failures would go unnoticed or collide with
|
||||
// MTE bits. Some bits of the top byte can, however, still be used for the GC
|
||||
// marking bit. The bits available for the type tags are therefore limited to
|
||||
// [48, 56), i.e. (8 choose 4) = 70 different types.
|
||||
// The following options exist to increase the number of possible types:
|
||||
// - Using multiple ExternalPointerTables since tags can safely be reused
|
||||
// across different tables
|
||||
// - Using "extended" type checks, where additional type information is stored
|
||||
// either in an adjacent pointer table entry or at the pointed-to location
|
||||
// - Using a different tagging scheme, for example based on XOR which would
|
||||
// allow for 2**8 different tags but require a separate operation to remove
|
||||
// the marking bit
|
||||
//
|
||||
// The external pointer sandboxing mechanism ensures that every access to an
|
||||
// external pointer field will result in a valid pointer of the expected type
|
||||
// even in the presence of an attacker able to corrupt memory inside the
|
||||
// sandbox. However, if any data related to the external object is stored
|
||||
// inside the sandbox it may still be corrupted and so must be validated before
|
||||
// use or moved into the external object. Further, an attacker will always be
|
||||
// able to substitute different external pointers of the same type for each
|
||||
// other. Therefore, code using external pointers must be written in a
|
||||
// "substitution-safe" way, i.e. it must always be possible to substitute
|
||||
// external pointers of the same type without causing memory corruption outside
|
||||
// of the sandbox. Generally this is achieved by referencing any group of
|
||||
// related external objects through a single external pointer.
|
||||
//
|
||||
// Currently we use bit 62 for the marking bit which should always be unused as
|
||||
// it's part of the non-canonical address range. When Arm's top-byte ignore
|
||||
// (TBI) is enabled, this bit will be part of the ignored byte, and we assume
|
||||
// that the Embedder is not using this byte (really only this one bit) for any
|
||||
// other purpose. This bit also does not collide with the memory tagging
|
||||
// extension (MTE) which would use bits [56, 60).
|
||||
constexpr uint64_t kExternalPointerMarkBit = 1ULL << 62;
|
||||
constexpr uint64_t kExternalPointerTagMask = 0x40ff000000000000;
|
||||
constexpr uint64_t kExternalPointerTagShift = 48;
|
||||
#define MAKE_TAG(v) (static_cast<uint64_t>(v) << kExternalPointerTagShift)
|
||||
// clang-format off
|
||||
enum ExternalPointerTag : uint64_t {
|
||||
kExternalPointerNullTag = MAKE_TAG(0b0000000000000000),
|
||||
kExternalPointerFreeEntryTag = MAKE_TAG(0b0111111110000000),
|
||||
kExternalStringResourceTag = MAKE_TAG(0b1000000011111111),
|
||||
kExternalStringResourceDataTag = MAKE_TAG(0b1000000101111111),
|
||||
kForeignForeignAddressTag = MAKE_TAG(0b1000000110111111),
|
||||
kNativeContextMicrotaskQueueTag = MAKE_TAG(0b1000000111011111),
|
||||
kEmbedderDataSlotPayloadTag = MAKE_TAG(0b1000000111101111),
|
||||
kCodeEntryPointTag = MAKE_TAG(0b1000000111110111),
|
||||
kExternalObjectValueTag = MAKE_TAG(0b1000000111111011),
|
||||
};
|
||||
// clang-format on
|
||||
#undef MAKE_TAG
|
||||
|
||||
// Converts encoded external pointer to address.
|
||||
V8_EXPORT Address DecodeExternalPointerImpl(const Isolate* isolate,
|
||||
ExternalPointer_t pointer,
|
||||
ExternalPointerTag tag);
|
||||
// All possible 8-bit type tags.
|
||||
// These are sorted so that tags can be grouped together and it can efficiently
|
||||
// be checked if a tag belongs to a given group. See for example the
|
||||
// IsSharedExternalPointerType routine.
|
||||
constexpr uint64_t kAllExternalPointerTypeTags[] = {
|
||||
0b00001111, 0b00010111, 0b00011011, 0b00011101, 0b00011110, 0b00100111,
|
||||
0b00101011, 0b00101101, 0b00101110, 0b00110011, 0b00110101, 0b00110110,
|
||||
0b00111001, 0b00111010, 0b00111100, 0b01000111, 0b01001011, 0b01001101,
|
||||
0b01001110, 0b01010011, 0b01010101, 0b01010110, 0b01011001, 0b01011010,
|
||||
0b01011100, 0b01100011, 0b01100101, 0b01100110, 0b01101001, 0b01101010,
|
||||
0b01101100, 0b01110001, 0b01110010, 0b01110100, 0b01111000, 0b10000111,
|
||||
0b10001011, 0b10001101, 0b10001110, 0b10010011, 0b10010101, 0b10010110,
|
||||
0b10011001, 0b10011010, 0b10011100, 0b10100011, 0b10100101, 0b10100110,
|
||||
0b10101001, 0b10101010, 0b10101100, 0b10110001, 0b10110010, 0b10110100,
|
||||
0b10111000, 0b11000011, 0b11000101, 0b11000110, 0b11001001, 0b11001010,
|
||||
0b11001100, 0b11010001, 0b11010010, 0b11010100, 0b11011000, 0b11100001,
|
||||
0b11100010, 0b11100100, 0b11101000, 0b11110000};
|
||||
|
||||
// clang-format off
|
||||
// New entries should be added with state "sandboxed".
|
||||
// When adding new tags, please ensure that the code using these tags is
|
||||
// "substitution-safe", i.e. still operate safely if external pointers of the
|
||||
// same type are swapped by an attacker. See comment above for more details.
|
||||
#define TAG(i) (kAllExternalPointerTypeTags[i])
|
||||
|
||||
// Shared external pointers are owned by the shared Isolate and stored in the
|
||||
// shared external pointer table associated with that Isolate, where they can
|
||||
// be accessed from multiple threads at the same time. The objects referenced
|
||||
// in this way must therefore always be thread-safe.
|
||||
#define SHARED_EXTERNAL_POINTER_TAGS(V) \
|
||||
V(kFirstSharedTag, sandboxed, TAG(0)) \
|
||||
V(kWaiterQueueNodeTag, sandboxed, TAG(0)) \
|
||||
V(kExternalStringResourceTag, sandboxed, TAG(1)) \
|
||||
V(kExternalStringResourceDataTag, sandboxed, TAG(2)) \
|
||||
V(kLastSharedTag, sandboxed, TAG(2))
|
||||
|
||||
// External pointers using these tags are kept in a per-Isolate external
|
||||
// pointer table and can only be accessed when this Isolate is active.
|
||||
#define PER_ISOLATE_EXTERNAL_POINTER_TAGS(V) \
|
||||
V(kForeignForeignAddressTag, sandboxed, TAG(10)) \
|
||||
V(kNativeContextMicrotaskQueueTag, sandboxed, TAG(11)) \
|
||||
V(kEmbedderDataSlotPayloadTag, sandboxed, TAG(12)) \
|
||||
V(kExternalObjectValueTag, sandboxed, TAG(13)) \
|
||||
V(kCallHandlerInfoCallbackTag, sandboxed, TAG(14)) \
|
||||
V(kAccessorInfoGetterTag, sandboxed, TAG(15)) \
|
||||
V(kAccessorInfoSetterTag, sandboxed, TAG(16)) \
|
||||
V(kWasmInternalFunctionCallTargetTag, sandboxed, TAG(17)) \
|
||||
V(kWasmTypeInfoNativeTypeTag, sandboxed, TAG(18)) \
|
||||
V(kWasmExportedFunctionDataSignatureTag, sandboxed, TAG(19)) \
|
||||
V(kWasmContinuationJmpbufTag, sandboxed, TAG(20))
|
||||
|
||||
// All external pointer tags.
|
||||
#define ALL_EXTERNAL_POINTER_TAGS(V) \
|
||||
SHARED_EXTERNAL_POINTER_TAGS(V) \
|
||||
PER_ISOLATE_EXTERNAL_POINTER_TAGS(V)
|
||||
|
||||
// When the sandbox is enabled, external pointers marked as "sandboxed" above
|
||||
// use the external pointer table (i.e. are sandboxed). This allows a gradual
|
||||
// rollout of external pointer sandboxing. If the sandbox is off, no external
|
||||
// pointers are sandboxed.
|
||||
//
|
||||
// Sandboxed external pointer tags are available when compressing pointers even
|
||||
// when the sandbox is off. Some tags (e.g. kWaiterQueueNodeTag) are used
|
||||
// manually with the external pointer table even when the sandbox is off to ease
|
||||
// alignment requirements.
|
||||
#define sandboxed(X) (X << kExternalPointerTagShift) | kExternalPointerMarkBit
|
||||
#define unsandboxed(X) kUnsandboxedExternalPointerTag
|
||||
#if defined(V8_COMPRESS_POINTERS)
|
||||
#define EXTERNAL_POINTER_TAG_ENUM(Name, State, Bits) Name = State(Bits),
|
||||
#else
|
||||
#define EXTERNAL_POINTER_TAG_ENUM(Name, State, Bits) Name = unsandboxed(Bits),
|
||||
#endif
|
||||
|
||||
#define MAKE_TAG(HasMarkBit, TypeTag) \
|
||||
((static_cast<uint64_t>(TypeTag) << kExternalPointerTagShift) | \
|
||||
(HasMarkBit ? kExternalPointerMarkBit : 0))
|
||||
enum ExternalPointerTag : uint64_t {
|
||||
// Empty tag value. Mostly used as placeholder.
|
||||
kExternalPointerNullTag = MAKE_TAG(0, 0b00000000),
|
||||
// Tag to use for unsandboxed external pointers, which are still stored as
|
||||
// raw pointers on the heap.
|
||||
kUnsandboxedExternalPointerTag = MAKE_TAG(0, 0b00000000),
|
||||
// External pointer tag that will match any external pointer. Use with care!
|
||||
kAnyExternalPointerTag = MAKE_TAG(1, 0b11111111),
|
||||
// The free entry tag has all type bits set so every type check with a
|
||||
// different type fails. It also doesn't have the mark bit set as free
|
||||
// entries are (by definition) not alive.
|
||||
kExternalPointerFreeEntryTag = MAKE_TAG(0, 0b11111111),
|
||||
// Evacuation entries are used during external pointer table compaction.
|
||||
kExternalPointerEvacuationEntryTag = MAKE_TAG(1, 0b11100111),
|
||||
|
||||
ALL_EXTERNAL_POINTER_TAGS(EXTERNAL_POINTER_TAG_ENUM)
|
||||
};
|
||||
|
||||
#undef MAKE_TAG
|
||||
#undef unsandboxed
|
||||
#undef sandboxed
|
||||
#undef TAG
|
||||
#undef EXTERNAL_POINTER_TAG_ENUM
|
||||
|
||||
// clang-format on
|
||||
|
||||
// True if the external pointer is sandboxed and so must be referenced through
|
||||
// an external pointer table.
|
||||
V8_INLINE static constexpr bool IsSandboxedExternalPointerType(
|
||||
ExternalPointerTag tag) {
|
||||
return tag != kUnsandboxedExternalPointerTag;
|
||||
}
|
||||
|
||||
// True if the external pointer must be accessed from the shared isolate's
|
||||
// external pointer table.
|
||||
V8_INLINE static constexpr bool IsSharedExternalPointerType(
|
||||
ExternalPointerTag tag) {
|
||||
return tag >= kFirstSharedTag && tag <= kLastSharedTag;
|
||||
}
|
||||
|
||||
// Sanity checks.
|
||||
#define CHECK_SHARED_EXTERNAL_POINTER_TAGS(Tag, ...) \
|
||||
static_assert(!IsSandboxedExternalPointerType(Tag) || \
|
||||
IsSharedExternalPointerType(Tag));
|
||||
#define CHECK_NON_SHARED_EXTERNAL_POINTER_TAGS(Tag, ...) \
|
||||
static_assert(!IsSandboxedExternalPointerType(Tag) || \
|
||||
!IsSharedExternalPointerType(Tag));
|
||||
|
||||
SHARED_EXTERNAL_POINTER_TAGS(CHECK_SHARED_EXTERNAL_POINTER_TAGS)
|
||||
PER_ISOLATE_EXTERNAL_POINTER_TAGS(CHECK_NON_SHARED_EXTERNAL_POINTER_TAGS)
|
||||
|
||||
#undef CHECK_NON_SHARED_EXTERNAL_POINTER_TAGS
|
||||
#undef CHECK_SHARED_EXTERNAL_POINTER_TAGS
|
||||
|
||||
#undef SHARED_EXTERNAL_POINTER_TAGS
|
||||
#undef EXTERNAL_POINTER_TAGS
|
||||
|
||||
// {obj} must be the raw tagged pointer representation of a HeapObject
|
||||
// that's guaranteed to never be in ReadOnlySpace.
|
||||
|
@ -324,9 +475,6 @@ V8_EXPORT internal::Isolate* IsolateFromNeverReadOnlySpaceObject(Address obj);
|
|||
// mode based on the current context and the closure. This returns true if the
|
||||
// language mode is strict.
|
||||
V8_EXPORT bool ShouldThrowOnError(v8::internal::Isolate* isolate);
|
||||
|
||||
V8_EXPORT bool CanHaveInternalField(int instance_type);
|
||||
|
||||
/**
|
||||
* This class exports constants and functionality from within v8 that
|
||||
* is necessary to implement inline functions in the v8 api. Don't
|
||||
|
@ -354,8 +502,10 @@ class Internals {
|
|||
static const int kFixedArrayHeaderSize = 2 * kApiTaggedSize;
|
||||
static const int kEmbedderDataArrayHeaderSize = 2 * kApiTaggedSize;
|
||||
static const int kEmbedderDataSlotSize = kApiSystemPointerSize;
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
static const int kEmbedderDataSlotRawPayloadOffset = kApiTaggedSize;
|
||||
#ifdef V8_ENABLE_SANDBOX
|
||||
static const int kEmbedderDataSlotExternalPointerOffset = kApiTaggedSize;
|
||||
#else
|
||||
static const int kEmbedderDataSlotExternalPointerOffset = 0;
|
||||
#endif
|
||||
static const int kNativeContextEmbedderDataOffset = 6 * kApiTaggedSize;
|
||||
static const int kStringRepresentationAndEncodingMask = 0x0f;
|
||||
|
@ -365,15 +515,21 @@ class Internals {
|
|||
|
||||
static const uint32_t kNumIsolateDataSlots = 4;
|
||||
static const int kStackGuardSize = 7 * kApiSystemPointerSize;
|
||||
static const int kBuiltinTier0EntryTableSize = 10 * kApiSystemPointerSize;
|
||||
static const int kBuiltinTier0TableSize = 10 * kApiSystemPointerSize;
|
||||
static const int kBuiltinTier0EntryTableSize = 7 * kApiSystemPointerSize;
|
||||
static const int kBuiltinTier0TableSize = 7 * kApiSystemPointerSize;
|
||||
|
||||
// ExternalPointerTable layout guarantees.
|
||||
static const int kExternalPointerTableBufferOffset = 0;
|
||||
static const int kExternalPointerTableSize = 4 * kApiSystemPointerSize;
|
||||
|
||||
// IsolateData layout guarantees.
|
||||
static const int kIsolateCageBaseOffset = 0;
|
||||
static const int kIsolateStackGuardOffset =
|
||||
kIsolateCageBaseOffset + kApiSystemPointerSize;
|
||||
static const int kBuiltinTier0EntryTableOffset =
|
||||
static const int kVariousBooleanFlagsOffset =
|
||||
kIsolateStackGuardOffset + kStackGuardSize;
|
||||
static const int kBuiltinTier0EntryTableOffset =
|
||||
kVariousBooleanFlagsOffset + kApiSystemPointerSize;
|
||||
static const int kBuiltinTier0TableOffset =
|
||||
kBuiltinTier0EntryTableOffset + kBuiltinTier0EntryTableSize;
|
||||
static const int kIsolateEmbedderDataOffset =
|
||||
|
@ -386,14 +542,17 @@ class Internals {
|
|||
kIsolateFastCCallCallerPcOffset + kApiSystemPointerSize;
|
||||
static const int kIsolateLongTaskStatsCounterOffset =
|
||||
kIsolateFastApiCallTargetOffset + kApiSystemPointerSize;
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
static const int kIsolateExternalPointerTableOffset =
|
||||
kIsolateLongTaskStatsCounterOffset + kApiSizetSize;
|
||||
static const int kIsolateSharedExternalPointerTableAddressOffset =
|
||||
kIsolateExternalPointerTableOffset + kExternalPointerTableSize;
|
||||
static const int kIsolateRootsOffset =
|
||||
kIsolateSharedExternalPointerTableAddressOffset + kApiSystemPointerSize;
|
||||
#else
|
||||
static const int kIsolateRootsOffset =
|
||||
kIsolateLongTaskStatsCounterOffset + kApiSizetSize;
|
||||
|
||||
static const int kExternalPointerTableBufferOffset = 0;
|
||||
static const int kExternalPointerTableCapacityOffset =
|
||||
kExternalPointerTableBufferOffset + kApiSystemPointerSize;
|
||||
static const int kExternalPointerTableFreelistHeadOffset =
|
||||
kExternalPointerTableCapacityOffset + kApiInt32Size;
|
||||
#endif
|
||||
|
||||
static const int kUndefinedValueRootIndex = 4;
|
||||
static const int kTheHoleValueRootIndex = 5;
|
||||
|
@ -404,9 +563,8 @@ class Internals {
|
|||
|
||||
static const int kNodeClassIdOffset = 1 * kApiSystemPointerSize;
|
||||
static const int kNodeFlagsOffset = 1 * kApiSystemPointerSize + 3;
|
||||
static const int kNodeStateMask = 0x7;
|
||||
static const int kNodeStateMask = 0x3;
|
||||
static const int kNodeStateIsWeakValue = 2;
|
||||
static const int kNodeStateIsPendingValue = 3;
|
||||
|
||||
static const int kFirstNonstringType = 0x80;
|
||||
static const int kOddballType = 0x83;
|
||||
|
@ -481,6 +639,18 @@ class Internals {
|
|||
return representation == kExternalTwoByteRepresentationTag;
|
||||
}
|
||||
|
||||
V8_INLINE static constexpr bool CanHaveInternalField(int instance_type) {
|
||||
static_assert(kJSObjectType + 1 == kFirstJSApiObjectType);
|
||||
static_assert(kJSObjectType < kLastJSApiObjectType);
|
||||
static_assert(kFirstJSApiObjectType < kLastJSApiObjectType);
|
||||
// Check for IsJSObject() || IsJSSpecialApiObject() || IsJSApiObject()
|
||||
return instance_type == kJSSpecialApiObjectType ||
|
||||
// inlined version of base::IsInRange
|
||||
(static_cast<unsigned>(static_cast<unsigned>(instance_type) -
|
||||
static_cast<unsigned>(kJSObjectType)) <=
|
||||
static_cast<unsigned>(kLastJSApiObjectType - kJSObjectType));
|
||||
}
|
||||
|
||||
V8_INLINE static uint8_t GetNodeFlag(internal::Address* obj, int shift) {
|
||||
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
||||
return *addr & static_cast<uint8_t>(1U << shift);
|
||||
|
@ -532,6 +702,25 @@ class Internals {
|
|||
return reinterpret_cast<internal::Address*>(addr);
|
||||
}
|
||||
|
||||
#ifdef V8_ENABLE_SANDBOX
|
||||
V8_INLINE static internal::Address* GetExternalPointerTableBase(
|
||||
v8::Isolate* isolate) {
|
||||
internal::Address addr = reinterpret_cast<internal::Address>(isolate) +
|
||||
kIsolateExternalPointerTableOffset +
|
||||
kExternalPointerTableBufferOffset;
|
||||
return *reinterpret_cast<internal::Address**>(addr);
|
||||
}
|
||||
|
||||
V8_INLINE static internal::Address* GetSharedExternalPointerTableBase(
|
||||
v8::Isolate* isolate) {
|
||||
internal::Address addr = reinterpret_cast<internal::Address>(isolate) +
|
||||
kIsolateSharedExternalPointerTableAddressOffset;
|
||||
addr = *reinterpret_cast<internal::Address*>(addr);
|
||||
addr += kExternalPointerTableBufferOffset;
|
||||
return *reinterpret_cast<internal::Address**>(addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
template <typename T>
|
||||
V8_INLINE static T ReadRawField(internal::Address heap_object_ptr,
|
||||
int offset) {
|
||||
|
@ -572,38 +761,38 @@ class Internals {
|
|||
#endif
|
||||
}
|
||||
|
||||
V8_INLINE static internal::Isolate* GetIsolateForSandbox(
|
||||
internal::Address obj) {
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
return internal::IsolateFromNeverReadOnlySpaceObject(obj);
|
||||
V8_INLINE static v8::Isolate* GetIsolateForSandbox(internal::Address obj) {
|
||||
#ifdef V8_ENABLE_SANDBOX
|
||||
return reinterpret_cast<v8::Isolate*>(
|
||||
internal::IsolateFromNeverReadOnlySpaceObject(obj));
|
||||
#else
|
||||
// Not used in non-sandbox mode.
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
V8_INLINE static Address DecodeExternalPointer(
|
||||
const Isolate* isolate, ExternalPointer_t encoded_pointer,
|
||||
ExternalPointerTag tag) {
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
return internal::DecodeExternalPointerImpl(isolate, encoded_pointer, tag);
|
||||
#else
|
||||
return encoded_pointer;
|
||||
#endif
|
||||
}
|
||||
|
||||
template <ExternalPointerTag tag>
|
||||
V8_INLINE static internal::Address ReadExternalPointerField(
|
||||
internal::Isolate* isolate, internal::Address heap_object_ptr, int offset,
|
||||
ExternalPointerTag tag) {
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
internal::ExternalPointer_t encoded_value =
|
||||
ReadRawField<uint32_t>(heap_object_ptr, offset);
|
||||
// We currently have to treat zero as nullptr in embedder slots.
|
||||
return encoded_value ? DecodeExternalPointer(isolate, encoded_value, tag)
|
||||
: 0;
|
||||
#else
|
||||
return ReadRawField<Address>(heap_object_ptr, offset);
|
||||
v8::Isolate* isolate, internal::Address heap_object_ptr, int offset) {
|
||||
#ifdef V8_ENABLE_SANDBOX
|
||||
if (IsSandboxedExternalPointerType(tag)) {
|
||||
// See src/sandbox/external-pointer-table-inl.h. Logic duplicated here so
|
||||
// it can be inlined and doesn't require an additional call.
|
||||
internal::Address* table =
|
||||
IsSharedExternalPointerType(tag)
|
||||
? GetSharedExternalPointerTableBase(isolate)
|
||||
: GetExternalPointerTableBase(isolate);
|
||||
internal::ExternalPointerHandle handle =
|
||||
ReadRawField<ExternalPointerHandle>(heap_object_ptr, offset);
|
||||
uint32_t index = handle >> kExternalPointerIndexShift;
|
||||
std::atomic<internal::Address>* ptr =
|
||||
reinterpret_cast<std::atomic<internal::Address>*>(&table[index]);
|
||||
internal::Address entry =
|
||||
std::atomic_load_explicit(ptr, std::memory_order_relaxed);
|
||||
return entry & ~tag;
|
||||
}
|
||||
#endif
|
||||
return ReadRawField<Address>(heap_object_ptr, offset);
|
||||
}
|
||||
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
|
@ -652,7 +841,7 @@ class BackingStoreBase {};
|
|||
|
||||
// The maximum value in enum GarbageCollectionReason, defined in heap.h.
|
||||
// This is needed for histograms sampling garbage collection reasons.
|
||||
constexpr int kGarbageCollectionReasonMaxValue = 25;
|
||||
constexpr int kGarbageCollectionReasonMaxValue = 27;
|
||||
|
||||
} // namespace internal
|
||||
|
||||
|
|
68
deps/v8/include/v8-isolate.h
vendored
68
deps/v8/include/v8-isolate.h
vendored
|
@ -194,6 +194,11 @@ enum RAILMode : unsigned {
|
|||
*/
|
||||
enum class MemoryPressureLevel { kNone, kModerate, kCritical };
|
||||
|
||||
/**
|
||||
* Indicator for the stack state.
|
||||
*/
|
||||
using StackState = cppgc::EmbedderStackState;
|
||||
|
||||
/**
|
||||
* Isolate represents an isolated instance of the V8 engine. V8 isolates have
|
||||
* completely separate states. Objects from one isolate must not be used in
|
||||
|
@ -211,6 +216,8 @@ class V8_EXPORT Isolate {
|
|||
CreateParams();
|
||||
~CreateParams();
|
||||
|
||||
ALLOW_COPY_AND_MOVE_WITH_DEPRECATED_FIELDS(CreateParams)
|
||||
|
||||
/**
|
||||
* Allows the host application to provide the address of a function that is
|
||||
* notified each time code is added, moved or removed.
|
||||
|
@ -287,12 +294,6 @@ class V8_EXPORT Isolate {
|
|||
*/
|
||||
FatalErrorCallback fatal_error_callback = nullptr;
|
||||
OOMErrorCallback oom_error_callback = nullptr;
|
||||
|
||||
/**
|
||||
* The following parameter is experimental and may change significantly.
|
||||
* This is currently for internal testing.
|
||||
*/
|
||||
Isolate* experimental_attach_to_shared_isolate = nullptr;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -301,16 +302,18 @@ class V8_EXPORT Isolate {
|
|||
*/
|
||||
class V8_EXPORT V8_NODISCARD Scope {
|
||||
public:
|
||||
explicit Scope(Isolate* isolate) : isolate_(isolate) { isolate->Enter(); }
|
||||
explicit Scope(Isolate* isolate) : v8_isolate_(isolate) {
|
||||
v8_isolate_->Enter();
|
||||
}
|
||||
|
||||
~Scope() { isolate_->Exit(); }
|
||||
~Scope() { v8_isolate_->Exit(); }
|
||||
|
||||
// Prevent copying of Scope objects.
|
||||
Scope(const Scope&) = delete;
|
||||
Scope& operator=(const Scope&) = delete;
|
||||
|
||||
private:
|
||||
Isolate* const isolate_;
|
||||
Isolate* const v8_isolate_;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -331,7 +334,7 @@ class V8_EXPORT Isolate {
|
|||
|
||||
private:
|
||||
OnFailure on_failure_;
|
||||
Isolate* isolate_;
|
||||
v8::Isolate* v8_isolate_;
|
||||
|
||||
bool was_execution_allowed_assert_;
|
||||
bool was_execution_allowed_throws_;
|
||||
|
@ -353,7 +356,7 @@ class V8_EXPORT Isolate {
|
|||
const AllowJavascriptExecutionScope&) = delete;
|
||||
|
||||
private:
|
||||
Isolate* isolate_;
|
||||
Isolate* v8_isolate_;
|
||||
bool was_execution_allowed_assert_;
|
||||
bool was_execution_allowed_throws_;
|
||||
bool was_execution_allowed_dump_;
|
||||
|
@ -376,7 +379,7 @@ class V8_EXPORT Isolate {
|
|||
const SuppressMicrotaskExecutionScope&) = delete;
|
||||
|
||||
private:
|
||||
internal::Isolate* const isolate_;
|
||||
internal::Isolate* const i_isolate_;
|
||||
internal::MicrotaskQueue* const microtask_queue_;
|
||||
internal::Address previous_stack_height_;
|
||||
|
||||
|
@ -389,7 +392,7 @@ class V8_EXPORT Isolate {
|
|||
*/
|
||||
class V8_EXPORT V8_NODISCARD SafeForTerminationScope {
|
||||
public:
|
||||
explicit SafeForTerminationScope(v8::Isolate* isolate);
|
||||
explicit SafeForTerminationScope(v8::Isolate* v8_isolate);
|
||||
~SafeForTerminationScope();
|
||||
|
||||
// Prevent copying of Scope objects.
|
||||
|
@ -397,7 +400,7 @@ class V8_EXPORT Isolate {
|
|||
SafeForTerminationScope& operator=(const SafeForTerminationScope&) = delete;
|
||||
|
||||
private:
|
||||
internal::Isolate* isolate_;
|
||||
internal::Isolate* i_isolate_;
|
||||
bool prev_value_;
|
||||
};
|
||||
|
||||
|
@ -531,6 +534,8 @@ class V8_EXPORT Isolate {
|
|||
kInvalidatedMegaDOMProtector = 112,
|
||||
kFunctionPrototypeArguments = 113,
|
||||
kFunctionPrototypeCaller = 114,
|
||||
kTurboFanOsrCompileStarted = 115,
|
||||
kAsyncStackTaggingCreateTaskCall = 116,
|
||||
|
||||
// If you add new values here, you'll also need to update Chromium's:
|
||||
// web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
|
||||
|
@ -636,9 +641,6 @@ class V8_EXPORT Isolate {
|
|||
* This specifies the callback called by the upcoming dynamic
|
||||
* import() language feature to load modules.
|
||||
*/
|
||||
V8_DEPRECATED("Use HostImportModuleDynamicallyCallback")
|
||||
void SetHostImportModuleDynamicallyCallback(
|
||||
HostImportModuleDynamicallyWithImportAssertionsCallback callback);
|
||||
void SetHostImportModuleDynamicallyCallback(
|
||||
HostImportModuleDynamicallyCallback callback);
|
||||
|
||||
|
@ -839,12 +841,6 @@ class V8_EXPORT Isolate {
|
|||
*/
|
||||
int64_t AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes);
|
||||
|
||||
/**
|
||||
* Returns the number of phantom handles without callbacks that were reset
|
||||
* by the garbage collector since the last call to this function.
|
||||
*/
|
||||
size_t NumberOfPhantomHandleResetsSinceLastCall();
|
||||
|
||||
/**
|
||||
* Returns heap profiler for this isolate. Will return NULL until the isolate
|
||||
* is initialized.
|
||||
|
@ -927,6 +923,7 @@ class V8_EXPORT Isolate {
|
|||
void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr);
|
||||
void RemoveGCPrologueCallback(GCCallback callback);
|
||||
|
||||
START_ALLOW_USE_DEPRECATED()
|
||||
/**
|
||||
* Sets the embedder heap tracer for the isolate.
|
||||
* SetEmbedderHeapTracer cannot be used simultaneously with AttachCppHeap.
|
||||
|
@ -938,6 +935,7 @@ class V8_EXPORT Isolate {
|
|||
* SetEmbedderHeapTracer.
|
||||
*/
|
||||
EmbedderHeapTracer* GetEmbedderHeapTracer();
|
||||
END_ALLOW_USE_DEPRECATED()
|
||||
|
||||
/**
|
||||
* Sets an embedder roots handle that V8 should consider when performing
|
||||
|
@ -1163,9 +1161,8 @@ class V8_EXPORT Isolate {
|
|||
* LowMemoryNotification() instead to influence the garbage collection
|
||||
* schedule.
|
||||
*/
|
||||
void RequestGarbageCollectionForTesting(
|
||||
GarbageCollectionType type,
|
||||
EmbedderHeapTracer::EmbedderStackState stack_state);
|
||||
void RequestGarbageCollectionForTesting(GarbageCollectionType type,
|
||||
StackState stack_state);
|
||||
|
||||
/**
|
||||
* Set the callback to invoke for logging event.
|
||||
|
@ -1523,15 +1520,15 @@ class V8_EXPORT Isolate {
|
|||
|
||||
void SetWasmStreamingCallback(WasmStreamingCallback callback);
|
||||
|
||||
void SetWasmAsyncResolvePromiseCallback(
|
||||
WasmAsyncResolvePromiseCallback callback);
|
||||
|
||||
void SetWasmLoadSourceMapCallback(WasmLoadSourceMapCallback callback);
|
||||
|
||||
void SetWasmSimdEnabledCallback(WasmSimdEnabledCallback callback);
|
||||
|
||||
void SetWasmExceptionsEnabledCallback(WasmExceptionsEnabledCallback callback);
|
||||
|
||||
void SetWasmDynamicTieringEnabledCallback(
|
||||
WasmDynamicTieringEnabledCallback callback);
|
||||
|
||||
void SetSharedArrayBufferConstructorEnabledCallback(
|
||||
SharedArrayBufferConstructorEnabledCallback callback);
|
||||
|
||||
|
@ -1598,19 +1595,6 @@ class V8_EXPORT Isolate {
|
|||
*/
|
||||
void VisitExternalResources(ExternalResourceVisitor* visitor);
|
||||
|
||||
/**
|
||||
* Iterates through all the persistent handles in the current isolate's heap
|
||||
* that have class_ids.
|
||||
*/
|
||||
void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);
|
||||
|
||||
/**
|
||||
* Iterates through all the persistent handles in the current isolate's heap
|
||||
* that have class_ids and are weak to be marked as inactive if there is no
|
||||
* pending activity for the handle.
|
||||
*/
|
||||
void VisitWeakHandles(PersistentHandleVisitor* visitor);
|
||||
|
||||
/**
|
||||
* Check if this isolate is in use.
|
||||
* True if at least one thread Enter'ed this isolate.
|
||||
|
|
10
deps/v8/include/v8-local-handle.h
vendored
10
deps/v8/include/v8-local-handle.h
vendored
|
@ -86,7 +86,7 @@ class V8_EXPORT V8_NODISCARD HandleScope {
|
|||
static int NumberOfHandles(Isolate* isolate);
|
||||
|
||||
V8_INLINE Isolate* GetIsolate() const {
|
||||
return reinterpret_cast<Isolate*>(isolate_);
|
||||
return reinterpret_cast<Isolate*>(i_isolate_);
|
||||
}
|
||||
|
||||
HandleScope(const HandleScope&) = delete;
|
||||
|
@ -97,7 +97,7 @@ class V8_EXPORT V8_NODISCARD HandleScope {
|
|||
|
||||
void Initialize(Isolate* isolate);
|
||||
|
||||
static internal::Address* CreateHandle(internal::Isolate* isolate,
|
||||
static internal::Address* CreateHandle(internal::Isolate* i_isolate,
|
||||
internal::Address value);
|
||||
|
||||
private:
|
||||
|
@ -108,7 +108,7 @@ class V8_EXPORT V8_NODISCARD HandleScope {
|
|||
void operator delete(void*, size_t);
|
||||
void operator delete[](void*, size_t);
|
||||
|
||||
internal::Isolate* isolate_;
|
||||
internal::Isolate* i_isolate_;
|
||||
internal::Address* prev_next_;
|
||||
internal::Address* prev_limit_;
|
||||
|
||||
|
@ -354,7 +354,7 @@ class MaybeLocal {
|
|||
|
||||
/**
|
||||
* Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
|
||||
* |false| is returned and |out| is left untouched.
|
||||
* |false| is returned and |out| is assigned with nullptr.
|
||||
*/
|
||||
template <class S>
|
||||
V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local<S>* out) const {
|
||||
|
@ -445,7 +445,7 @@ class V8_EXPORT V8_NODISCARD SealHandleScope {
|
|||
void operator delete(void*, size_t);
|
||||
void operator delete[](void*, size_t);
|
||||
|
||||
internal::Isolate* const isolate_;
|
||||
internal::Isolate* const i_isolate_;
|
||||
internal::Address* prev_limit_;
|
||||
int prev_sealed_level_;
|
||||
};
|
||||
|
|
11
deps/v8/include/v8-locker.h
vendored
11
deps/v8/include/v8-locker.h
vendored
|
@ -121,17 +121,6 @@ class V8_EXPORT Locker {
|
|||
*/
|
||||
static bool IsLocked(Isolate* isolate);
|
||||
|
||||
/**
|
||||
* Returns whether any v8::Locker has ever been used in this process.
|
||||
* TODO(cbruni, chromium:1240851): Fix locking checks on a per-thread basis.
|
||||
* The current implementation is quite confusing and leads to unexpected
|
||||
* results if anybody uses v8::Locker in the current process.
|
||||
*/
|
||||
V8_DEPRECATE_SOON("This method will be removed.")
|
||||
static bool WasEverUsed();
|
||||
V8_DEPRECATED("Use WasEverUsed instead")
|
||||
static bool IsActive();
|
||||
|
||||
// Disallow copying and assigning.
|
||||
Locker(const Locker&) = delete;
|
||||
void operator=(const Locker&) = delete;
|
||||
|
|
25
deps/v8/include/v8-maybe.h
vendored
25
deps/v8/include/v8-maybe.h
vendored
|
@ -5,6 +5,9 @@
|
|||
#ifndef INCLUDE_V8_MAYBE_H_
|
||||
#define INCLUDE_V8_MAYBE_H_
|
||||
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#include "v8-internal.h" // NOLINT(build/include_directory)
|
||||
#include "v8config.h" // NOLINT(build/include_directory)
|
||||
|
||||
|
@ -57,11 +60,20 @@ class Maybe {
|
|||
* Converts this Maybe<> to a value of type T. If this Maybe<> is
|
||||
* nothing (empty), V8 will crash the process.
|
||||
*/
|
||||
V8_INLINE T FromJust() const {
|
||||
V8_INLINE T FromJust() const& {
|
||||
if (V8_UNLIKELY(!IsJust())) api_internal::FromJustIsNothing();
|
||||
return value_;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts this Maybe<> to a value of type T. If this Maybe<> is
|
||||
* nothing (empty), V8 will crash the process.
|
||||
*/
|
||||
V8_INLINE T FromJust() && {
|
||||
if (V8_UNLIKELY(!IsJust())) api_internal::FromJustIsNothing();
|
||||
return std::move(value_);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts this Maybe<> to a value of type T, using a default value if this
|
||||
* Maybe<> is nothing (empty).
|
||||
|
@ -82,6 +94,7 @@ class Maybe {
|
|||
private:
|
||||
Maybe() : has_value_(false) {}
|
||||
explicit Maybe(const T& t) : has_value_(true), value_(t) {}
|
||||
explicit Maybe(T&& t) : has_value_(true), value_(std::move(t)) {}
|
||||
|
||||
bool has_value_;
|
||||
T value_;
|
||||
|
@ -90,6 +103,8 @@ class Maybe {
|
|||
friend Maybe<U> Nothing();
|
||||
template <class U>
|
||||
friend Maybe<U> Just(const U& u);
|
||||
template <class U, std::enable_if_t<!std::is_lvalue_reference_v<U>>*>
|
||||
friend Maybe<U> Just(U&& u);
|
||||
};
|
||||
|
||||
template <class T>
|
||||
|
@ -102,6 +117,14 @@ inline Maybe<T> Just(const T& t) {
|
|||
return Maybe<T>(t);
|
||||
}
|
||||
|
||||
// Don't use forwarding references here but instead use two overloads.
|
||||
// Forwarding references only work when type deduction takes place, which is not
|
||||
// the case for callsites such as Just<Type>(t).
|
||||
template <class T, std::enable_if_t<!std::is_lvalue_reference_v<T>>* = nullptr>
|
||||
inline Maybe<T> Just(T&& t) {
|
||||
return Maybe<T>(std::move(t));
|
||||
}
|
||||
|
||||
// A template specialization of Maybe<T> for the case of T = void.
|
||||
template <>
|
||||
class Maybe<void> {
|
||||
|
|
6
deps/v8/include/v8-message.h
vendored
6
deps/v8/include/v8-message.h
vendored
|
@ -70,7 +70,7 @@ class V8_EXPORT ScriptOrigin {
|
|||
bool resource_is_opaque = false, bool is_wasm = false,
|
||||
bool is_module = false,
|
||||
Local<Data> host_defined_options = Local<Data>())
|
||||
: isolate_(isolate),
|
||||
: v8_isolate_(isolate),
|
||||
resource_name_(resource_name),
|
||||
resource_line_offset_(resource_line_offset),
|
||||
resource_column_offset_(resource_column_offset),
|
||||
|
@ -87,14 +87,12 @@ class V8_EXPORT ScriptOrigin {
|
|||
V8_INLINE int ColumnOffset() const;
|
||||
V8_INLINE int ScriptId() const;
|
||||
V8_INLINE Local<Value> SourceMapUrl() const;
|
||||
V8_DEPRECATE_SOON("Use GetHostDefinedOptions")
|
||||
Local<PrimitiveArray> HostDefinedOptions() const;
|
||||
V8_INLINE Local<Data> GetHostDefinedOptions() const;
|
||||
V8_INLINE ScriptOriginOptions Options() const { return options_; }
|
||||
|
||||
private:
|
||||
void VerifyHostDefinedOptions() const;
|
||||
Isolate* isolate_;
|
||||
Isolate* v8_isolate_;
|
||||
Local<Value> resource_name_;
|
||||
int resource_line_offset_;
|
||||
int resource_column_offset_;
|
||||
|
|
58
deps/v8/include/v8-metrics.h
vendored
58
deps/v8/include/v8-metrics.h
vendored
|
@ -125,31 +125,10 @@ struct WasmModuleInstantiated {
|
|||
int64_t wall_clock_duration_in_us = -1;
|
||||
};
|
||||
|
||||
struct WasmModuleTieredUp {
|
||||
bool lazy = false;
|
||||
size_t code_size_in_bytes = 0;
|
||||
int64_t wall_clock_duration_in_us = -1;
|
||||
int64_t cpu_duration_in_us = -1;
|
||||
};
|
||||
|
||||
struct WasmModulesPerIsolate {
|
||||
size_t count = 0;
|
||||
};
|
||||
|
||||
#define V8_MAIN_THREAD_METRICS_EVENTS(V) \
|
||||
V(GarbageCollectionFullCycle) \
|
||||
V(GarbageCollectionFullMainThreadIncrementalMark) \
|
||||
V(GarbageCollectionFullMainThreadBatchedIncrementalMark) \
|
||||
V(GarbageCollectionFullMainThreadIncrementalSweep) \
|
||||
V(GarbageCollectionFullMainThreadBatchedIncrementalSweep) \
|
||||
V(GarbageCollectionYoungCycle) \
|
||||
V(WasmModuleDecoded) \
|
||||
V(WasmModuleCompiled) \
|
||||
V(WasmModuleInstantiated) \
|
||||
V(WasmModuleTieredUp)
|
||||
|
||||
#define V8_THREAD_SAFE_METRICS_EVENTS(V) V(WasmModulesPerIsolate)
|
||||
|
||||
/**
|
||||
* This class serves as a base class for recording event-based metrics in V8.
|
||||
* There a two kinds of metrics, those which are expected to be thread-safe and
|
||||
|
@ -159,19 +138,6 @@ struct WasmModulesPerIsolate {
|
|||
* background thread, it will be delayed and executed by the foreground task
|
||||
* runner.
|
||||
*
|
||||
* The thread-safe events are listed in the V8_THREAD_SAFE_METRICS_EVENTS
|
||||
* macro above while the main thread event are listed in
|
||||
* V8_MAIN_THREAD_METRICS_EVENTS above. For the former, a virtual method
|
||||
* AddMainThreadEvent(const E& event, v8::Context::Token token) will be
|
||||
* generated and for the latter AddThreadSafeEvent(const E& event).
|
||||
*
|
||||
* Thread-safe events are not allowed to access the context and therefore do
|
||||
* not carry a context ID with them. These IDs can be generated using
|
||||
* Recorder::GetContextId() and the ID will be valid throughout the lifetime
|
||||
* of the isolate. It is not guaranteed that the ID will still resolve to
|
||||
* a valid context using Recorder::GetContext() at the time the metric is
|
||||
* recorded. In this case, an empty handle will be returned.
|
||||
*
|
||||
* The embedder is expected to call v8::Isolate::SetMetricsRecorder()
|
||||
* providing its implementation and have the virtual methods overwritten
|
||||
* for the events it cares about.
|
||||
|
@ -202,14 +168,30 @@ class V8_EXPORT Recorder {
|
|||
|
||||
virtual ~Recorder() = default;
|
||||
|
||||
// Main thread events. Those are only triggered on the main thread, and hence
|
||||
// can access the context.
|
||||
#define ADD_MAIN_THREAD_EVENT(E) \
|
||||
virtual void AddMainThreadEvent(const E& event, ContextId context_id) {}
|
||||
V8_MAIN_THREAD_METRICS_EVENTS(ADD_MAIN_THREAD_EVENT)
|
||||
virtual void AddMainThreadEvent(const E&, ContextId) {}
|
||||
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullCycle)
|
||||
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadIncrementalMark)
|
||||
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadBatchedIncrementalMark)
|
||||
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadIncrementalSweep)
|
||||
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadBatchedIncrementalSweep)
|
||||
ADD_MAIN_THREAD_EVENT(GarbageCollectionYoungCycle)
|
||||
ADD_MAIN_THREAD_EVENT(WasmModuleDecoded)
|
||||
ADD_MAIN_THREAD_EVENT(WasmModuleCompiled)
|
||||
ADD_MAIN_THREAD_EVENT(WasmModuleInstantiated)
|
||||
#undef ADD_MAIN_THREAD_EVENT
|
||||
|
||||
// Thread-safe events are not allowed to access the context and therefore do
|
||||
// not carry a context ID with them. These IDs can be generated using
|
||||
// Recorder::GetContextId() and the ID will be valid throughout the lifetime
|
||||
// of the isolate. It is not guaranteed that the ID will still resolve to
|
||||
// a valid context using Recorder::GetContext() at the time the metric is
|
||||
// recorded. In this case, an empty handle will be returned.
|
||||
#define ADD_THREAD_SAFE_EVENT(E) \
|
||||
virtual void AddThreadSafeEvent(const E& event) {}
|
||||
V8_THREAD_SAFE_METRICS_EVENTS(ADD_THREAD_SAFE_EVENT)
|
||||
virtual void AddThreadSafeEvent(const E&) {}
|
||||
ADD_THREAD_SAFE_EVENT(WasmModulesPerIsolate)
|
||||
#undef ADD_THREAD_SAFE_EVENT
|
||||
|
||||
virtual void NotifyIsolateDisposal() {}
|
||||
|
|
2
deps/v8/include/v8-microtask-queue.h
vendored
2
deps/v8/include/v8-microtask-queue.h
vendored
|
@ -142,7 +142,7 @@ class V8_EXPORT V8_NODISCARD MicrotasksScope {
|
|||
MicrotasksScope& operator=(const MicrotasksScope&) = delete;
|
||||
|
||||
private:
|
||||
internal::Isolate* const isolate_;
|
||||
internal::Isolate* const i_isolate_;
|
||||
internal::MicrotaskQueue* const microtask_queue_;
|
||||
bool run_;
|
||||
};
|
||||
|
|
23
deps/v8/include/v8-object.h
vendored
23
deps/v8/include/v8-object.h
vendored
|
@ -594,8 +594,6 @@ class V8_EXPORT Object : public Value {
|
|||
/**
|
||||
* Returns the context in which the object was created.
|
||||
*/
|
||||
V8_DEPRECATED("Use MaybeLocal<Context> GetCreationContext()")
|
||||
Local<Context> CreationContext();
|
||||
MaybeLocal<Context> GetCreationContext();
|
||||
|
||||
/**
|
||||
|
@ -604,10 +602,6 @@ class V8_EXPORT Object : public Value {
|
|||
Local<Context> GetCreationContextChecked();
|
||||
|
||||
/** Same as above, but works for Persistents */
|
||||
V8_DEPRECATED(
|
||||
"Use MaybeLocal<Context> GetCreationContext(const "
|
||||
"PersistentBase<Object>& object)")
|
||||
static Local<Context> CreationContext(const PersistentBase<Object>& object);
|
||||
V8_INLINE static MaybeLocal<Context> GetCreationContext(
|
||||
const PersistentBase<Object>& object) {
|
||||
return object.val_->GetCreationContext();
|
||||
|
@ -717,7 +711,7 @@ Local<Value> Object::GetInternalField(int index) {
|
|||
// Fast path: If the object is a plain JSObject, which is the common case, we
|
||||
// know where to find the internal fields and can return the value directly.
|
||||
int instance_type = I::GetInstanceType(obj);
|
||||
if (v8::internal::CanHaveInternalField(instance_type)) {
|
||||
if (I::CanHaveInternalField(instance_type)) {
|
||||
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
|
||||
A value = I::ReadRawField<A>(obj, offset);
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
|
@ -742,14 +736,13 @@ void* Object::GetAlignedPointerFromInternalField(int index) {
|
|||
// Fast path: If the object is a plain JSObject, which is the common case, we
|
||||
// know where to find the internal fields and can return the value directly.
|
||||
auto instance_type = I::GetInstanceType(obj);
|
||||
if (v8::internal::CanHaveInternalField(instance_type)) {
|
||||
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
|
||||
#ifdef V8_SANDBOXED_EXTERNAL_POINTERS
|
||||
offset += I::kEmbedderDataSlotRawPayloadOffset;
|
||||
#endif
|
||||
internal::Isolate* isolate = I::GetIsolateForSandbox(obj);
|
||||
A value = I::ReadExternalPointerField(
|
||||
isolate, obj, offset, internal::kEmbedderDataSlotPayloadTag);
|
||||
if (I::CanHaveInternalField(instance_type)) {
|
||||
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index) +
|
||||
I::kEmbedderDataSlotExternalPointerOffset;
|
||||
Isolate* isolate = I::GetIsolateForSandbox(obj);
|
||||
A value =
|
||||
I::ReadExternalPointerField<internal::kEmbedderDataSlotPayloadTag>(
|
||||
isolate, obj, offset);
|
||||
return reinterpret_cast<void*>(value);
|
||||
}
|
||||
#endif
|
||||
|
|
4
deps/v8/include/v8-persistent-handle.h
vendored
4
deps/v8/include/v8-persistent-handle.h
vendored
|
@ -169,8 +169,6 @@ class PersistentBase {
|
|||
* Turns this handle into a weak phantom handle without finalization callback.
|
||||
* The handle will be reset automatically when the garbage collector detects
|
||||
* that the object is no longer reachable.
|
||||
* A related function Isolate::NumberOfPhantomHandleResetsSinceLastCall
|
||||
* returns how many phantom handles were reset by the garbage collector.
|
||||
*/
|
||||
V8_INLINE void SetWeak();
|
||||
|
||||
|
@ -254,7 +252,7 @@ class NonCopyablePersistentTraits {
|
|||
* This will clone the contents of storage cell, but not any of the flags, etc.
|
||||
*/
|
||||
template <class T>
|
||||
struct CopyablePersistentTraits {
|
||||
struct V8_DEPRECATED("Use v8::Global instead") CopyablePersistentTraits {
|
||||
using CopyablePersistent = Persistent<T, CopyablePersistentTraits<T>>;
|
||||
static const bool kResetInDestructor = true;
|
||||
template <class S, class M>
|
||||
|
|
69
deps/v8/include/v8-platform.h
vendored
69
deps/v8/include/v8-platform.h
vendored
|
@ -158,9 +158,10 @@ class TaskRunner {
|
|||
class JobDelegate {
|
||||
public:
|
||||
/**
|
||||
* Returns true if this thread should return from the worker task on the
|
||||
* Returns true if this thread *must* return from the worker task on the
|
||||
* current thread ASAP. Workers should periodically invoke ShouldYield (or
|
||||
* YieldIfNeeded()) as often as is reasonable.
|
||||
* After this method returned true, ShouldYield must not be called again.
|
||||
*/
|
||||
virtual bool ShouldYield() = 0;
|
||||
|
||||
|
@ -429,6 +430,17 @@ class PageAllocator {
|
|||
virtual bool SetPermissions(void* address, size_t length,
|
||||
Permission permissions) = 0;
|
||||
|
||||
/**
|
||||
* Recommits discarded pages in the given range with given permissions.
|
||||
* Discarded pages must be recommitted with their original permissions
|
||||
* before they are used again.
|
||||
*/
|
||||
virtual bool RecommitPages(void* address, size_t length,
|
||||
Permission permissions) {
|
||||
// TODO(v8:12797): make it pure once it's implemented on Chromium side.
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Frees memory in the given [address, address + size) range. address and size
|
||||
* should be operating system page-aligned. The next write to this
|
||||
|
@ -698,6 +710,10 @@ class VirtualAddressSpace {
|
|||
/**
|
||||
* Sets permissions of all allocated pages in the given range.
|
||||
*
|
||||
* This operation can fail due to OOM, in which case false is returned. If
|
||||
* the operation fails for a reason other than OOM, this function will
|
||||
* terminate the process as this implies a bug in the client.
|
||||
*
|
||||
* \param address The start address of the range. Must be aligned to
|
||||
* page_size().
|
||||
*
|
||||
|
@ -706,7 +722,7 @@ class VirtualAddressSpace {
|
|||
*
|
||||
* \param permissions The new permissions for the range.
|
||||
*
|
||||
* \returns true on success, false otherwise.
|
||||
* \returns true on success, false on OOM.
|
||||
*/
|
||||
virtual V8_WARN_UNUSED_RESULT bool SetPagePermissions(
|
||||
Address address, size_t size, PagePermissions permissions) = 0;
|
||||
|
@ -820,6 +836,24 @@ class VirtualAddressSpace {
|
|||
// takes a command enum as parameter.
|
||||
//
|
||||
|
||||
/**
|
||||
* Recommits discarded pages in the given range with given permissions.
|
||||
* Discarded pages must be recommitted with their original permissions
|
||||
* before they are used again.
|
||||
*
|
||||
* \param address The start address of the range. Must be aligned to
|
||||
* page_size().
|
||||
*
|
||||
* \param size The size in bytes of the range. Must be a multiple
|
||||
* of page_size().
|
||||
*
|
||||
* \param permissions The permissions for the range that the pages must have.
|
||||
*
|
||||
* \returns true on success, false otherwise.
|
||||
*/
|
||||
virtual V8_WARN_UNUSED_RESULT bool RecommitPages(
|
||||
Address address, size_t size, PagePermissions permissions) = 0;
|
||||
|
||||
/**
|
||||
* Frees memory in the given [address, address + size) range. address and
|
||||
* size should be aligned to the page_size(). The next write to this memory
|
||||
|
@ -890,10 +924,7 @@ class Platform {
|
|||
/**
|
||||
* Allows the embedder to manage memory page allocations.
|
||||
*/
|
||||
virtual PageAllocator* GetPageAllocator() {
|
||||
// TODO(bbudge) Make this abstract after all embedders implement this.
|
||||
return nullptr;
|
||||
}
|
||||
virtual PageAllocator* GetPageAllocator() = 0;
|
||||
|
||||
/**
|
||||
* Allows the embedder to specify a custom allocator used for zones.
|
||||
|
@ -910,10 +941,7 @@ class Platform {
|
|||
* error.
|
||||
* Embedder overrides of this function must NOT call back into V8.
|
||||
*/
|
||||
virtual void OnCriticalMemoryPressure() {
|
||||
// TODO(bbudge) Remove this when embedders override the following method.
|
||||
// See crbug.com/634547.
|
||||
}
|
||||
virtual void OnCriticalMemoryPressure() {}
|
||||
|
||||
/**
|
||||
* Enables the embedder to respond in cases where V8 can't allocate large
|
||||
|
@ -924,6 +952,7 @@ class Platform {
|
|||
*
|
||||
* Embedder overrides of this function must NOT call back into V8.
|
||||
*/
|
||||
V8_DEPRECATED("Use the method without informative parameter")
|
||||
virtual bool OnCriticalMemoryPressure(size_t length) { return false; }
|
||||
|
||||
/**
|
||||
|
@ -1022,16 +1051,28 @@ class Platform {
|
|||
* thread (A=>B/B=>A deadlock) and [2] JobTask::Run or
|
||||
* JobTask::GetMaxConcurrency may be invoked synchronously from JobHandle
|
||||
* (B=>JobHandle::foo=>B deadlock).
|
||||
*/
|
||||
virtual std::unique_ptr<JobHandle> PostJob(
|
||||
TaskPriority priority, std::unique_ptr<JobTask> job_task) {
|
||||
auto handle = CreateJob(priority, std::move(job_task));
|
||||
handle->NotifyConcurrencyIncrease();
|
||||
return handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and returns a JobHandle associated with a Job. Unlike PostJob(),
|
||||
* this doesn't immediately schedules |worker_task| to run; the Job is then
|
||||
* scheduled by calling either NotifyConcurrencyIncrease() or Join().
|
||||
*
|
||||
* A sufficient PostJob() implementation that uses the default Job provided in
|
||||
* libplatform looks like:
|
||||
* std::unique_ptr<JobHandle> PostJob(
|
||||
* A sufficient CreateJob() implementation that uses the default Job provided
|
||||
* in libplatform looks like:
|
||||
* std::unique_ptr<JobHandle> CreateJob(
|
||||
* TaskPriority priority, std::unique_ptr<JobTask> job_task) override {
|
||||
* return v8::platform::NewDefaultJobHandle(
|
||||
* this, priority, std::move(job_task), NumberOfWorkerThreads());
|
||||
* }
|
||||
*/
|
||||
virtual std::unique_ptr<JobHandle> PostJob(
|
||||
virtual std::unique_ptr<JobHandle> CreateJob(
|
||||
TaskPriority priority, std::unique_ptr<JobTask> job_task) = 0;
|
||||
|
||||
/**
|
||||
|
|
16
deps/v8/include/v8-primitive.h
vendored
16
deps/v8/include/v8-primitive.h
vendored
|
@ -20,6 +20,7 @@ class String;
|
|||
namespace internal {
|
||||
class ExternalString;
|
||||
class ScopedExternalStringLock;
|
||||
class StringForwardingTable;
|
||||
} // namespace internal
|
||||
|
||||
/**
|
||||
|
@ -269,6 +270,7 @@ class V8_EXPORT String : public Name {
|
|||
private:
|
||||
friend class internal::ExternalString;
|
||||
friend class v8::String;
|
||||
friend class internal::StringForwardingTable;
|
||||
friend class internal::ScopedExternalStringLock;
|
||||
};
|
||||
|
||||
|
@ -785,10 +787,9 @@ String::ExternalStringResource* String::GetExternalStringResource() const {
|
|||
|
||||
ExternalStringResource* result;
|
||||
if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
|
||||
internal::Isolate* isolate = I::GetIsolateForSandbox(obj);
|
||||
A value =
|
||||
I::ReadExternalPointerField(isolate, obj, I::kStringResourceOffset,
|
||||
internal::kExternalStringResourceTag);
|
||||
Isolate* isolate = I::GetIsolateForSandbox(obj);
|
||||
A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
|
||||
isolate, obj, I::kStringResourceOffset);
|
||||
result = reinterpret_cast<String::ExternalStringResource*>(value);
|
||||
} else {
|
||||
result = GetExternalStringResourceSlow();
|
||||
|
@ -809,10 +810,9 @@ String::ExternalStringResourceBase* String::GetExternalStringResourceBase(
|
|||
ExternalStringResourceBase* resource;
|
||||
if (type == I::kExternalOneByteRepresentationTag ||
|
||||
type == I::kExternalTwoByteRepresentationTag) {
|
||||
internal::Isolate* isolate = I::GetIsolateForSandbox(obj);
|
||||
A value =
|
||||
I::ReadExternalPointerField(isolate, obj, I::kStringResourceOffset,
|
||||
internal::kExternalStringResourceTag);
|
||||
Isolate* isolate = I::GetIsolateForSandbox(obj);
|
||||
A value = I::ReadExternalPointerField<internal::kExternalStringResourceTag>(
|
||||
isolate, obj, I::kStringResourceOffset);
|
||||
resource = reinterpret_cast<ExternalStringResourceBase*>(value);
|
||||
} else {
|
||||
resource = GetExternalStringResourceBaseSlow(encoding_out);
|
||||
|
|
98
deps/v8/include/v8-profiler.h
vendored
98
deps/v8/include/v8-profiler.h
vendored
|
@ -331,6 +331,9 @@ class V8_EXPORT CpuProfilingOptions {
|
|||
unsigned max_samples = kNoSampleLimit, int sampling_interval_us = 0,
|
||||
MaybeLocal<Context> filter_context = MaybeLocal<Context>());
|
||||
|
||||
CpuProfilingOptions(CpuProfilingOptions&&) = default;
|
||||
CpuProfilingOptions& operator=(CpuProfilingOptions&&) = default;
|
||||
|
||||
CpuProfilingMode mode() const { return mode_; }
|
||||
unsigned max_samples() const { return max_samples_; }
|
||||
int sampling_interval_us() const { return sampling_interval_us_; }
|
||||
|
@ -344,7 +347,7 @@ class V8_EXPORT CpuProfilingOptions {
|
|||
CpuProfilingMode mode_;
|
||||
unsigned max_samples_;
|
||||
int sampling_interval_us_;
|
||||
CopyablePersistentTraits<Context>::CopyablePersistent filter_context_;
|
||||
Global<Context> filter_context_;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -542,7 +545,9 @@ class V8_EXPORT HeapGraphNode {
|
|||
kConsString = 10, // Concatenated string. A pair of pointers to strings.
|
||||
kSlicedString = 11, // Sliced string. A fragment of another string.
|
||||
kSymbol = 12, // A Symbol (ES6).
|
||||
kBigInt = 13 // BigInt.
|
||||
kBigInt = 13, // BigInt.
|
||||
kObjectShape = 14, // Internal data used for tracking the shapes (or
|
||||
// "hidden classes") of JS objects.
|
||||
};
|
||||
|
||||
/** Returns node type (see HeapGraphNode::Type). */
|
||||
|
@ -975,14 +980,71 @@ class V8_EXPORT HeapProfiler {
|
|||
virtual ~ObjectNameResolver() = default;
|
||||
};
|
||||
|
||||
enum class HeapSnapshotMode {
|
||||
/**
|
||||
* Heap snapshot for regular developers.
|
||||
*/
|
||||
kRegular,
|
||||
/**
|
||||
* Heap snapshot is exposing internals that may be useful for experts.
|
||||
*/
|
||||
kExposeInternals,
|
||||
};
|
||||
|
||||
enum class NumericsMode {
|
||||
/**
|
||||
* Numeric values are hidden as they are values of the corresponding
|
||||
* objects.
|
||||
*/
|
||||
kHideNumericValues,
|
||||
/**
|
||||
* Numeric values are exposed in artificial fields.
|
||||
*/
|
||||
kExposeNumericValues
|
||||
};
|
||||
|
||||
struct HeapSnapshotOptions final {
|
||||
// Manually define default constructor here to be able to use it in
|
||||
// `TakeSnapshot()` below.
|
||||
// NOLINTNEXTLINE
|
||||
HeapSnapshotOptions() {}
|
||||
|
||||
/**
|
||||
* The control used to report intermediate progress to.
|
||||
*/
|
||||
ActivityControl* control = nullptr;
|
||||
/**
|
||||
* The resolver used by the snapshot generator to get names for V8 objects.
|
||||
*/
|
||||
ObjectNameResolver* global_object_name_resolver = nullptr;
|
||||
/**
|
||||
* Mode for taking the snapshot, see `HeapSnapshotMode`.
|
||||
*/
|
||||
HeapSnapshotMode snapshot_mode = HeapSnapshotMode::kRegular;
|
||||
/**
|
||||
* Mode for dealing with numeric values, see `NumericsMode`.
|
||||
*/
|
||||
NumericsMode numerics_mode = NumericsMode::kHideNumericValues;
|
||||
};
|
||||
|
||||
/**
|
||||
* Takes a heap snapshot and returns it.
|
||||
* Takes a heap snapshot.
|
||||
*
|
||||
* \returns the snapshot.
|
||||
*/
|
||||
const HeapSnapshot* TakeHeapSnapshot(
|
||||
ActivityControl* control = nullptr,
|
||||
const HeapSnapshotOptions& options = HeapSnapshotOptions());
|
||||
|
||||
/**
|
||||
* Takes a heap snapshot. See `HeapSnapshotOptions` for details on the
|
||||
* parameters.
|
||||
*
|
||||
* \returns the snapshot.
|
||||
*/
|
||||
const HeapSnapshot* TakeHeapSnapshot(
|
||||
ActivityControl* control,
|
||||
ObjectNameResolver* global_object_name_resolver = nullptr,
|
||||
bool treat_global_objects_as_roots = true,
|
||||
bool capture_numeric_value = false);
|
||||
bool hide_internals = true, bool capture_numeric_value = false);
|
||||
|
||||
/**
|
||||
* Starts tracking of heap objects population statistics. After calling
|
||||
|
@ -1101,18 +1163,18 @@ struct HeapStatsUpdate {
|
|||
uint32_t size; // New value of size field for the interval with this index.
|
||||
};
|
||||
|
||||
#define CODE_EVENTS_LIST(V) \
|
||||
V(Builtin) \
|
||||
V(Callback) \
|
||||
V(Eval) \
|
||||
V(Function) \
|
||||
V(InterpretedFunction) \
|
||||
V(Handler) \
|
||||
V(BytecodeHandler) \
|
||||
V(LazyCompile) \
|
||||
V(RegExp) \
|
||||
V(Script) \
|
||||
V(Stub) \
|
||||
#define CODE_EVENTS_LIST(V) \
|
||||
V(Builtin) \
|
||||
V(Callback) \
|
||||
V(Eval) \
|
||||
V(Function) \
|
||||
V(InterpretedFunction) \
|
||||
V(Handler) \
|
||||
V(BytecodeHandler) \
|
||||
V(LazyCompile) /* Unused, use kFunction instead */ \
|
||||
V(RegExp) \
|
||||
V(Script) \
|
||||
V(Stub) \
|
||||
V(Relocation)
|
||||
|
||||
/**
|
||||
|
|
3
deps/v8/include/v8-regexp.h
vendored
3
deps/v8/include/v8-regexp.h
vendored
|
@ -37,9 +37,10 @@ class V8_EXPORT RegExp : public Object {
|
|||
kDotAll = 1 << 5,
|
||||
kLinear = 1 << 6,
|
||||
kHasIndices = 1 << 7,
|
||||
kUnicodeSets = 1 << 8,
|
||||
};
|
||||
|
||||
static constexpr int kFlagCount = 8;
|
||||
static constexpr int kFlagCount = 9;
|
||||
|
||||
/**
|
||||
* Creates a regular expression from the given pattern string and
|
||||
|
|
58
deps/v8/include/v8-script.h
vendored
58
deps/v8/include/v8-script.h
vendored
|
@ -20,6 +20,7 @@
|
|||
namespace v8 {
|
||||
|
||||
class Function;
|
||||
class Message;
|
||||
class Object;
|
||||
class PrimitiveArray;
|
||||
class Script;
|
||||
|
@ -47,8 +48,6 @@ class V8_EXPORT ScriptOrModule {
|
|||
* The options that were passed by the embedder as HostDefinedOptions to
|
||||
* the ScriptOrigin.
|
||||
*/
|
||||
V8_DEPRECATED("Use HostDefinedOptions")
|
||||
Local<PrimitiveArray> GetHostDefinedOptions();
|
||||
Local<Data> HostDefinedOptions();
|
||||
};
|
||||
|
||||
|
@ -78,7 +77,13 @@ class V8_EXPORT UnboundScript {
|
|||
* Returns zero based line number of the code_pos location in the script.
|
||||
* -1 will be returned if no information available.
|
||||
*/
|
||||
int GetLineNumber(int code_pos);
|
||||
int GetLineNumber(int code_pos = 0);
|
||||
|
||||
/**
|
||||
* Returns zero based column number of the code_pos location in the script.
|
||||
* -1 will be returned if no information available.
|
||||
*/
|
||||
int GetColumnNumber(int code_pos = 0);
|
||||
|
||||
static const int kNoScriptId = 0;
|
||||
};
|
||||
|
@ -286,6 +291,16 @@ class V8_EXPORT Module : public Data {
|
|||
V8_WARN_UNUSED_RESULT Maybe<bool> SetSyntheticModuleExport(
|
||||
Isolate* isolate, Local<String> export_name, Local<Value> export_value);
|
||||
|
||||
/**
|
||||
* Search the modules requested directly or indirectly by the module for
|
||||
* any top-level await that has not yet resolved. If there is any, the
|
||||
* returned vector contains a tuple of the unresolved module and a message
|
||||
* with the pending top-level await.
|
||||
* An embedder may call this before exiting to improve error messages.
|
||||
*/
|
||||
std::vector<std::tuple<Local<Module>, Local<Message>>>
|
||||
GetStalledTopLevelAwaitMessage(Isolate* isolate);
|
||||
|
||||
V8_INLINE static Module* Cast(Data* data);
|
||||
|
||||
private:
|
||||
|
@ -489,7 +504,7 @@ class V8_EXPORT ScriptCompiler {
|
|||
/**
|
||||
* A task which the embedder must run on a background thread to
|
||||
* consume a V8 code cache. Returned by
|
||||
* ScriptCompiler::StarConsumingCodeCache.
|
||||
* ScriptCompiler::StartConsumingCodeCache.
|
||||
*/
|
||||
class V8_EXPORT ConsumeCodeCacheTask final {
|
||||
public:
|
||||
|
@ -497,6 +512,36 @@ class V8_EXPORT ScriptCompiler {
|
|||
|
||||
void Run();
|
||||
|
||||
/**
|
||||
* Provides the source text string and origin information to the consumption
|
||||
* task. May be called before, during, or after Run(). This step checks
|
||||
* whether the script matches an existing script in the Isolate's
|
||||
* compilation cache. To check whether such a script was found, call
|
||||
* ShouldMergeWithExistingScript.
|
||||
*
|
||||
* The Isolate provided must be the same one used during
|
||||
* StartConsumingCodeCache and must be currently entered on the thread that
|
||||
* calls this function. The source text and origin provided in this step
|
||||
* must precisely match those used later in the ScriptCompiler::Source that
|
||||
* will contain this ConsumeCodeCacheTask.
|
||||
*/
|
||||
void SourceTextAvailable(Isolate* isolate, Local<String> source_text,
|
||||
const ScriptOrigin& origin);
|
||||
|
||||
/**
|
||||
* Returns whether the embedder should call MergeWithExistingScript. This
|
||||
* function may be called from any thread, any number of times, but its
|
||||
* return value is only meaningful after SourceTextAvailable has completed.
|
||||
*/
|
||||
bool ShouldMergeWithExistingScript() const;
|
||||
|
||||
/**
|
||||
* Merges newly deserialized data into an existing script which was found
|
||||
* during SourceTextAvailable. May be called only after Run() has completed.
|
||||
* Can execute on any thread, like Run().
|
||||
*/
|
||||
void MergeWithExistingScript();
|
||||
|
||||
private:
|
||||
friend class ScriptCompiler;
|
||||
|
||||
|
@ -581,7 +626,8 @@ class V8_EXPORT ScriptCompiler {
|
|||
*/
|
||||
static ScriptStreamingTask* StartStreaming(
|
||||
Isolate* isolate, StreamedSource* source,
|
||||
ScriptType type = ScriptType::kClassic);
|
||||
ScriptType type = ScriptType::kClassic,
|
||||
CompileOptions options = kNoCompileOptions);
|
||||
|
||||
static ConsumeCodeCacheTask* StartConsumingCodeCache(
|
||||
Isolate* isolate, std::unique_ptr<CachedData> source);
|
||||
|
@ -650,6 +696,7 @@ class V8_EXPORT ScriptCompiler {
|
|||
* It is possible to specify multiple context extensions (obj in the above
|
||||
* example).
|
||||
*/
|
||||
V8_DEPRECATED("Use CompileFunction")
|
||||
static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunctionInContext(
|
||||
Local<Context> context, Source* source, size_t arguments_count,
|
||||
Local<String> arguments[], size_t context_extension_count,
|
||||
|
@ -657,6 +704,7 @@ class V8_EXPORT ScriptCompiler {
|
|||
CompileOptions options = kNoCompileOptions,
|
||||
NoCacheReason no_cache_reason = kNoCacheNoReason,
|
||||
Local<ScriptOrModule>* script_or_module_out = nullptr);
|
||||
|
||||
static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunction(
|
||||
Local<Context> context, Source* source, size_t arguments_count = 0,
|
||||
Local<String> arguments[] = nullptr, size_t context_extension_count = 0,
|
||||
|
|
89
deps/v8/include/v8-template.h
vendored
89
deps/v8/include/v8-template.h
vendored
|
@ -14,7 +14,6 @@
|
|||
|
||||
namespace v8 {
|
||||
|
||||
class AccessorSignature;
|
||||
class CFunction;
|
||||
class FunctionTemplate;
|
||||
class ObjectTemplate;
|
||||
|
@ -83,28 +82,7 @@ class V8_EXPORT Template : public Data {
|
|||
* cross-context access.
|
||||
* \param attribute The attributes of the property for which an accessor
|
||||
* is added.
|
||||
* \param signature The signature describes valid receivers for the accessor
|
||||
* and is used to perform implicit instance checks against them. If the
|
||||
* receiver is incompatible (i.e. is not an instance of the constructor as
|
||||
* defined by FunctionTemplate::HasInstance()), an implicit TypeError is
|
||||
* thrown and no callback is invoked.
|
||||
*/
|
||||
V8_DEPRECATED("Do signature check in accessor")
|
||||
void SetNativeDataProperty(
|
||||
Local<String> name, AccessorGetterCallback getter,
|
||||
AccessorSetterCallback setter, Local<Value> data,
|
||||
PropertyAttribute attribute, Local<AccessorSignature> signature,
|
||||
AccessControl settings = DEFAULT,
|
||||
SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
|
||||
SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
|
||||
V8_DEPRECATED("Do signature check in accessor")
|
||||
void SetNativeDataProperty(
|
||||
Local<Name> name, AccessorNameGetterCallback getter,
|
||||
AccessorNameSetterCallback setter, Local<Value> data,
|
||||
PropertyAttribute attribute, Local<AccessorSignature> signature,
|
||||
AccessControl settings = DEFAULT,
|
||||
SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
|
||||
SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
|
||||
void SetNativeDataProperty(
|
||||
Local<String> name, AccessorGetterCallback getter,
|
||||
AccessorSetterCallback setter = nullptr,
|
||||
|
@ -151,7 +129,8 @@ class V8_EXPORT Template : public Data {
|
|||
* Interceptor for get requests on an object.
|
||||
*
|
||||
* Use `info.GetReturnValue().Set()` to set the return value of the
|
||||
* intercepted get request.
|
||||
* intercepted get request. If the property does not exist the callback should
|
||||
* not set the result and must not produce side effects.
|
||||
*
|
||||
* \param property The name of the property for which the request was
|
||||
* intercepted.
|
||||
|
@ -192,9 +171,9 @@ using GenericNamedPropertyGetterCallback =
|
|||
* Use `info.GetReturnValue()` to indicate whether the request was intercepted
|
||||
* or not. If the setter successfully intercepts the request, i.e., if the
|
||||
* request should not be further executed, call
|
||||
* `info.GetReturnValue().Set(value)`. If the setter
|
||||
* did not intercept the request, i.e., if the request should be handled as
|
||||
* if no interceptor is present, do not not call `Set()`.
|
||||
* `info.GetReturnValue().Set(value)`. If the setter did not intercept the
|
||||
* request, i.e., if the request should be handled as if no interceptor is
|
||||
* present, do not not call `Set()` and do not produce side effects.
|
||||
*
|
||||
* \param property The name of the property for which the request was
|
||||
* intercepted.
|
||||
|
@ -217,7 +196,9 @@ using GenericNamedPropertySetterCallback =
|
|||
* defineProperty().
|
||||
*
|
||||
* Use `info.GetReturnValue().Set(value)` to set the property attributes. The
|
||||
* value is an integer encoding a `v8::PropertyAttribute`.
|
||||
* value is an integer encoding a `v8::PropertyAttribute`. If the property does
|
||||
* not exist the callback should not set the result and must not produce side
|
||||
* effects.
|
||||
*
|
||||
* \param property The name of the property for which the request was
|
||||
* intercepted.
|
||||
|
@ -242,7 +223,8 @@ using GenericNamedPropertyQueryCallback =
|
|||
* or not. If the deleter successfully intercepts the request, i.e., if the
|
||||
* request should not be further executed, call
|
||||
* `info.GetReturnValue().Set(value)` with a boolean `value`. The `value` is
|
||||
* used as the return value of `delete`.
|
||||
* used as the return value of `delete`. If the deleter does not intercept the
|
||||
* request then it should not set the result and must not produce side effects.
|
||||
*
|
||||
* \param property The name of the property for which the request was
|
||||
* intercepted.
|
||||
|
@ -274,9 +256,9 @@ using GenericNamedPropertyEnumeratorCallback =
|
|||
* Use `info.GetReturnValue()` to indicate whether the request was intercepted
|
||||
* or not. If the definer successfully intercepts the request, i.e., if the
|
||||
* request should not be further executed, call
|
||||
* `info.GetReturnValue().Set(value)`. If the definer
|
||||
* did not intercept the request, i.e., if the request should be handled as
|
||||
* if no interceptor is present, do not not call `Set()`.
|
||||
* `info.GetReturnValue().Set(value)`. If the definer did not intercept the
|
||||
* request, i.e., if the request should be handled as if no interceptor is
|
||||
* present, do not not call `Set()` and do not produce side effects.
|
||||
*
|
||||
* \param property The name of the property for which the request was
|
||||
* intercepted.
|
||||
|
@ -821,27 +803,7 @@ class V8_EXPORT ObjectTemplate : public Template {
|
|||
* cross-context access.
|
||||
* \param attribute The attributes of the property for which an accessor
|
||||
* is added.
|
||||
* \param signature The signature describes valid receivers for the accessor
|
||||
* and is used to perform implicit instance checks against them. If the
|
||||
* receiver is incompatible (i.e. is not an instance of the constructor as
|
||||
* defined by FunctionTemplate::HasInstance()), an implicit TypeError is
|
||||
* thrown and no callback is invoked.
|
||||
*/
|
||||
V8_DEPRECATED("Do signature check in accessor")
|
||||
void SetAccessor(
|
||||
Local<String> name, AccessorGetterCallback getter,
|
||||
AccessorSetterCallback setter, Local<Value> data, AccessControl settings,
|
||||
PropertyAttribute attribute, Local<AccessorSignature> signature,
|
||||
SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
|
||||
SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
|
||||
V8_DEPRECATED("Do signature check in accessor")
|
||||
void SetAccessor(
|
||||
Local<Name> name, AccessorNameGetterCallback getter,
|
||||
AccessorNameSetterCallback setter, Local<Value> data,
|
||||
AccessControl settings, PropertyAttribute attribute,
|
||||
Local<AccessorSignature> signature,
|
||||
SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
|
||||
SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
|
||||
void SetAccessor(
|
||||
Local<String> name, AccessorGetterCallback getter,
|
||||
AccessorSetterCallback setter = nullptr,
|
||||
|
@ -1019,24 +981,6 @@ class V8_EXPORT Signature : public Data {
|
|||
static void CheckCast(Data* that);
|
||||
};
|
||||
|
||||
/**
|
||||
* An AccessorSignature specifies which receivers are valid parameters
|
||||
* to an accessor callback.
|
||||
*/
|
||||
class V8_EXPORT AccessorSignature : public Data {
|
||||
public:
|
||||
static Local<AccessorSignature> New(
|
||||
Isolate* isolate,
|
||||
Local<FunctionTemplate> receiver = Local<FunctionTemplate>());
|
||||
|
||||
V8_INLINE static AccessorSignature* Cast(Data* data);
|
||||
|
||||
private:
|
||||
AccessorSignature();
|
||||
|
||||
static void CheckCast(Data* that);
|
||||
};
|
||||
|
||||
// --- Implementation ---
|
||||
|
||||
void Template::Set(Isolate* isolate, const char* name, Local<Data> value,
|
||||
|
@ -1067,13 +1011,6 @@ Signature* Signature::Cast(Data* data) {
|
|||
return reinterpret_cast<Signature*>(data);
|
||||
}
|
||||
|
||||
AccessorSignature* AccessorSignature::Cast(Data* data) {
|
||||
#ifdef V8_ENABLE_CHECKS
|
||||
CheckCast(data);
|
||||
#endif
|
||||
return reinterpret_cast<AccessorSignature*>(data);
|
||||
}
|
||||
|
||||
} // namespace v8
|
||||
|
||||
#endif // INCLUDE_V8_TEMPLATE_H_
|
||||
|
|
8
deps/v8/include/v8-unwinder-state.h
vendored
8
deps/v8/include/v8-unwinder-state.h
vendored
|
@ -17,10 +17,10 @@ struct CalleeSavedRegisters {
|
|||
void* arm_r9;
|
||||
void* arm_r10;
|
||||
};
|
||||
#elif V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
|
||||
V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC || \
|
||||
V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_RISCV64 || V8_TARGET_ARCH_S390 || \
|
||||
V8_TARGET_ARCH_LOONG64
|
||||
#elif V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
|
||||
V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || \
|
||||
V8_TARGET_ARCH_RISCV64 || V8_TARGET_ARCH_S390 || V8_TARGET_ARCH_LOONG64 || \
|
||||
V8_TARGET_ARCH_RISCV32
|
||||
struct CalleeSavedRegisters {};
|
||||
#else
|
||||
#error Target architecture was not detected as supported by v8
|
||||
|
|
6
deps/v8/include/v8-util.h
vendored
6
deps/v8/include/v8-util.h
vendored
|
@ -537,7 +537,6 @@ class StdGlobalValueMap : public GlobalValueMap<K, V, Traits> {
|
|||
: GlobalValueMap<K, V, Traits>(isolate) {}
|
||||
};
|
||||
|
||||
|
||||
class DefaultPersistentValueVectorTraits {
|
||||
public:
|
||||
typedef std::vector<PersistentContainerValue> Impl;
|
||||
|
@ -562,7 +561,6 @@ class DefaultPersistentValueVectorTraits {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A vector wrapper that safely stores Global values.
|
||||
* C++11 embedders don't need this class, as they can use Global
|
||||
|
@ -573,8 +571,8 @@ class DefaultPersistentValueVectorTraits {
|
|||
* PersistentContainerValue, with all conversion into and out of V8
|
||||
* handles being transparently handled by this class.
|
||||
*/
|
||||
template<typename V, typename Traits = DefaultPersistentValueVectorTraits>
|
||||
class PersistentValueVector {
|
||||
template <typename V, typename Traits = DefaultPersistentValueVectorTraits>
|
||||
class V8_DEPRECATE_SOON("Use std::vector<Global<V>>.") PersistentValueVector {
|
||||
public:
|
||||
explicit PersistentValueVector(Isolate* isolate) : isolate_(isolate) { }
|
||||
|
||||
|
|
69
deps/v8/include/v8-value-serializer.h
vendored
69
deps/v8/include/v8-value-serializer.h
vendored
|
@ -8,6 +8,7 @@
|
|||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "v8-local-handle.h" // NOLINT(build/include_directory)
|
||||
|
@ -26,8 +27,37 @@ class Value;
|
|||
|
||||
namespace internal {
|
||||
struct ScriptStreamingData;
|
||||
class SharedObjectConveyorHandles;
|
||||
class ValueDeserializer;
|
||||
class ValueSerializer;
|
||||
} // namespace internal
|
||||
|
||||
/**
|
||||
* A move-only class for managing the lifetime of shared value conveyors used
|
||||
* by V8 to keep JS shared values alive in transit when serialized.
|
||||
*
|
||||
* This class is not directly constructible and is always passed to a
|
||||
* ValueSerializer::Delegate via ValueSerializer::SetSharedValueConveyor.
|
||||
*
|
||||
* The embedder must not destruct the SharedValueConveyor until the associated
|
||||
* serialized data will no longer be deserialized.
|
||||
*/
|
||||
class V8_EXPORT SharedValueConveyor final {
|
||||
public:
|
||||
SharedValueConveyor(SharedValueConveyor&&) noexcept;
|
||||
~SharedValueConveyor();
|
||||
|
||||
SharedValueConveyor& operator=(SharedValueConveyor&&) noexcept;
|
||||
|
||||
private:
|
||||
friend class internal::ValueSerializer;
|
||||
friend class internal::ValueDeserializer;
|
||||
|
||||
explicit SharedValueConveyor(Isolate* isolate);
|
||||
|
||||
std::unique_ptr<internal::SharedObjectConveyorHandles> private_;
|
||||
};
|
||||
|
||||
/**
|
||||
* Value serialization compatible with the HTML structured clone algorithm.
|
||||
* The format is backward-compatible (i.e. safe to store to disk).
|
||||
|
@ -69,20 +99,20 @@ class V8_EXPORT ValueSerializer {
|
|||
Isolate* isolate, Local<WasmModuleObject> module);
|
||||
|
||||
/**
|
||||
* Returns whether shared values are supported. GetSharedValueId is only
|
||||
* called if SupportsSharedValues() returns true.
|
||||
* Called when the first shared value is serialized. All subsequent shared
|
||||
* values will use the same conveyor.
|
||||
*
|
||||
* The embedder must ensure the lifetime of the conveyor matches the
|
||||
* lifetime of the serialized data.
|
||||
*
|
||||
* If the embedder supports serializing shared values, this method should
|
||||
* return true. Otherwise the embedder should throw an exception and return
|
||||
* false.
|
||||
*
|
||||
* This method is called at most once per serializer.
|
||||
*/
|
||||
virtual bool SupportsSharedValues() const;
|
||||
|
||||
/**
|
||||
* Called when the ValueSerializer serializes a value that is shared across
|
||||
* Isolates. The embedder must return an ID for the object. This function
|
||||
* must be idempotent for the same object. When deserializing, the ID will
|
||||
* be passed to ValueDeserializer::Delegate::GetSharedValueFromId as
|
||||
* |shared_value_id|.
|
||||
*/
|
||||
virtual Maybe<uint32_t> GetSharedValueId(Isolate* isolate,
|
||||
Local<Value> shared_value);
|
||||
virtual bool AdoptSharedValueConveyor(Isolate* isolate,
|
||||
SharedValueConveyor&& conveyor);
|
||||
|
||||
/**
|
||||
* Allocates memory for the buffer of at least the size provided. The actual
|
||||
|
@ -196,17 +226,10 @@ class V8_EXPORT ValueDeserializer {
|
|||
Isolate* isolate, uint32_t clone_id);
|
||||
|
||||
/**
|
||||
* Returns whether shared values are supported. GetSharedValueFromId is only
|
||||
* called if SupportsSharedValues() returns true.
|
||||
* Get the SharedValueConveyor previously provided by
|
||||
* ValueSerializer::Delegate::AdoptSharedValueConveyor.
|
||||
*/
|
||||
virtual bool SupportsSharedValues() const;
|
||||
|
||||
/**
|
||||
* Get a value shared across Isolates given a shared_value_id provided by
|
||||
* ValueSerializer::Delegate::GetSharedValueId.
|
||||
*/
|
||||
virtual MaybeLocal<Value> GetSharedValueFromId(Isolate* isolate,
|
||||
uint32_t shared_value_id);
|
||||
virtual const SharedValueConveyor* GetSharedValueConveyor(Isolate* isolate);
|
||||
};
|
||||
|
||||
ValueDeserializer(Isolate* isolate, const uint8_t* data, size_t size);
|
||||
|
|
6
deps/v8/include/v8-version.h
vendored
6
deps/v8/include/v8-version.h
vendored
|
@ -9,9 +9,9 @@
|
|||
// NOTE these macros are used by some of the tool scripts and the build
|
||||
// system so their names cannot be changed without changing the scripts.
|
||||
#define V8_MAJOR_VERSION 10
|
||||
#define V8_MINOR_VERSION 2
|
||||
#define V8_BUILD_NUMBER 154
|
||||
#define V8_PATCH_LEVEL 15
|
||||
#define V8_MINOR_VERSION 7
|
||||
#define V8_BUILD_NUMBER 193
|
||||
#define V8_PATCH_LEVEL 13
|
||||
|
||||
// Use 1 for candidates and 0 otherwise.
|
||||
// (Boolean macro values are not supported by all preprocessors.)
|
||||
|
|
67
deps/v8/include/v8-wasm.h
vendored
67
deps/v8/include/v8-wasm.h
vendored
|
@ -5,6 +5,7 @@
|
|||
#ifndef INCLUDE_V8_WASM_H_
|
||||
#define INCLUDE_V8_WASM_H_
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
|
@ -130,19 +131,6 @@ class V8_EXPORT WasmStreaming final {
|
|||
public:
|
||||
class WasmStreamingImpl;
|
||||
|
||||
/**
|
||||
* Client to receive streaming event notifications.
|
||||
*/
|
||||
class Client {
|
||||
public:
|
||||
virtual ~Client() = default;
|
||||
/**
|
||||
* Passes the fully compiled module to the client. This can be used to
|
||||
* implement code caching.
|
||||
*/
|
||||
virtual void OnModuleCompiled(CompiledWasmModule compiled_module) = 0;
|
||||
};
|
||||
|
||||
explicit WasmStreaming(std::unique_ptr<WasmStreamingImpl> impl);
|
||||
|
||||
~WasmStreaming();
|
||||
|
@ -183,10 +171,11 @@ class V8_EXPORT WasmStreaming final {
|
|||
bool SetCompiledModuleBytes(const uint8_t* bytes, size_t size);
|
||||
|
||||
/**
|
||||
* Sets the client object that will receive streaming event notifications.
|
||||
* This must be called before {OnBytesReceived}, {Finish}, or {Abort}.
|
||||
* Sets a callback which is called whenever a significant number of new
|
||||
* functions are ready for serialization.
|
||||
*/
|
||||
void SetClient(std::shared_ptr<Client> client);
|
||||
void SetMoreFunctionsCanBeSerializedCallback(
|
||||
std::function<void(CompiledWasmModule)>);
|
||||
|
||||
/*
|
||||
* Sets the UTF-8 encoded source URL for the {Script} object. This must be
|
||||
|
@ -206,52 +195,6 @@ class V8_EXPORT WasmStreaming final {
|
|||
std::unique_ptr<WasmStreamingImpl> impl_;
|
||||
};
|
||||
|
||||
// TODO(mtrofin): when streaming compilation is done, we can rename this
|
||||
// to simply WasmModuleObjectBuilder
|
||||
class V8_EXPORT WasmModuleObjectBuilderStreaming final {
|
||||
public:
|
||||
explicit WasmModuleObjectBuilderStreaming(Isolate* isolate);
|
||||
/**
|
||||
* The buffer passed into OnBytesReceived is owned by the caller.
|
||||
*/
|
||||
void OnBytesReceived(const uint8_t*, size_t size);
|
||||
void Finish();
|
||||
/**
|
||||
* Abort streaming compilation. If {exception} has a value, then the promise
|
||||
* associated with streaming compilation is rejected with that value. If
|
||||
* {exception} does not have value, the promise does not get rejected.
|
||||
*/
|
||||
void Abort(MaybeLocal<Value> exception);
|
||||
Local<Promise> GetPromise();
|
||||
|
||||
~WasmModuleObjectBuilderStreaming() = default;
|
||||
|
||||
private:
|
||||
WasmModuleObjectBuilderStreaming(const WasmModuleObjectBuilderStreaming&) =
|
||||
delete;
|
||||
WasmModuleObjectBuilderStreaming(WasmModuleObjectBuilderStreaming&&) =
|
||||
default;
|
||||
WasmModuleObjectBuilderStreaming& operator=(
|
||||
const WasmModuleObjectBuilderStreaming&) = delete;
|
||||
WasmModuleObjectBuilderStreaming& operator=(
|
||||
WasmModuleObjectBuilderStreaming&&) = default;
|
||||
Isolate* isolate_ = nullptr;
|
||||
|
||||
#if V8_CC_MSVC
|
||||
/**
|
||||
* We don't need the static Copy API, so the default
|
||||
* NonCopyablePersistentTraits would be sufficient, however,
|
||||
* MSVC eagerly instantiates the Copy.
|
||||
* We ensure we don't use Copy, however, by compiling with the
|
||||
* defaults everywhere else.
|
||||
*/
|
||||
Persistent<Promise, CopyablePersistentTraits<Promise>> promise_;
|
||||
#else
|
||||
Persistent<Promise> promise_;
|
||||
#endif
|
||||
std::shared_ptr<internal::wasm::StreamingDecoder> streaming_decoder_;
|
||||
};
|
||||
|
||||
} // namespace v8
|
||||
|
||||
#endif // INCLUDE_V8_WASM_H_
|
||||
|
|
7
deps/v8/include/v8-weak-callback-info.h
vendored
7
deps/v8/include/v8-weak-callback-info.h
vendored
|
@ -63,13 +63,6 @@ enum class WeakCallbackType {
|
|||
* Passes the first two internal fields of the object back to the callback.
|
||||
*/
|
||||
kInternalFields,
|
||||
/**
|
||||
* Passes a user-defined void* parameter back to the callback. Will do so
|
||||
* before the object is actually reclaimed, allowing it to be resurrected. In
|
||||
* this case it is not possible to set a second-pass callback.
|
||||
*/
|
||||
kFinalizer V8_ENUM_DEPRECATED("Resurrecting finalizers are deprecated "
|
||||
"and will not be supported going forward.")
|
||||
};
|
||||
|
||||
template <class T>
|
||||
|
|
270
deps/v8/include/v8config.h
vendored
270
deps/v8/include/v8config.h
vendored
|
@ -308,6 +308,7 @@ path. Add it with -I<path> to the command line
|
|||
// V8_HAS_BUILTIN_SADD_OVERFLOW - __builtin_sadd_overflow() supported
|
||||
// V8_HAS_BUILTIN_SSUB_OVERFLOW - __builtin_ssub_overflow() supported
|
||||
// V8_HAS_BUILTIN_UADD_OVERFLOW - __builtin_uadd_overflow() supported
|
||||
// V8_HAS_BUILTIN_SMUL_OVERFLOW - __builtin_smul_overflow() supported
|
||||
// V8_HAS_COMPUTED_GOTO - computed goto/labels as values
|
||||
// supported
|
||||
// V8_HAS_DECLSPEC_NOINLINE - __declspec(noinline) supported
|
||||
|
@ -344,6 +345,7 @@ path. Add it with -I<path> to the command line
|
|||
# define V8_HAS_CPP_ATTRIBUTE_NO_UNIQUE_ADDRESS \
|
||||
(V8_HAS_CPP_ATTRIBUTE(no_unique_address))
|
||||
|
||||
# define V8_HAS_BUILTIN_ASSUME (__has_builtin(__builtin_assume))
|
||||
# define V8_HAS_BUILTIN_ASSUME_ALIGNED (__has_builtin(__builtin_assume_aligned))
|
||||
# define V8_HAS_BUILTIN_BSWAP16 (__has_builtin(__builtin_bswap16))
|
||||
# define V8_HAS_BUILTIN_BSWAP32 (__has_builtin(__builtin_bswap32))
|
||||
|
@ -356,6 +358,8 @@ path. Add it with -I<path> to the command line
|
|||
# define V8_HAS_BUILTIN_SADD_OVERFLOW (__has_builtin(__builtin_sadd_overflow))
|
||||
# define V8_HAS_BUILTIN_SSUB_OVERFLOW (__has_builtin(__builtin_ssub_overflow))
|
||||
# define V8_HAS_BUILTIN_UADD_OVERFLOW (__has_builtin(__builtin_uadd_overflow))
|
||||
# define V8_HAS_BUILTIN_SMUL_OVERFLOW (__has_builtin(__builtin_smul_overflow))
|
||||
# define V8_HAS_BUILTIN_UNREACHABLE (__has_builtin(__builtin_unreachable))
|
||||
|
||||
// Clang has no __has_feature for computed gotos.
|
||||
// GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
|
||||
|
@ -394,6 +398,7 @@ path. Add it with -I<path> to the command line
|
|||
# define V8_HAS_BUILTIN_EXPECT 1
|
||||
# define V8_HAS_BUILTIN_FRAME_ADDRESS 1
|
||||
# define V8_HAS_BUILTIN_POPCOUNT 1
|
||||
# define V8_HAS_BUILTIN_UNREACHABLE 1
|
||||
|
||||
// GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
|
||||
#define V8_HAS_COMPUTED_GOTO 1
|
||||
|
@ -425,6 +430,18 @@ path. Add it with -I<path> to the command line
|
|||
# define V8_INLINE inline
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
// In debug mode, check assumptions instead of actually adding annotations.
|
||||
# define V8_ASSUME(condition) DCHECK(condition)
|
||||
#elif V8_HAS_BUILTIN_ASSUME
|
||||
# define V8_ASSUME(condition) __builtin_assume(condition)
|
||||
#elif V8_HAS_BUILTIN_UNREACHABLE
|
||||
# define V8_ASSUME(condition) \
|
||||
do { if (!(condition)) __builtin_unreachable(); } while (false)
|
||||
#else
|
||||
# define V8_ASSUME(condition)
|
||||
#endif
|
||||
|
||||
#if V8_HAS_BUILTIN_ASSUME_ALIGNED
|
||||
# define V8_ASSUME_ALIGNED(ptr, alignment) \
|
||||
__builtin_assume_aligned((ptr), (alignment))
|
||||
|
@ -471,6 +488,34 @@ path. Add it with -I<path> to the command line
|
|||
#endif
|
||||
|
||||
|
||||
#if defined(V8_IMMINENT_DEPRECATION_WARNINGS) || \
|
||||
defined(V8_DEPRECATION_WARNINGS)
|
||||
#if defined(V8_CC_MSVC)
|
||||
# define START_ALLOW_USE_DEPRECATED() \
|
||||
__pragma(warning(push)) \
|
||||
__pragma(warning(disable : 4996))
|
||||
# define END_ALLOW_USE_DEPRECATED() __pragma(warning(pop))
|
||||
#else // !defined(V8_CC_MSVC)
|
||||
# define START_ALLOW_USE_DEPRECATED() \
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
|
||||
#define END_ALLOW_USE_DEPRECATED() _Pragma("GCC diagnostic pop")
|
||||
#endif // !defined(V8_CC_MSVC)
|
||||
#else // !(defined(V8_IMMINENT_DEPRECATION_WARNINGS) ||
|
||||
// defined(V8_DEPRECATION_WARNINGS))
|
||||
#define START_ALLOW_USE_DEPRECATED()
|
||||
#define END_ALLOW_USE_DEPRECATED()
|
||||
#endif // !(defined(V8_IMMINENT_DEPRECATION_WARNINGS) ||
|
||||
// defined(V8_DEPRECATION_WARNINGS))
|
||||
#define ALLOW_COPY_AND_MOVE_WITH_DEPRECATED_FIELDS(ClassName) \
|
||||
START_ALLOW_USE_DEPRECATED() \
|
||||
ClassName(const ClassName&) = default; \
|
||||
ClassName(ClassName&&) = default; \
|
||||
ClassName& operator=(const ClassName&) = default; \
|
||||
ClassName& operator=(ClassName&&) = default; \
|
||||
END_ALLOW_USE_DEPRECATED()
|
||||
|
||||
|
||||
#if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 6)
|
||||
# define V8_ENUM_DEPRECATED(message)
|
||||
# define V8_ENUM_DEPRECATE_SOON(message)
|
||||
|
@ -580,26 +625,215 @@ V8 shared library set USING_V8_SHARED.
|
|||
|
||||
#endif // V8_OS_WIN
|
||||
|
||||
// The sandbox is available (i.e. defined) when pointer compression
|
||||
// is enabled, but it is only used when V8_SANDBOX is enabled as
|
||||
// well. This allows better test coverage of the sandbox.
|
||||
#if defined(V8_COMPRESS_POINTERS)
|
||||
#define V8_SANDBOX_IS_AVAILABLE
|
||||
#endif
|
||||
|
||||
#if defined(V8_SANDBOX) && !defined(V8_SANDBOX_IS_AVAILABLE)
|
||||
#error Inconsistent configuration: sandbox is enabled but not available
|
||||
#endif
|
||||
|
||||
// From C++17 onwards, static constexpr member variables are defined to be
|
||||
// "inline", and adding a separate definition for them can trigger deprecation
|
||||
// warnings. For C++14 and below, however, these definitions are required.
|
||||
#if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L)
|
||||
#define V8_STATIC_CONSTEXPR_VARIABLES_NEED_DEFINITIONS
|
||||
#endif
|
||||
|
||||
// clang-format on
|
||||
|
||||
// Processor architecture detection. For more info on what's defined, see:
|
||||
// http://msdn.microsoft.com/en-us/library/b0084kay.aspx
|
||||
// http://www.agner.org/optimize/calling_conventions.pdf
|
||||
// or with gcc, run: "echo | gcc -E -dM -"
|
||||
// The V8_HOST_ARCH_* macros correspond to the architecture on which V8, as a
|
||||
// virtual machine and compiler, runs. Don't confuse this with the architecture
|
||||
// on which V8 is built.
|
||||
#if defined(_M_X64) || defined(__x86_64__)
|
||||
#define V8_HOST_ARCH_X64 1
|
||||
#if defined(__x86_64__) && __SIZEOF_POINTER__ == 4 // Check for x32.
|
||||
#define V8_HOST_ARCH_32_BIT 1
|
||||
#else
|
||||
#define V8_HOST_ARCH_64_BIT 1
|
||||
#endif
|
||||
#elif defined(_M_IX86) || defined(__i386__)
|
||||
#define V8_HOST_ARCH_IA32 1
|
||||
#define V8_HOST_ARCH_32_BIT 1
|
||||
#elif defined(__AARCH64EL__) || defined(_M_ARM64)
|
||||
#define V8_HOST_ARCH_ARM64 1
|
||||
#define V8_HOST_ARCH_64_BIT 1
|
||||
#elif defined(__ARMEL__)
|
||||
#define V8_HOST_ARCH_ARM 1
|
||||
#define V8_HOST_ARCH_32_BIT 1
|
||||
#elif defined(__mips64)
|
||||
#define V8_HOST_ARCH_MIPS64 1
|
||||
#define V8_HOST_ARCH_64_BIT 1
|
||||
#elif defined(__loongarch64)
|
||||
#define V8_HOST_ARCH_LOONG64 1
|
||||
#define V8_HOST_ARCH_64_BIT 1
|
||||
#elif defined(__PPC64__) || defined(_ARCH_PPC64)
|
||||
#define V8_HOST_ARCH_PPC64 1
|
||||
#define V8_HOST_ARCH_64_BIT 1
|
||||
#elif defined(__PPC__) || defined(_ARCH_PPC)
|
||||
#define V8_HOST_ARCH_PPC 1
|
||||
#define V8_HOST_ARCH_32_BIT 1
|
||||
#elif defined(__s390__) || defined(__s390x__)
|
||||
#define V8_HOST_ARCH_S390 1
|
||||
#if defined(__s390x__)
|
||||
#define V8_HOST_ARCH_64_BIT 1
|
||||
#else
|
||||
#define V8_HOST_ARCH_32_BIT 1
|
||||
#endif
|
||||
#elif defined(__riscv) || defined(__riscv__)
|
||||
#if __riscv_xlen == 64
|
||||
#define V8_HOST_ARCH_RISCV64 1
|
||||
#define V8_HOST_ARCH_64_BIT 1
|
||||
#elif __riscv_xlen == 32
|
||||
#define V8_HOST_ARCH_RISCV32 1
|
||||
#define V8_HOST_ARCH_32_BIT 1
|
||||
#else
|
||||
#error "Cannot detect Riscv's bitwidth"
|
||||
#endif
|
||||
#else
|
||||
#error "Host architecture was not detected as supported by v8"
|
||||
#endif
|
||||
|
||||
// Target architecture detection. This corresponds to the architecture for which
|
||||
// V8's JIT will generate code (the last stage of the canadian cross-compiler).
|
||||
// The macros may be set externally. If not, detect in the same way as the host
|
||||
// architecture, that is, target the native environment as presented by the
|
||||
// compiler.
|
||||
#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM && \
|
||||
!V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_MIPS64 && !V8_TARGET_ARCH_PPC && \
|
||||
!V8_TARGET_ARCH_PPC64 && !V8_TARGET_ARCH_S390 && \
|
||||
!V8_TARGET_ARCH_RISCV64 && !V8_TARGET_ARCH_LOONG64 && \
|
||||
!V8_TARGET_ARCH_RISCV32
|
||||
#if defined(_M_X64) || defined(__x86_64__)
|
||||
#define V8_TARGET_ARCH_X64 1
|
||||
#elif defined(_M_IX86) || defined(__i386__)
|
||||
#define V8_TARGET_ARCH_IA32 1
|
||||
#elif defined(__AARCH64EL__) || defined(_M_ARM64)
|
||||
#define V8_TARGET_ARCH_ARM64 1
|
||||
#elif defined(__ARMEL__)
|
||||
#define V8_TARGET_ARCH_ARM 1
|
||||
#elif defined(__mips64)
|
||||
#define V8_TARGET_ARCH_MIPS64 1
|
||||
#elif defined(_ARCH_PPC64)
|
||||
#define V8_TARGET_ARCH_PPC64 1
|
||||
#elif defined(_ARCH_PPC)
|
||||
#define V8_TARGET_ARCH_PPC 1
|
||||
#elif defined(__s390__)
|
||||
#define V8_TARGET_ARCH_S390 1
|
||||
#if defined(__s390x__)
|
||||
#define V8_TARGET_ARCH_S390X 1
|
||||
#endif
|
||||
#elif defined(__riscv) || defined(__riscv__)
|
||||
#if __riscv_xlen == 64
|
||||
#define V8_TARGET_ARCH_RISCV64 1
|
||||
#elif __riscv_xlen == 32
|
||||
#define V8_TARGET_ARCH_RISCV32 1
|
||||
#endif
|
||||
#else
|
||||
#error Target architecture was not detected as supported by v8
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Determine architecture pointer size.
|
||||
#if V8_TARGET_ARCH_IA32
|
||||
#define V8_TARGET_ARCH_32_BIT 1
|
||||
#elif V8_TARGET_ARCH_X64
|
||||
#if !V8_TARGET_ARCH_32_BIT && !V8_TARGET_ARCH_64_BIT
|
||||
#if defined(__x86_64__) && __SIZEOF_POINTER__ == 4 // Check for x32.
|
||||
#define V8_TARGET_ARCH_32_BIT 1
|
||||
#else
|
||||
#define V8_TARGET_ARCH_64_BIT 1
|
||||
#endif
|
||||
#endif
|
||||
#elif V8_TARGET_ARCH_ARM
|
||||
#define V8_TARGET_ARCH_32_BIT 1
|
||||
#elif V8_TARGET_ARCH_ARM64
|
||||
#define V8_TARGET_ARCH_64_BIT 1
|
||||
#elif V8_TARGET_ARCH_MIPS
|
||||
#define V8_TARGET_ARCH_32_BIT 1
|
||||
#elif V8_TARGET_ARCH_MIPS64
|
||||
#define V8_TARGET_ARCH_64_BIT 1
|
||||
#elif V8_TARGET_ARCH_LOONG64
|
||||
#define V8_TARGET_ARCH_64_BIT 1
|
||||
#elif V8_TARGET_ARCH_PPC
|
||||
#define V8_TARGET_ARCH_32_BIT 1
|
||||
#elif V8_TARGET_ARCH_PPC64
|
||||
#define V8_TARGET_ARCH_64_BIT 1
|
||||
#elif V8_TARGET_ARCH_S390
|
||||
#if V8_TARGET_ARCH_S390X
|
||||
#define V8_TARGET_ARCH_64_BIT 1
|
||||
#else
|
||||
#define V8_TARGET_ARCH_32_BIT 1
|
||||
#endif
|
||||
#elif V8_TARGET_ARCH_RISCV64
|
||||
#define V8_TARGET_ARCH_64_BIT 1
|
||||
#elif V8_TARGET_ARCH_RISCV32
|
||||
#define V8_TARGET_ARCH_32_BIT 1
|
||||
#else
|
||||
#error Unknown target architecture pointer size
|
||||
#endif
|
||||
|
||||
// Check for supported combinations of host and target architectures.
|
||||
#if V8_TARGET_ARCH_IA32 && !V8_HOST_ARCH_IA32
|
||||
#error Target architecture ia32 is only supported on ia32 host
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_64_BIT && \
|
||||
!((V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64) && V8_HOST_ARCH_64_BIT))
|
||||
#error Target architecture x64 is only supported on x64 and arm64 host
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_32_BIT && \
|
||||
!(V8_HOST_ARCH_X64 && V8_HOST_ARCH_32_BIT))
|
||||
#error Target architecture x32 is only supported on x64 host with x32 support
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_ARM && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_ARM))
|
||||
#error Target architecture arm is only supported on arm and ia32 host
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_ARM64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64))
|
||||
#error Target architecture arm64 is only supported on arm64 and x64 host
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_MIPS64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_MIPS64))
|
||||
#error Target architecture mips64 is only supported on mips64 and x64 host
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_RISCV64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_RISCV64))
|
||||
#error Target architecture riscv64 is only supported on riscv64 and x64 host
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_RISCV32 && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_RISCV32))
|
||||
#error Target architecture riscv32 is only supported on riscv32 and ia32 host
|
||||
#endif
|
||||
#if (V8_TARGET_ARCH_LOONG64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_LOONG64))
|
||||
#error Target architecture loong64 is only supported on loong64 and x64 host
|
||||
#endif
|
||||
|
||||
// Determine architecture endianness.
|
||||
#if V8_TARGET_ARCH_IA32
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_X64
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_ARM
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_ARM64
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_LOONG64
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_MIPS64
|
||||
#if defined(__MIPSEB__) || defined(V8_TARGET_ARCH_MIPS64_BE)
|
||||
#define V8_TARGET_BIG_ENDIAN 1
|
||||
#else
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#endif
|
||||
#elif defined(__BIG_ENDIAN__) // FOR PPCGR on AIX
|
||||
#define V8_TARGET_BIG_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_PPC_LE
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_PPC_BE
|
||||
#define V8_TARGET_BIG_ENDIAN 1
|
||||
#elif V8_TARGET_ARCH_S390
|
||||
#if V8_TARGET_ARCH_S390_LE_SIM
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#else
|
||||
#define V8_TARGET_BIG_ENDIAN 1
|
||||
#endif
|
||||
#elif V8_TARGET_ARCH_RISCV32 || V8_TARGET_ARCH_RISCV64
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#elif defined(__BYTE_ORDER__)
|
||||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
#define V8_TARGET_BIG_ENDIAN 1
|
||||
#else
|
||||
#define V8_TARGET_LITTLE_ENDIAN 1
|
||||
#endif
|
||||
#else
|
||||
#error Unknown target architecture endianness
|
||||
#endif
|
||||
|
||||
#undef V8_HAS_CPP_ATTRIBUTE
|
||||
|
||||
#endif // V8CONFIG_H_
|
||||
|
|
2
deps/v8/infra/mb/PRESUBMIT.py
vendored
2
deps/v8/infra/mb/PRESUBMIT.py
vendored
|
@ -20,7 +20,7 @@ def _CommonChecks(input_api, output_api):
|
|||
'..', 'tools', 'mb', 'mb.py')
|
||||
mb_config_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
|
||||
'mb_config.pyl')
|
||||
cmd = [input_api.python_executable, mb_script, 'validate', '--config-file',
|
||||
cmd = [input_api.python3_executable, mb_script, 'validate', '--config-file',
|
||||
mb_config_path]
|
||||
kwargs = {'cwd': input_api.PresubmitLocalPath()}
|
||||
results.extend(input_api.RunTests([
|
||||
|
|
2
deps/v8/infra/mb/gn_isolate_map.pyl
vendored
2
deps/v8/infra/mb/gn_isolate_map.pyl
vendored
|
@ -32,7 +32,7 @@
|
|||
"type": "script",
|
||||
},
|
||||
"generate-bytecode-expectations": {
|
||||
"label": "//test/cctest:generate-bytecode-expectations",
|
||||
"label": "//test/unittests:generate-bytecode-expectations",
|
||||
"type": "script",
|
||||
},
|
||||
"mjsunit": {
|
||||
|
|
146
deps/v8/infra/mb/mb_config.pyl
vendored
146
deps/v8/infra/mb/mb_config.pyl
vendored
|
@ -22,9 +22,6 @@
|
|||
'ia32.debug': 'default_debug_x86',
|
||||
'ia32.optdebug': 'default_optdebug_x86',
|
||||
'ia32.release': 'default_release_x86',
|
||||
'mipsel.debug': 'default_debug_mipsel',
|
||||
'mipsel.optdebug': 'default_optdebug_mipsel',
|
||||
'mipsel.release': 'default_release_mipsel',
|
||||
'mips64el.debug': 'default_debug_mips64el',
|
||||
'mips64el.optdebug': 'default_optdebug_mips64el',
|
||||
'mips64el.release': 'default_release_mips64el',
|
||||
|
@ -67,33 +64,38 @@
|
|||
'V8 Linux64 - builder (reclient)': 'release_x64_reclient',
|
||||
'V8 Linux64 - builder (reclient compare)': 'release_x64_reclient',
|
||||
'V8 Linux64 - debug builder': 'debug_x64',
|
||||
'V8 Linux64 - dict tracking - debug - builder': 'debug_x64_dict_tracking_trybot',
|
||||
'V8 Linux64 - external code space - debug - builder': 'debug_x64_external_code_space',
|
||||
'V8 Linux64 - custom snapshot - debug builder': 'debug_x64_custom',
|
||||
'V8 Linux64 - heap sandbox - debug - builder': 'debug_x64_heap_sandbox',
|
||||
'V8 Linux64 - internal snapshot - builder': 'release_x64_internal',
|
||||
'V8 Linux64 - debug - header includes - builder': 'debug_x64_header_includes',
|
||||
'V8 Linux64 - no sandbox - debug builder': 'debug_x64_no_sandbox',
|
||||
'V8 Linux64 - no sandbox - builder': 'release_x64_no_sandbox',
|
||||
'V8 Linux64 - shared - builder': 'release_x64_shared_verify_heap',
|
||||
'V8 Linux64 - verify csa - builder': 'release_x64_verify_csa',
|
||||
'V8 Linux64 - no wasm - builder': 'release_x64_webassembly_disabled',
|
||||
# Windows.
|
||||
'V8 Win32 - builder': 'release_x86_minimal_symbols',
|
||||
'V8 Win32 - builder (goma cache silo)': 'release_x64',
|
||||
'V8 Win32 - builder (goma cache silo)': 'release_x86',
|
||||
'V8 Win32 - builder (reclient)': 'release_x86_minimal_symbols_reclient',
|
||||
'V8 Win32 - builder (reclient compare)': 'release_x86_minimal_symbols_reclient',
|
||||
'V8 Win32 - debug builder': 'debug_x86_minimal_symbols',
|
||||
# TODO(machenbach): Remove after switching to x64 on infra side.
|
||||
'V8 Win64 ASAN - builder': 'release_x64_asan_no_lsan',
|
||||
'V8 Win64 - builder': 'release_x64_minimal_symbols',
|
||||
'V8 Win64 - builder (reclient)': 'release_x64_minimal_symbols_reclient',
|
||||
'V8 Win64 - builder (reclient compare)': 'release_x64_minimal_symbols_reclient',
|
||||
'V8 Win64 - dev image': 'release_x64_minimal_symbols',
|
||||
'V8 Win64 - debug builder': 'debug_x64_minimal_symbols',
|
||||
'V8 Win64 - msvc - builder': 'release_x64_msvc',
|
||||
# Mac.
|
||||
'V8 Mac64 - builder': 'release_x64',
|
||||
'V8 Mac64 - debug builder': 'debug_x64',
|
||||
'V8 Mac64 - builder (reclient)': 'release_x64_reclient',
|
||||
'V8 Official Mac ARM64': 'release_arm64',
|
||||
'V8 Official Mac ARM64 Debug': 'debug_arm64',
|
||||
'V8 Mac64 ASAN - builder': 'release_x64_asan_no_lsan',
|
||||
'V8 Mac - arm64 - no pointer compression debug builder': 'debug_arm64_no_pointer_compression',
|
||||
'V8 Mac - arm64 - release builder': 'release_arm64',
|
||||
'V8 Mac - arm64 - debug builder': 'debug_arm64',
|
||||
'V8 Mac - arm64 - sim - debug builder': 'debug_simulate_arm64',
|
||||
|
@ -104,21 +106,19 @@
|
|||
'V8 Linux64 TSAN - no-concurrent-marking - builder': 'release_x64_tsan_no_cm',
|
||||
'V8 Linux - arm64 - sim - CFI - builder': 'release_simulate_arm64_cfi',
|
||||
'V8 Linux - arm64 - sim - MSAN - builder': 'release_simulate_arm64_msan',
|
||||
# Misc.
|
||||
'V8 Linux gcc - builder': 'release_x86_gcc',
|
||||
# FYI.
|
||||
'V8 iOS - sim - builder': 'release_x64_ios_simulator',
|
||||
'V8 Linux64 - arm64 - sim - heap sandbox - debug - builder': 'debug_x64_heap_sandbox_arm64_sim',
|
||||
'V8 Linux64 - arm64 - sim - no pointer compression - builder':
|
||||
'release_simulate_arm64_no_pointer_compression',
|
||||
'V8 Linux64 - cppgc-non-default - debug - builder': 'debug_x64_non_default_cppgc',
|
||||
'V8 Linux64 - debug - perfetto - builder': 'debug_x64_perfetto',
|
||||
'V8 Linux64 - disable runtime call stats - builder': 'release_x64_disable_runtime_call_stats',
|
||||
'V8 Linux64 - debug - single generation - builder': 'debug_x64_single_generation',
|
||||
'V8 Linux64 - pointer compression - builder': 'release_x64_pointer_compression',
|
||||
'V8 Linux64 - pointer compression without dchecks':
|
||||
'release_x64_pointer_compression_without_dchecks',
|
||||
'V8 Linux64 - arm64 - sim - pointer compression - builder':
|
||||
'release_simulate_arm64_pointer_compression',
|
||||
'V8 Linux64 - no pointer compression - builder': 'release_x64_no_pointer_compression',
|
||||
'V8 Linux64 gcc - builder': 'release_x64_gcc',
|
||||
'V8 Linux64 gcc - debug builder': 'debug_x64_gcc',
|
||||
'V8 Linux64 gcc light - debug builder': 'debug_x64_gcc',
|
||||
'V8 Fuchsia - builder': 'release_x64_fuchsia',
|
||||
'V8 Fuchsia - debug builder': 'debug_x64_fuchsia',
|
||||
'V8 Linux64 - cfi - builder': 'release_x64_cfi',
|
||||
|
@ -126,7 +126,7 @@
|
|||
'V8 Linux - vtunejit': 'debug_x86_vtunejit',
|
||||
'V8 Linux64 - gcov coverage': 'release_x64_gcc_coverage',
|
||||
'V8 Linux64 - Fuzzilli - builder': 'release_x64_fuzzilli',
|
||||
'V8 Linux - predictable - builder': 'release_x86_predictable',
|
||||
'V8 Linux64 - predictable - builder': 'release_x64_predictable',
|
||||
'V8 Linux - full debug builder': 'full_debug_x86',
|
||||
'V8 Mac64 - full debug builder': 'full_debug_x64',
|
||||
'V8 Random Deopt Fuzzer - debug': 'debug_x64',
|
||||
|
@ -166,6 +166,8 @@
|
|||
'V8 Clusterfuzz Linux64 TSAN - release builder': 'release_x64_tsan',
|
||||
'V8 Clusterfuzz Linux64 UBSan - release builder':
|
||||
'release_x64_ubsan_recover',
|
||||
'V8 Clusterfuzz Linux64 ASAN sandbox testing - release builder':
|
||||
'release_x64_asan_sandbox_testing',
|
||||
},
|
||||
'client.v8.perf' : {
|
||||
'V8 Arm - builder - perf': 'official_arm',
|
||||
|
@ -173,6 +175,7 @@
|
|||
'V8 Android Arm64 - builder - perf': 'official_android_arm64',
|
||||
'V8 Linux - builder - perf': 'official_x86',
|
||||
'V8 Linux64 - builder - perf': 'official_x64',
|
||||
'V8 Mac Arm64 - builder - perf': 'official_mac_arm64',
|
||||
},
|
||||
'client.v8.ports': {
|
||||
# Arm.
|
||||
|
@ -191,12 +194,12 @@
|
|||
'V8 Linux - arm64 - sim - debug builder': 'debug_simulate_arm64',
|
||||
'V8 Linux - arm64 - sim - gc stress - builder': 'debug_simulate_arm64',
|
||||
# Mips.
|
||||
'V8 Linux - mipsel - sim - builder': 'release_simulate_mipsel',
|
||||
'V8 Linux - mips64el - sim - builder': 'release_simulate_mips64el',
|
||||
# IBM.
|
||||
'V8 Linux - ppc64 - sim - builder': 'release_simulate_ppc64',
|
||||
'V8 Linux - s390x - sim - builder': 'release_simulate_s390x',
|
||||
# RISC-V
|
||||
'V8 Linux - riscv32 - sim - builder': 'release_simulate_riscv32',
|
||||
'V8 Linux - riscv64 - sim - builder': 'release_simulate_riscv64',
|
||||
# Loongson
|
||||
'V8 Linux - loong64 - sim - builder': 'release_simulate_loong64',
|
||||
|
@ -216,28 +219,34 @@
|
|||
'v8_linux_noi18n_compile_dbg': 'debug_x86_no_i18n',
|
||||
'v8_linux_noi18n_rel_ng': 'release_x86_no_i18n_trybot',
|
||||
'v8_linux_gc_stress_dbg_ng': 'debug_x86_trybot',
|
||||
'v8_linux_gcc_compile_rel': 'release_x86_gcc_minimal_symbols',
|
||||
'v8_linux_gcc_rel_ng': 'release_x86_gcc_minimal_symbols',
|
||||
'v8_linux_shared_compile_rel': 'release_x86_shared_verify_heap',
|
||||
'v8_linux_vtunejit': 'debug_x86_vtunejit',
|
||||
'v8_linux64_arm64_pointer_compression_rel_ng':
|
||||
'release_simulate_arm64_pointer_compression',
|
||||
'v8_linux64_arm64_no_pointer_compression_rel_ng':
|
||||
'release_simulate_arm64_no_pointer_compression',
|
||||
'v8_linux64_cppgc_non_default_dbg_ng': 'debug_x64_non_default_cppgc',
|
||||
'v8_linux64_dbg_ng': 'debug_x64_trybot',
|
||||
'v8_linux64_no_sandbox_dbg_ng': 'debug_x64_no_sandbox',
|
||||
'v8_linux64_dict_tracking_dbg_ng': 'debug_x64_dict_tracking_trybot',
|
||||
'v8_linux64_disable_runtime_call_stats_rel_ng': 'release_x64_disable_runtime_call_stats',
|
||||
'v8_linux64_external_code_space_dbg_ng': 'debug_x64_external_code_space',
|
||||
'v8_linux64_gc_stress_custom_snapshot_dbg_ng': 'debug_x64_trybot_custom',
|
||||
'v8_linux64_gc_stress_dbg_ng': 'debug_x64_trybot',
|
||||
'v8_linux64_gcc_compile_dbg': 'debug_x64_gcc',
|
||||
'v8_linux64_gcc_compile_rel': 'release_x64_gcc',
|
||||
'v8_linux64_gcc_light_compile_dbg': 'debug_x64_gcc',
|
||||
'v8_linux64_gcc_rel_ng': 'release_x64_gcc',
|
||||
'v8_linux64_gcov_coverage': 'release_x64_gcc_coverage',
|
||||
'v8_linux64_header_includes_dbg': 'debug_x64_header_includes',
|
||||
'v8_linux64_heap_sandbox_dbg_ng': 'debug_x64_heap_sandbox',
|
||||
'v8_linux64_minor_mc_dbg_ng': 'debug_x64_trybot',
|
||||
'v8_linux_arm64_sim_heap_sandbox_dbg_ng': 'debug_x64_heap_sandbox_arm64_sim',
|
||||
'v8_linux64_fyi_rel_ng': 'release_x64_test_features_trybot',
|
||||
'v8_linux64_nodcheck_rel_ng': 'release_x64',
|
||||
'v8_linux64_perfetto_dbg_ng': 'debug_x64_perfetto',
|
||||
'v8_linux64_pointer_compression_rel_ng': 'release_x64_pointer_compression',
|
||||
'v8_linux64_no_pointer_compression_rel_ng': 'release_x64_no_pointer_compression',
|
||||
'v8_linux64_rel_ng': 'release_x64_test_features_trybot',
|
||||
'v8_linux64_no_sandbox_rel_ng': 'release_x64_no_sandbox',
|
||||
'v8_linux64_predictable_rel_ng': 'release_x64_predictable',
|
||||
'v8_linux64_shared_compile_rel': 'release_x64_shared_verify_heap',
|
||||
'v8_linux64_single_generation_dbg_ng': 'debug_x64_single_generation',
|
||||
'v8_linux64_no_wasm_compile_rel': 'release_x64_webassembly_disabled',
|
||||
|
@ -247,6 +256,7 @@
|
|||
'v8_linux64_fuzzilli_ng': 'release_x64_fuzzilli',
|
||||
'v8_linux64_loong64_rel_ng': 'release_simulate_loong64',
|
||||
'v8_linux64_msan_rel_ng': 'release_simulate_arm64_msan_minimal_symbols',
|
||||
'v8_linux_riscv32_rel_ng': 'release_simulate_riscv32',
|
||||
'v8_linux64_riscv64_rel_ng': 'release_simulate_riscv64',
|
||||
'v8_linux64_tsan_rel_ng': 'release_x64_tsan_minimal_symbols',
|
||||
'v8_linux64_tsan_no_cm_rel_ng': 'release_x64_tsan_no_cm',
|
||||
|
@ -267,6 +277,7 @@
|
|||
'v8_mac_arm64_rel_ng': 'release_arm64',
|
||||
'v8_mac_arm64_dbg_ng': 'debug_arm64',
|
||||
'v8_mac_arm64_full_dbg_ng': 'full_debug_arm64',
|
||||
'v8_mac_arm64_no_pointer_compression_dbg_ng': 'debug_arm64_no_pointer_compression',
|
||||
'v8_mac_arm64_compile_dbg': 'debug_arm64',
|
||||
'v8_mac_arm64_compile_rel': 'release_arm64',
|
||||
'v8_mac_arm64_sim_compile_dbg': 'debug_simulate_arm64',
|
||||
|
@ -279,7 +290,7 @@
|
|||
'v8_mac64_dbg': 'debug_x64',
|
||||
'v8_mac64_dbg_ng': 'debug_x64',
|
||||
'v8_mac64_compile_full_dbg_ng': 'full_debug_x64',
|
||||
'v8_mac64_asan_compile_rel_ng': 'release_x64_asan_no_lsan',
|
||||
'v8_mac64_asan_compile_rel': 'release_x64_asan_no_lsan',
|
||||
'v8_mac64_asan_rel_ng': 'release_x64_asan_no_lsan',
|
||||
'v8_linux_arm_rel_ng': 'release_simulate_arm_trybot',
|
||||
'v8_linux_arm_lite_compile_dbg': 'debug_simulate_arm_lite',
|
||||
|
@ -291,7 +302,6 @@
|
|||
'v8_linux_arm64_cfi_rel_ng' : 'release_simulate_arm64_cfi',
|
||||
'v8_linux_arm64_dbg_ng': 'debug_simulate_arm64',
|
||||
'v8_linux_arm64_gc_stress_dbg_ng': 'debug_simulate_arm64',
|
||||
'v8_linux_mipsel_compile_rel': 'release_simulate_mipsel',
|
||||
'v8_linux_mips64el_compile_rel': 'release_simulate_mips64el',
|
||||
'v8_numfuzz_ng': 'release_x64',
|
||||
'v8_numfuzz_dbg_ng': 'debug_x64',
|
||||
|
@ -324,12 +334,6 @@
|
|||
'release', 'simulate_arm64'],
|
||||
'release_arm64_sample': [
|
||||
'release', 'arm64', 'sample'],
|
||||
'default_debug_mipsel': [
|
||||
'debug', 'simulate_mipsel', 'v8_enable_slow_dchecks', 'v8_full_debug'],
|
||||
'default_optdebug_mipsel': [
|
||||
'debug', 'simulate_mipsel', 'v8_enable_slow_dchecks'],
|
||||
'default_release_mipsel': [
|
||||
'release', 'simulate_mipsel'],
|
||||
'default_debug_mips64el': [
|
||||
'debug', 'simulate_mips64el', 'v8_enable_slow_dchecks', 'v8_full_debug'],
|
||||
'default_optdebug_mips64el': [
|
||||
|
@ -413,11 +417,8 @@
|
|||
'release_bot', 'simulate_arm64'],
|
||||
'release_simulate_arm64_cfi': [
|
||||
'release_bot', 'simulate_arm64', 'v8_control_flow_integrity'],
|
||||
'release_simulate_arm64_pointer_compression': [
|
||||
# TODO(v8:v7703): Make pointer compression bots testing non pointer
|
||||
# compression mode while pointer compression is temporarily enabled
|
||||
# on arm64
|
||||
'release_bot', 'simulate_arm64', 'dcheck_always_on',
|
||||
'release_simulate_arm64_no_pointer_compression': [
|
||||
'release_bot', 'simulate_arm64_no_sandbox', 'dcheck_always_on',
|
||||
'v8_enable_slow_dchecks', 'v8_disable_pointer_compression'],
|
||||
'release_simulate_arm64_msan': [
|
||||
'release_bot', 'simulate_arm64', 'msan'],
|
||||
|
@ -431,12 +432,12 @@
|
|||
'release_trybot', 'simulate_arm64'],
|
||||
'release_simulate_loong64': [
|
||||
'release_bot', 'simulate_loong64'],
|
||||
'release_simulate_mipsel': [
|
||||
'release_bot', 'simulate_mipsel'],
|
||||
'release_simulate_mips64el': [
|
||||
'release_bot', 'simulate_mips64el'],
|
||||
'release_simulate_ppc64': [
|
||||
'release_bot', 'simulate_ppc64'],
|
||||
'release_simulate_riscv32': [
|
||||
'release_bot', 'simulate_riscv32'],
|
||||
'release_simulate_riscv64': [
|
||||
'release_bot', 'simulate_riscv64'],
|
||||
'release_simulate_s390x': [
|
||||
|
@ -449,6 +450,9 @@
|
|||
'debug_bot', 'arm', 'hard_float'],
|
||||
'debug_arm64': [
|
||||
'debug_bot', 'arm64'],
|
||||
'debug_arm64_no_pointer_compression': [
|
||||
'debug_bot', 'arm64_no_sandbox', 'dcheck_always_on', 'v8_enable_slow_dchecks', 'v8_enable_javascript_promise_hooks',
|
||||
'v8_disable_pointer_compression'],
|
||||
'full_debug_arm64': [
|
||||
'debug_bot', 'arm64', 'v8_full_debug'],
|
||||
|
||||
|
@ -475,6 +479,8 @@
|
|||
'official_android_arm64': [
|
||||
'release_bot', 'arm64', 'android', 'minimal_symbols',
|
||||
'android_strip_outputs', 'official', 'disable_pgo'],
|
||||
'official_mac_arm64': [
|
||||
'release_bot', 'arm64', 'official', 'disable_pgo'],
|
||||
|
||||
# Release configs for x64.
|
||||
'release_x64': [
|
||||
|
@ -512,6 +518,8 @@
|
|||
'release_bot', 'x64', 'fuchsia'],
|
||||
'release_x64_fuchsia_trybot': [
|
||||
'release_trybot', 'x64', 'fuchsia'],
|
||||
'release_x64_gcc': [
|
||||
'release_bot_no_goma', 'x64', 'gcc', 'lld', 'no_custom_libcxx'],
|
||||
'release_x64_gcc_coverage': [
|
||||
'release_bot_no_goma', 'x64', 'coverage', 'gcc', 'lld',
|
||||
'no_custom_libcxx', 'no_sysroot'],
|
||||
|
@ -521,13 +529,15 @@
|
|||
'release_bot', 'x64', 'v8_snapshot_internal'],
|
||||
'release_x64_minimal_symbols': [
|
||||
'release_bot', 'x64', 'minimal_symbols'],
|
||||
'release_x64_pointer_compression': [
|
||||
'release_bot', 'x64', 'dcheck_always_on', 'v8_enable_slow_dchecks', 'v8_enable_javascript_promise_hooks',
|
||||
'release_x64_minimal_symbols_reclient': [
|
||||
'release_bot_reclient', 'x64', 'minimal_symbols'],
|
||||
'release_x64_no_pointer_compression': [
|
||||
'release_bot', 'x64_no_sandbox', 'dcheck_always_on', 'v8_enable_slow_dchecks', 'v8_enable_javascript_promise_hooks',
|
||||
'v8_disable_pointer_compression'],
|
||||
'release_x64_pointer_compression_without_dchecks': [
|
||||
'release_bot', 'x64', 'v8_disable_pointer_compression'],
|
||||
'release_x64_reclient': [
|
||||
'release_bot_reclient', 'x64'],
|
||||
'release_x64_no_sandbox': [
|
||||
'release_bot', 'x64_no_sandbox'],
|
||||
'release_x64_trybot': [
|
||||
'release_trybot', 'x64'],
|
||||
'release_x64_test_features_trybot': [
|
||||
|
@ -551,6 +561,9 @@
|
|||
'v8_enable_slow_dchecks', 'v8_verify_csa'],
|
||||
'release_x64_webassembly_disabled': [
|
||||
'release_bot', 'x64', 'webassembly_disabled'],
|
||||
'release_x64_asan_sandbox_testing': [
|
||||
'release_bot', 'x64', 'asan', 'symbolized', 'v8_enable_sandbox_future',
|
||||
'v8_expose_memory_corruption_api'],
|
||||
|
||||
# Official configs for x64.
|
||||
'official_x64': [
|
||||
|
@ -571,20 +584,21 @@
|
|||
'debug_x64_fuchsia': [
|
||||
'debug_bot', 'x64', 'fuchsia'],
|
||||
'debug_x64_gcc': [
|
||||
'debug_bot_no_goma', 'x64', 'gcc', 'lld', 'no_custom_libcxx',
|
||||
'v8_check_header_includes'],
|
||||
'debug_bot_no_goma', 'x64', 'gcc', 'lld', 'no_custom_libcxx'],
|
||||
'debug_x64_header_includes': [
|
||||
'debug_bot', 'x64', 'v8_check_header_includes'],
|
||||
'debug_x64_heap_sandbox': [
|
||||
'debug_bot', 'x64', 'v8_enable_sandbox_future'],
|
||||
'debug_bot', 'x64', 'v8_enable_sandbox_future', 'v8_expose_memory_corruption_api'],
|
||||
'debug_x64_heap_sandbox_arm64_sim': [
|
||||
'debug_bot', 'simulate_arm64', 'v8_enable_sandbox_future'],
|
||||
'debug_bot', 'simulate_arm64', 'v8_enable_sandbox_future', 'v8_expose_memory_corruption_api'],
|
||||
'debug_x64_minimal_symbols': [
|
||||
'debug_bot', 'x64', 'minimal_symbols'],
|
||||
'debug_x64_non_default_cppgc': [
|
||||
'debug_bot', 'x64', 'non_default_cppgc'],
|
||||
'debug_x64_perfetto': [
|
||||
'debug_bot', 'x64', 'perfetto'],
|
||||
'debug_x64_no_sandbox': [
|
||||
'debug_bot', 'x64_no_sandbox'],
|
||||
'debug_x64_single_generation': [
|
||||
'debug_bot', 'x64', 'v8_enable_single_generation'],
|
||||
'debug_x64_trybot': [
|
||||
|
@ -613,15 +627,11 @@
|
|||
'debug', 'x86', 'goma', 'v8_enable_slow_dchecks', 'v8_full_debug'],
|
||||
|
||||
# Release configs for x86.
|
||||
'release_x86': [
|
||||
'release_bot', 'x86'],
|
||||
'release_x86_asan_symbolized_verify_heap': [
|
||||
'release_bot', 'x86', 'asan', 'lsan', 'symbolized',
|
||||
'v8_verify_heap'],
|
||||
'release_x86_gcc': [
|
||||
'release_bot_no_goma', 'x86', 'gcc', 'lld', 'no_custom_libcxx',
|
||||
'v8_check_header_includes'],
|
||||
'release_x86_gcc_minimal_symbols': [
|
||||
'release_bot_no_goma', 'x86', 'gcc', 'lld', 'no_custom_libcxx',
|
||||
'minimal_symbols', 'v8_check_header_includes'],
|
||||
'release_x86_gcmole': [
|
||||
'release_bot', 'x86', 'gcmole'],
|
||||
'release_x86_gcmole_trybot': [
|
||||
|
@ -632,8 +642,8 @@
|
|||
'release_bot_reclient', 'x86', 'minimal_symbols'],
|
||||
'release_x86_no_i18n_trybot': [
|
||||
'release_trybot', 'x86', 'v8_no_i18n'],
|
||||
'release_x86_predictable': [
|
||||
'release_bot', 'x86', 'v8_enable_verify_predictable'],
|
||||
'release_x64_predictable': [
|
||||
'release_bot', 'x64', 'v8_enable_verify_predictable'],
|
||||
'release_x86_shared_verify_heap': [
|
||||
'release', 'x86', 'goma', 'shared', 'v8_verify_heap'],
|
||||
'release_x86_trybot': [
|
||||
|
@ -665,7 +675,11 @@
|
|||
},
|
||||
|
||||
'arm64': {
|
||||
'gn_args': 'target_cpu="arm64"',
|
||||
'gn_args': 'target_cpu="arm64" v8_enable_sandbox=true',
|
||||
},
|
||||
|
||||
'arm64_no_sandbox': {
|
||||
'gn_args': 'target_cpu="arm64" v8_enable_sandbox=false',
|
||||
},
|
||||
|
||||
'asan': {
|
||||
|
@ -723,8 +737,7 @@
|
|||
# atomic marking state enabled because that is needed for the concurrent
|
||||
# write-barrier used by background compilation.
|
||||
'gn_args': 'v8_enable_concurrent_marking=false '
|
||||
'v8_enable_atomic_object_field_writes=false '
|
||||
'v8_enable_atomic_marking_state=true ',
|
||||
'v8_enable_atomic_object_field_writes=false ',
|
||||
},
|
||||
|
||||
'disable_pgo': {
|
||||
|
@ -812,7 +825,7 @@
|
|||
},
|
||||
|
||||
'reclient': {
|
||||
'gn_args': 'use_rbe=true use_remoteexec=true',
|
||||
'gn_args': 'use_remoteexec=true',
|
||||
},
|
||||
|
||||
'release': {
|
||||
|
@ -848,18 +861,17 @@
|
|||
},
|
||||
|
||||
'simulate_arm64': {
|
||||
'gn_args': 'target_cpu="x64" v8_target_cpu="arm64"',
|
||||
'gn_args': 'target_cpu="x64" v8_target_cpu="arm64" v8_enable_sandbox=true',
|
||||
},
|
||||
|
||||
'simulate_arm64_no_sandbox': {
|
||||
'gn_args': 'target_cpu="x64" v8_target_cpu="arm64" v8_enable_sandbox=false',
|
||||
},
|
||||
|
||||
'simulate_loong64': {
|
||||
'gn_args': 'target_cpu="x64" v8_target_cpu="loong64"',
|
||||
},
|
||||
|
||||
'simulate_mipsel': {
|
||||
'gn_args':
|
||||
'target_cpu="x86" v8_target_cpu="mipsel" mips_arch_variant="r2"',
|
||||
},
|
||||
|
||||
'simulate_mips64el': {
|
||||
'gn_args': 'target_cpu="x64" v8_target_cpu="mips64el"',
|
||||
},
|
||||
|
@ -868,6 +880,10 @@
|
|||
'gn_args': 'target_cpu="x64" v8_target_cpu="ppc64"',
|
||||
},
|
||||
|
||||
'simulate_riscv32': {
|
||||
'gn_args': 'target_cpu="x86" v8_target_cpu="riscv32"',
|
||||
},
|
||||
|
||||
'simulate_riscv64': {
|
||||
'gn_args': 'target_cpu="x64" v8_target_cpu="riscv64"',
|
||||
},
|
||||
|
@ -925,6 +941,10 @@
|
|||
'gn_args': 'v8_enable_sandbox_future=true',
|
||||
},
|
||||
|
||||
'v8_expose_memory_corruption_api': {
|
||||
'gn_args': 'v8_expose_memory_corruption_api=true',
|
||||
},
|
||||
|
||||
'v8_enable_lite_mode': {
|
||||
'gn_args': 'v8_enable_lite_mode=true',
|
||||
},
|
||||
|
@ -1010,7 +1030,11 @@
|
|||
},
|
||||
|
||||
'x64': {
|
||||
'gn_args': 'target_cpu="x64"',
|
||||
'gn_args': 'target_cpu="x64" v8_enable_sandbox=true',
|
||||
},
|
||||
|
||||
'x64_no_sandbox': {
|
||||
'gn_args': 'target_cpu="x64" v8_enable_sandbox=false',
|
||||
},
|
||||
|
||||
'x86': {
|
||||
|
|
302
deps/v8/infra/testing/builders.pyl
vendored
302
deps/v8/infra/testing/builders.pyl
vendored
|
@ -77,8 +77,8 @@
|
|||
{'name': 'mozilla', 'variant': 'extra'},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||
{'name': 'test262', 'variant': 'extra', 'shards': 5},
|
||||
{'name': 'v8testing', 'shards': 3},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
||||
{'name': 'v8testing', 'shards': 4},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 4},
|
||||
# Noavx.
|
||||
{
|
||||
'name': 'mozilla',
|
||||
|
@ -95,7 +95,17 @@
|
|||
'name': 'v8testing',
|
||||
'suffix': 'noavx',
|
||||
'test_args': ['--extra-flags', '--noenable-avx'],
|
||||
'shards': 2
|
||||
'shards': 4
|
||||
},
|
||||
# Nosse3.
|
||||
{
|
||||
'name': 'v8testing',
|
||||
'suffix': 'nosse3',
|
||||
'test_args': [
|
||||
'--extra-flags',
|
||||
'--noenable-sse3 --noenable-ssse3 --noenable-sse4-1 --noenable-avx',
|
||||
],
|
||||
'shards': 4,
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -108,14 +118,6 @@
|
|||
{'name': 'd8testing', 'test_args': ['--gc-stress'], 'shards': 5},
|
||||
],
|
||||
},
|
||||
'v8_linux_gcc_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'v8_linux_nodcheck_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64-avx2',
|
||||
|
@ -130,6 +132,15 @@
|
|||
{'name': 'test262', 'variant': 'extra', 'shards': 2},
|
||||
{'name': 'v8testing', 'shards': 2},
|
||||
{'name': 'v8testing', 'variant': 'extra'},
|
||||
{
|
||||
'name': 'v8testing',
|
||||
'suffix': 'nosse3',
|
||||
'test_args': [
|
||||
'--extra-flags',
|
||||
'--noenable-sse3 --noenable-ssse3 --noenable-sse4-1 --noenable-avx',
|
||||
],
|
||||
'shards': 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
'v8_linux_noi18n_rel_ng_triggered': {
|
||||
|
@ -156,10 +167,19 @@
|
|||
{'name': 'mozilla', 'variant': 'extra'},
|
||||
{'name': 'optimize_for_size'},
|
||||
{'name': 'test262', 'shards': 4},
|
||||
{'name': 'test262', 'variant': 'extra', 'shards': 3},
|
||||
{'name': 'v8testing', 'shards': 2},
|
||||
{'name': 'v8testing', 'suffix': 'isolates', 'test_args': ['--isolates'], 'shards': 2},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
||||
{'name': 'test262', 'variant': 'extra', 'shards': 6},
|
||||
{'name': 'v8testing', 'shards': 4},
|
||||
{'name': 'v8testing', 'suffix': 'isolates', 'test_args': ['--isolates'], 'shards': 4},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 4},
|
||||
{
|
||||
'name': 'v8testing',
|
||||
'suffix': 'nosse3',
|
||||
'test_args': [
|
||||
'--extra-flags',
|
||||
'--noenable-sse3 --noenable-ssse3 --noenable-sse4-1 --noenable-avx',
|
||||
],
|
||||
'shards': 4,
|
||||
},
|
||||
],
|
||||
},
|
||||
'v8_linux_optional_rel_ng_triggered': {
|
||||
|
@ -314,9 +334,9 @@
|
|||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'test262', 'shards': 7},
|
||||
{'name': 'v8testing', 'shards': 3},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 3},
|
||||
{'name': 'test262', 'shards': 12},
|
||||
{'name': 'v8testing', 'shards': 5},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 5},
|
||||
{'name': 'v8testing', 'variant': 'slow_path'},
|
||||
],
|
||||
},
|
||||
|
@ -361,6 +381,8 @@
|
|||
{'name': 'v8testing', 'variant': 'stress_instruction_scheduling'},
|
||||
{'name': 'v8testing', 'variant': 'stress_concurrent_allocation'},
|
||||
{'name': 'v8testing', 'variant': 'stress_concurrent_inlining'},
|
||||
# Maglev -- move to extra once more architectures are supported.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
],
|
||||
},
|
||||
'v8_linux64_dict_tracking_dbg_ng_triggered': {
|
||||
|
@ -408,6 +430,10 @@
|
|||
{'name': 'webkit', 'variant': 'stress_sampling'},
|
||||
# Stress snapshot.
|
||||
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
||||
# Maglev.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
# Stress maglev.
|
||||
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
||||
# Experimental regexp engine.
|
||||
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
||||
# Wasm write protect code space.
|
||||
|
@ -426,6 +452,35 @@
|
|||
},
|
||||
],
|
||||
},
|
||||
'v8_linux64_gc_stress_dbg_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'd8testing', 'test_args': ['--gc-stress'], 'shards': 5},
|
||||
{
|
||||
'name': 'mjsunit',
|
||||
'variant': 'slow_path',
|
||||
'test_args': ['--gc-stress'],
|
||||
'shards': 2
|
||||
},
|
||||
{
|
||||
'name': 'mjsunit',
|
||||
'variant': 'maglev',
|
||||
'test_args': ['--gc-stress'],
|
||||
'shards': 2
|
||||
},
|
||||
],
|
||||
},
|
||||
'v8_linux64_gcc_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-20.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'v8_linux64_gcov_coverage': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
|
@ -439,7 +494,20 @@
|
|||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 2},
|
||||
{'name': 'v8testing', 'shards': 4},
|
||||
],
|
||||
},
|
||||
'v8_linux64_minor_mc_dbg_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'variant': 'minor_mc'},
|
||||
{'name': 'benchmarks', 'variant': 'minor_mc'},
|
||||
{'name': 'mozilla', 'variant': 'minor_mc'},
|
||||
{'name': 'test262', 'variant': 'minor_mc', 'shards': 2},
|
||||
{'name': 'mjsunit', 'variant': 'minor_mc'},
|
||||
],
|
||||
},
|
||||
'v8_linux64_msan_rel_ng_triggered': {
|
||||
|
@ -473,6 +541,8 @@
|
|||
{'name': 'v8testing', 'variant': 'extra'},
|
||||
{'name': 'v8testing', 'variant': 'no_lfa'},
|
||||
{'name': 'v8testing', 'variant': 'stress_instruction_scheduling'},
|
||||
# Maglev -- move to extra once more architectures are supported.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
],
|
||||
},
|
||||
'v8_linux64_perfetto_dbg_ng_triggered': {
|
||||
|
@ -483,7 +553,7 @@
|
|||
{'name': 'v8testing', 'shards': 3},
|
||||
],
|
||||
},
|
||||
'v8_linux64_pointer_compression_rel_ng_triggered': {
|
||||
'v8_linux64_no_pointer_compression_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
|
@ -491,6 +561,15 @@
|
|||
{'name': 'v8testing', 'shards': 3},
|
||||
],
|
||||
},
|
||||
'v8_linux64_no_sandbox_dbg_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 5},
|
||||
],
|
||||
},
|
||||
'v8_linux64_single_generation_dbg_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
|
@ -518,6 +597,28 @@
|
|||
{'name': 'v8testing', 'variant': 'no_lfa'},
|
||||
{'name': 'v8testing', 'variant': 'slow_path'},
|
||||
{'name': 'v8testing', 'variant': 'stress_instruction_scheduling'},
|
||||
# Maglev -- move to extra once more architectures are supported.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
],
|
||||
},
|
||||
'v8_linux64_predictable_rel_ng_triggered': {
|
||||
'swarming_dimensions': {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'benchmarks'},
|
||||
{'name': 'd8testing'},
|
||||
{'name': 'mozilla'},
|
||||
],
|
||||
},
|
||||
'v8_linux64_no_sandbox_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 2},
|
||||
],
|
||||
},
|
||||
'v8_linux64_tsan_rel_ng_triggered': {
|
||||
|
@ -587,7 +688,7 @@
|
|||
{'name': 'mozilla', 'shards': 4},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 4},
|
||||
{'name': 'v8testing', 'shards': 14},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 12},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 14},
|
||||
],
|
||||
},
|
||||
'v8_linux_arm64_gc_stress_dbg_ng_triggered': {
|
||||
|
@ -615,7 +716,7 @@
|
|||
{'name': 'mozilla', 'shards': 4},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 4},
|
||||
{'name': 'v8testing', 'shards': 14},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 12},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 14},
|
||||
],
|
||||
},
|
||||
'v8_linux_arm64_cfi_rel_ng_triggered': {
|
||||
|
@ -627,7 +728,7 @@
|
|||
{'name': 'v8testing', 'shards': 4},
|
||||
],
|
||||
},
|
||||
'v8_linux64_arm64_pointer_compression_rel_ng_triggered': {
|
||||
'v8_linux64_arm64_no_pointer_compression_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
|
@ -646,7 +747,15 @@
|
|||
],
|
||||
},
|
||||
##############################################################################
|
||||
# Linux64 with RISC-V simulators
|
||||
# Linux with RISC-V simulators
|
||||
'v8_linux_riscv32_rel_ng_triggered': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 3},
|
||||
],
|
||||
},
|
||||
'v8_linux64_riscv64_rel_ng_triggered': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Ubuntu-18.04',
|
||||
|
@ -700,7 +809,7 @@
|
|||
# Win64
|
||||
'v8_win64_asan_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 5},
|
||||
|
@ -709,11 +818,11 @@
|
|||
'v8_win64_dbg_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64',
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'mozilla'},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 4},
|
||||
{'name': 'v8testing', 'shards': 3},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
||||
],
|
||||
|
@ -721,22 +830,22 @@
|
|||
'v8_win64_msvc_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64',
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'mozilla'},
|
||||
{'name': 'test262', 'variant': 'default'},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||
{'name': 'v8testing', 'shards': 2},
|
||||
],
|
||||
},
|
||||
'v8_win64_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64',
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'mozilla'},
|
||||
{'name': 'test262', 'variant': 'default'},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||
{'name': 'v8testing', 'shards': 2},
|
||||
{'name': 'v8testing', 'variant': 'extra'},
|
||||
],
|
||||
|
@ -815,6 +924,16 @@
|
|||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'v8_mac_arm64_no_pointer_compression_dbg_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'arm64',
|
||||
'os': 'Mac-11',
|
||||
'pool': 'chromium.tests',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'v8_mac_arm64_sim_rel_ng_triggered': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64',
|
||||
|
@ -1088,8 +1207,9 @@
|
|||
{'name': 'v8testing', 'variant': 'default'},
|
||||
],
|
||||
},
|
||||
'V8 Linux - predictable': {
|
||||
'V8 Linux64 - predictable': {
|
||||
'swarming_dimensions': {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
|
@ -1116,14 +1236,6 @@
|
|||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'V8 Linux gcc': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'V8 Linux64': {
|
||||
'swarming_dimensions': {
|
||||
'cpu': 'x86-64-avx2',
|
||||
|
@ -1150,6 +1262,8 @@
|
|||
{'name': 'v8testing', 'variant': 'minor_mc'},
|
||||
{'name': 'v8testing', 'variant': 'no_lfa'},
|
||||
{'name': 'v8testing', 'variant': 'stress_instruction_scheduling'},
|
||||
# Maglev -- move to extra once more architectures are supported.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
# Noavx.
|
||||
{
|
||||
'name': 'mozilla',
|
||||
|
@ -1211,6 +1325,8 @@
|
|||
{'name': 'v8testing', 'variant': 'stress_instruction_scheduling'},
|
||||
{'name': 'v8testing', 'variant': 'stress_concurrent_allocation'},
|
||||
{'name': 'v8testing', 'variant': 'stress_concurrent_inlining'},
|
||||
# Maglev -- move to extra once more architectures are supported.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
# Noavx.
|
||||
{
|
||||
'name': 'mozilla',
|
||||
|
@ -1231,13 +1347,17 @@
|
|||
},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - dict tracking - debug': {
|
||||
'V8 Linux64 - minor mc - debug': {
|
||||
'swarming_dimensions': {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 3},
|
||||
{'name': 'v8testing', 'variant': 'minor_mc'},
|
||||
{'name': 'benchmarks', 'variant': 'minor_mc'},
|
||||
{'name': 'mozilla', 'variant': 'minor_mc'},
|
||||
{'name': 'test262', 'variant': 'minor_mc', 'shards': 2},
|
||||
{'name': 'mjsunit', 'variant': 'minor_mc'},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - disable runtime call stats': {
|
||||
|
@ -1260,6 +1380,10 @@
|
|||
{'name': 'webkit', 'variant': 'stress_sampling'},
|
||||
# Stress snapshot.
|
||||
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
||||
# Maglev.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
# Stress maglev.
|
||||
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
||||
# Experimental regexp engine.
|
||||
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
||||
# Wasm write protect code space.
|
||||
|
@ -1322,12 +1446,49 @@
|
|||
{'name': 'webkit', 'variant': 'stress_sampling'},
|
||||
# Stress snapshot.
|
||||
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
||||
# Maglev.
|
||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||
# Stress maglev.
|
||||
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
||||
# Experimental regexp engine.
|
||||
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
||||
# Wasm write protect code space.
|
||||
{'name': 'mjsunit', 'variant': 'wasm_write_protect_code'},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 gcc': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-20.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - gc stress': {
|
||||
'swarming_dimensions': {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{
|
||||
'name': 'd8testing',
|
||||
'test_args': ['--gc-stress'],
|
||||
'shards': 5,
|
||||
},
|
||||
{
|
||||
'name': 'mjsunit',
|
||||
'variant': 'slow_path',
|
||||
'test_args': ['--gc-stress'],
|
||||
'shards': 2,
|
||||
},
|
||||
{
|
||||
'name': 'mjsunit',
|
||||
'variant': 'maglev',
|
||||
'test_args': ['--gc-stress'],
|
||||
'shards': 2
|
||||
},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - gcov coverage': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
|
@ -1352,7 +1513,7 @@
|
|||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - pointer compression': {
|
||||
'V8 Linux64 - no pointer compression': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
|
@ -1360,6 +1521,24 @@
|
|||
{'name': 'v8testing', 'shards': 2},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - no sandbox': {
|
||||
'swarming_dimensions': {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - no sandbox - debug': {
|
||||
'swarming_dimensions': {
|
||||
'cpu': 'x86-64-avx2',
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 2},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - shared': {
|
||||
'swarming_dimensions' : {
|
||||
'os': 'Ubuntu-18.04',
|
||||
|
@ -1559,6 +1738,16 @@
|
|||
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
||||
],
|
||||
},
|
||||
'V8 Mac - arm64 - no pointer compression debug': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'arm64',
|
||||
'os': 'Mac-11',
|
||||
'pool': 'chromium.tests',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing'},
|
||||
],
|
||||
},
|
||||
'V8 Mac - arm64 - sim - debug': {
|
||||
'swarming_dimensions' : {
|
||||
'cpu': 'x86-64',
|
||||
|
@ -1613,7 +1802,7 @@
|
|||
},
|
||||
'V8 Win64': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'mozilla'},
|
||||
|
@ -1624,18 +1813,18 @@
|
|||
},
|
||||
'V8 Win64 - debug': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'mozilla'},
|
||||
{'name': 'test262', 'variant': 'default'},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||
{'name': 'v8testing', 'shards': 4},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 3},
|
||||
],
|
||||
},
|
||||
'V8 Win64 - msvc': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'mozilla'},
|
||||
|
@ -1645,7 +1834,7 @@
|
|||
},
|
||||
'V8 Win64 ASAN': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Windows-10-15063',
|
||||
'os': 'Windows-10-19042',
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'v8testing', 'shards': 5},
|
||||
|
@ -1818,7 +2007,7 @@
|
|||
'name': 'v8testing',
|
||||
'suffix': 'armv8-a',
|
||||
'test_args': ['--extra-flags', '--enable-armv8'],
|
||||
'shards': 8
|
||||
'shards': 10
|
||||
},
|
||||
# Novfp3.
|
||||
{
|
||||
|
@ -1839,7 +2028,7 @@
|
|||
'suffix': 'novfp3',
|
||||
'variant': 'default',
|
||||
'test_args': ['--novfp3'],
|
||||
'shards': 8
|
||||
'shards': 3
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -1884,7 +2073,7 @@
|
|||
{'name': 'mozilla', 'shards': 2},
|
||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||
{'name': 'v8testing', 'shards': 12},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 11},
|
||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 14},
|
||||
],
|
||||
},
|
||||
'V8 Linux - arm64 - sim - gc stress': {
|
||||
|
@ -1900,7 +2089,7 @@
|
|||
{
|
||||
'name': 'd8testing',
|
||||
'test_args': ['--gc-stress', '--extra-flags=--verify-heap-skip-remembered-set'],
|
||||
'shards': 5
|
||||
'shards': 7
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -1944,7 +2133,7 @@
|
|||
{'name': 'v8testing', 'shards': 4},
|
||||
],
|
||||
},
|
||||
'V8 Linux - mipsel - sim': {
|
||||
'V8 Linux - ppc64 - sim': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
|
@ -1954,11 +2143,10 @@
|
|||
'priority': 35,
|
||||
},
|
||||
'tests': [
|
||||
{'name': 'test262', 'variant': 'default'},
|
||||
{'name': 'v8testing', 'shards': 4},
|
||||
{'name': 'v8testing', 'shards': 3},
|
||||
],
|
||||
},
|
||||
'V8 Linux - ppc64 - sim': {
|
||||
'V8 Linux - riscv32 - sim': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
|
@ -1997,7 +2185,7 @@
|
|||
{'name': 'v8testing', 'shards': 3},
|
||||
],
|
||||
},
|
||||
'V8 Linux64 - arm64 - sim - pointer compression': {
|
||||
'V8 Linux64 - arm64 - sim - no pointer compression': {
|
||||
'swarming_dimensions': {
|
||||
'os': 'Ubuntu-18.04',
|
||||
},
|
||||
|
|
6
deps/v8/samples/hello-world.cc
vendored
6
deps/v8/samples/hello-world.cc
vendored
|
@ -20,12 +20,6 @@ int main(int argc, char* argv[]) {
|
|||
v8::V8::InitializeExternalStartupData(argv[0]);
|
||||
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
|
||||
v8::V8::InitializePlatform(platform.get());
|
||||
#ifdef V8_SANDBOX
|
||||
if (!v8::V8::InitializeSandbox()) {
|
||||
fprintf(stderr, "Error initializing the V8 sandbox\n");
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
v8::V8::Initialize();
|
||||
|
||||
// Create a new Isolate and make it the current one.
|
||||
|
|
6
deps/v8/samples/process.cc
vendored
6
deps/v8/samples/process.cc
vendored
|
@ -703,12 +703,6 @@ int main(int argc, char* argv[]) {
|
|||
v8::V8::InitializeExternalStartupData(argv[0]);
|
||||
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
|
||||
v8::V8::InitializePlatform(platform.get());
|
||||
#ifdef V8_SANDBOX
|
||||
if (!v8::V8::InitializeSandbox()) {
|
||||
fprintf(stderr, "Error initializing the V8 sandbox\n");
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
v8::V8::Initialize();
|
||||
map<string, string> options;
|
||||
string file;
|
||||
|
|
8
deps/v8/samples/shell.cc
vendored
8
deps/v8/samples/shell.cc
vendored
|
@ -73,14 +73,8 @@ int main(int argc, char* argv[]) {
|
|||
v8::V8::InitializeExternalStartupData(argv[0]);
|
||||
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
|
||||
v8::V8::InitializePlatform(platform.get());
|
||||
#ifdef V8_SANDBOX
|
||||
if (!v8::V8::InitializeSandbox()) {
|
||||
fprintf(stderr, "Error initializing the V8 sandbox\n");
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
v8::V8::Initialize();
|
||||
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
|
||||
v8::V8::Initialize();
|
||||
v8::Isolate::CreateParams create_params;
|
||||
create_params.array_buffer_allocator =
|
||||
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
|
||||
|
|
8
deps/v8/src/DEPS
vendored
8
deps/v8/src/DEPS
vendored
|
@ -12,6 +12,7 @@ include_rules = [
|
|||
"-src/compiler",
|
||||
"+src/compiler/pipeline.h",
|
||||
"+src/compiler/code-assembler.h",
|
||||
"+src/compiler/wasm-compiler-definitions.h",
|
||||
"+src/compiler/wasm-compiler.h",
|
||||
"-src/heap",
|
||||
"+src/heap/basic-memory-chunk.h",
|
||||
|
@ -23,6 +24,7 @@ include_rules = [
|
|||
# TODO(v8:10496): Don't expose so much (through transitive includes) outside
|
||||
# of heap/.
|
||||
"+src/heap/heap.h",
|
||||
"+src/heap/heap-verifier.h",
|
||||
"+src/heap/heap-inl.h",
|
||||
"+src/heap/heap-write-barrier-inl.h",
|
||||
"+src/heap/heap-write-barrier.h",
|
||||
|
@ -33,6 +35,7 @@ include_rules = [
|
|||
# TODO(v8:10496): Don't expose memory chunk outside of heap/.
|
||||
"+src/heap/memory-chunk.h",
|
||||
"+src/heap/memory-chunk-inl.h",
|
||||
"+src/heap/paged-spaces-inl.h",
|
||||
"+src/heap/parked-scope.h",
|
||||
"+src/heap/read-only-heap-inl.h",
|
||||
"+src/heap/read-only-heap.h",
|
||||
|
@ -88,7 +91,10 @@ specific_include_rules = {
|
|||
"builtins-trace\.cc": [
|
||||
"+protos/perfetto",
|
||||
],
|
||||
"system-jit-win\.cc": [
|
||||
"etw-jit-win\.cc": [
|
||||
"+src/libplatform/tracing/recorder.h",
|
||||
],
|
||||
"etw-jit-metadata-win\.h": [
|
||||
"+src/libplatform/etw/etw-provider-win.h",
|
||||
]
|
||||
}
|
||||
|
|
26
deps/v8/src/api/api-arguments-inl.h
vendored
26
deps/v8/src/api/api-arguments-inl.h
vendored
|
@ -12,7 +12,6 @@
|
|||
#include "src/logging/runtime-call-stats-scope.h"
|
||||
#include "src/objects/api-callbacks.h"
|
||||
#include "src/objects/slots-inl.h"
|
||||
#include "src/tracing/trace-event.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
@ -134,7 +133,7 @@ Handle<Object> FunctionCallbackArguments::Call(CallHandlerInfo handler) {
|
|||
Isolate* isolate = this->isolate();
|
||||
RCS_SCOPE(isolate, RuntimeCallCounterId::kFunctionCallback);
|
||||
v8::FunctionCallback f =
|
||||
v8::ToCData<v8::FunctionCallback>(handler.callback());
|
||||
reinterpret_cast<v8::FunctionCallback>(handler.callback());
|
||||
Handle<Object> receiver_check_unsupported;
|
||||
if (isolate->debug_execution_mode() == DebugInfo::kSideEffects &&
|
||||
!isolate->debug()->PerformSideEffectCheckForCallback(
|
||||
|
@ -148,6 +147,17 @@ Handle<Object> FunctionCallbackArguments::Call(CallHandlerInfo handler) {
|
|||
return GetReturnValue<Object>(isolate);
|
||||
}
|
||||
|
||||
PropertyCallbackArguments::~PropertyCallbackArguments(){
|
||||
#ifdef DEBUG
|
||||
// TODO(chromium:1310062): enable this check.
|
||||
// if (javascript_execution_counter_) {
|
||||
// CHECK_WITH_MSG(javascript_execution_counter_ ==
|
||||
// isolate()->javascript_execution_counter(),
|
||||
// "Unexpected side effect detected");
|
||||
// }
|
||||
#endif // DEBUG
|
||||
}
|
||||
|
||||
Handle<JSObject> PropertyCallbackArguments::CallNamedEnumerator(
|
||||
Handle<InterceptorInfo> interceptor) {
|
||||
DCHECK(interceptor->is_named());
|
||||
|
@ -296,8 +306,12 @@ Handle<Object> PropertyCallbackArguments::CallAccessorGetter(
|
|||
Handle<AccessorInfo> info, Handle<Name> name) {
|
||||
Isolate* isolate = this->isolate();
|
||||
RCS_SCOPE(isolate, RuntimeCallCounterId::kAccessorGetterCallback);
|
||||
// Unlike interceptor callbacks we know that the property exists, so
|
||||
// the callback is allowed to have side effects.
|
||||
AcceptSideEffects();
|
||||
|
||||
AccessorNameGetterCallback f =
|
||||
ToCData<AccessorNameGetterCallback>(info->getter());
|
||||
reinterpret_cast<AccessorNameGetterCallback>(info->getter());
|
||||
return BasicCallNamedGetterCallback(f, name, info,
|
||||
handle(receiver(), isolate));
|
||||
}
|
||||
|
@ -307,8 +321,12 @@ Handle<Object> PropertyCallbackArguments::CallAccessorSetter(
|
|||
Handle<Object> value) {
|
||||
Isolate* isolate = this->isolate();
|
||||
RCS_SCOPE(isolate, RuntimeCallCounterId::kAccessorSetterCallback);
|
||||
// Unlike interceptor callbacks we know that the property exists, so
|
||||
// the callback is allowed to have side effects.
|
||||
AcceptSideEffects();
|
||||
|
||||
AccessorNameSetterCallback f =
|
||||
ToCData<AccessorNameSetterCallback>(accessor_info->setter());
|
||||
reinterpret_cast<AccessorNameSetterCallback>(accessor_info->setter());
|
||||
PREPARE_CALLBACK_INFO(isolate, f, Handle<Object>, void, accessor_info,
|
||||
handle(receiver(), isolate), Setter);
|
||||
f(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), callback_info);
|
||||
|
|
10
deps/v8/src/api/api-arguments.cc
vendored
10
deps/v8/src/api/api-arguments.cc
vendored
|
@ -12,7 +12,12 @@ namespace internal {
|
|||
PropertyCallbackArguments::PropertyCallbackArguments(
|
||||
Isolate* isolate, Object data, Object self, JSObject holder,
|
||||
Maybe<ShouldThrow> should_throw)
|
||||
: Super(isolate) {
|
||||
: Super(isolate)
|
||||
#ifdef DEBUG
|
||||
,
|
||||
javascript_execution_counter_(isolate->javascript_execution_counter())
|
||||
#endif // DEBUG
|
||||
{
|
||||
slot_at(T::kThisIndex).store(self);
|
||||
slot_at(T::kHolderIndex).store(holder);
|
||||
slot_at(T::kDataIndex).store(data);
|
||||
|
@ -33,8 +38,7 @@ PropertyCallbackArguments::PropertyCallbackArguments(
|
|||
}
|
||||
|
||||
FunctionCallbackArguments::FunctionCallbackArguments(
|
||||
internal::Isolate* isolate, internal::Object data,
|
||||
internal::HeapObject callee, internal::Object holder,
|
||||
internal::Isolate* isolate, internal::Object data, internal::Object holder,
|
||||
internal::HeapObject new_target, internal::Address* argv, int argc)
|
||||
: Super(isolate), argv_(argv), argc_(argc) {
|
||||
slot_at(T::kDataIndex).store(data);
|
||||
|
|
33
deps/v8/src/api/api-arguments.h
vendored
33
deps/v8/src/api/api-arguments.h
vendored
|
@ -6,8 +6,6 @@
|
|||
#define V8_API_API_ARGUMENTS_H_
|
||||
|
||||
#include "include/v8-template.h"
|
||||
#include "src/api/api.h"
|
||||
#include "src/debug/debug.h"
|
||||
#include "src/execution/isolate.h"
|
||||
#include "src/objects/slots.h"
|
||||
#include "src/objects/visitors.h"
|
||||
|
@ -58,7 +56,15 @@ class CustomArguments : public CustomArgumentsBase {
|
|||
|
||||
// Note: Calling args.Call() sets the return value on args. For multiple
|
||||
// Call()'s, a new args should be used every time.
|
||||
class PropertyCallbackArguments
|
||||
// This class also serves as a side effects detection scope (JavaScript code
|
||||
// execution). It is used for ensuring correctness of the interceptor callback
|
||||
// implementations. The idea is that the interceptor callback that does not
|
||||
// intercept an operation must not produce side effects. If the callback
|
||||
// signals that it has handled the operation (by either returning a respective
|
||||
// result or by throwing an exception) then the AcceptSideEffects() method
|
||||
// must be called to "accept" the side effects that have happened during the
|
||||
// lifetime of the PropertyCallbackArguments object.
|
||||
class PropertyCallbackArguments final
|
||||
: public CustomArguments<PropertyCallbackInfo<Value> > {
|
||||
public:
|
||||
using T = PropertyCallbackInfo<Value>;
|
||||
|
@ -74,6 +80,7 @@ class PropertyCallbackArguments
|
|||
|
||||
PropertyCallbackArguments(Isolate* isolate, Object data, Object self,
|
||||
JSObject holder, Maybe<ShouldThrow> should_throw);
|
||||
inline ~PropertyCallbackArguments();
|
||||
|
||||
// Don't copy PropertyCallbackArguments, because they would both have the
|
||||
// same prev_ pointer.
|
||||
|
@ -128,6 +135,14 @@ class PropertyCallbackArguments
|
|||
inline Handle<JSObject> CallIndexedEnumerator(
|
||||
Handle<InterceptorInfo> interceptor);
|
||||
|
||||
// Accept potential JavaScript side effects that might occurr during life
|
||||
// time of this object.
|
||||
inline void AcceptSideEffects() {
|
||||
#ifdef DEBUG
|
||||
javascript_execution_counter_ = 0;
|
||||
#endif // DEBUG
|
||||
}
|
||||
|
||||
private:
|
||||
/*
|
||||
* The following Call functions wrap the calling of all callbacks to handle
|
||||
|
@ -148,6 +163,13 @@ class PropertyCallbackArguments
|
|||
|
||||
inline JSObject holder();
|
||||
inline Object receiver();
|
||||
|
||||
#ifdef DEBUG
|
||||
// This stores current value of Isolate::javascript_execution_counter().
|
||||
// It's used for detecting whether JavaScript code was executed between
|
||||
// PropertyCallbackArguments's constructior and destructor.
|
||||
uint32_t javascript_execution_counter_;
|
||||
#endif // DEBUG
|
||||
};
|
||||
|
||||
class FunctionCallbackArguments
|
||||
|
@ -163,9 +185,8 @@ class FunctionCallbackArguments
|
|||
static const int kIsolateIndex = T::kIsolateIndex;
|
||||
static const int kNewTargetIndex = T::kNewTargetIndex;
|
||||
|
||||
FunctionCallbackArguments(Isolate* isolate, Object data, HeapObject callee,
|
||||
Object holder, HeapObject new_target, Address* argv,
|
||||
int argc);
|
||||
FunctionCallbackArguments(Isolate* isolate, Object data, Object holder,
|
||||
HeapObject new_target, Address* argv, int argc);
|
||||
|
||||
/*
|
||||
* The following Call function wraps the calling of all callbacks to handle
|
||||
|
|
19
deps/v8/src/api/api-inl.h
vendored
19
deps/v8/src/api/api-inl.h
vendored
|
@ -9,18 +9,16 @@
|
|||
#include "src/api/api.h"
|
||||
#include "src/execution/interrupts-scope.h"
|
||||
#include "src/execution/microtask-queue.h"
|
||||
#include "src/execution/protectors.h"
|
||||
#include "src/handles/handles-inl.h"
|
||||
#include "src/heap/heap-inl.h"
|
||||
#include "src/objects/foreign-inl.h"
|
||||
#include "src/objects/js-weak-refs.h"
|
||||
#include "src/objects/objects-inl.h"
|
||||
|
||||
namespace v8 {
|
||||
|
||||
template <typename T>
|
||||
inline T ToCData(v8::internal::Object obj) {
|
||||
STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
|
||||
static_assert(sizeof(T) == sizeof(v8::internal::Address));
|
||||
if (obj == v8::internal::Smi::zero()) return nullptr;
|
||||
return reinterpret_cast<T>(
|
||||
v8::internal::Foreign::cast(obj).foreign_address());
|
||||
|
@ -35,7 +33,7 @@ inline v8::internal::Address ToCData(v8::internal::Object obj) {
|
|||
template <typename T>
|
||||
inline v8::internal::Handle<v8::internal::Object> FromCData(
|
||||
v8::internal::Isolate* isolate, T obj) {
|
||||
STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
|
||||
static_assert(sizeof(T) == sizeof(v8::internal::Address));
|
||||
if (obj == nullptr) return handle(v8::internal::Smi::zero(), isolate);
|
||||
return isolate->factory()->NewForeign(
|
||||
reinterpret_cast<v8::internal::Address>(obj));
|
||||
|
@ -96,7 +94,6 @@ TYPED_ARRAYS(MAKE_TO_LOCAL_TYPED_ARRAY)
|
|||
MAKE_TO_LOCAL(ToLocal, FunctionTemplateInfo, FunctionTemplate)
|
||||
MAKE_TO_LOCAL(ToLocal, ObjectTemplateInfo, ObjectTemplate)
|
||||
MAKE_TO_LOCAL(SignatureToLocal, FunctionTemplateInfo, Signature)
|
||||
MAKE_TO_LOCAL(AccessorSignatureToLocal, FunctionTemplateInfo, AccessorSignature)
|
||||
MAKE_TO_LOCAL(MessageToLocal, Object, Message)
|
||||
MAKE_TO_LOCAL(PromiseToLocal, JSObject, Promise)
|
||||
MAKE_TO_LOCAL(StackTraceToLocal, FixedArray, StackTrace)
|
||||
|
@ -185,8 +182,8 @@ class V8_NODISCARD CallDepthScope {
|
|||
!microtask_queue->DebugMicrotasksScopeDepthIsZero());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
DCHECK(CheckKeptObjectsClearedAfterMicrotaskCheckpoint(microtask_queue));
|
||||
#endif
|
||||
isolate_->set_next_v8_call_is_safe_for_termination(safe_for_termination_);
|
||||
}
|
||||
|
||||
|
@ -204,6 +201,7 @@ class V8_NODISCARD CallDepthScope {
|
|||
}
|
||||
|
||||
private:
|
||||
#ifdef DEBUG
|
||||
bool CheckKeptObjectsClearedAfterMicrotaskCheckpoint(
|
||||
i::MicrotaskQueue* microtask_queue) {
|
||||
bool did_perform_microtask_checkpoint =
|
||||
|
@ -213,6 +211,7 @@ class V8_NODISCARD CallDepthScope {
|
|||
return !did_perform_microtask_checkpoint ||
|
||||
isolate_->heap()->weak_refs_keep_during_job().IsUndefined(isolate_);
|
||||
}
|
||||
#endif
|
||||
|
||||
i::Isolate* const isolate_;
|
||||
Local<Context> context_;
|
||||
|
@ -233,14 +232,6 @@ class V8_NODISCARD InternalEscapableScope : public EscapableHandleScope {
|
|||
: EscapableHandleScope(reinterpret_cast<v8::Isolate*>(isolate)) {}
|
||||
};
|
||||
|
||||
inline bool IsExecutionTerminatingCheck(i::Isolate* isolate) {
|
||||
if (isolate->has_scheduled_exception()) {
|
||||
return isolate->scheduled_exception() ==
|
||||
i::ReadOnlyRoots(isolate).termination_exception();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void CopySmiElementsToTypedBuffer(T* dst, uint32_t length,
|
||||
i::FixedArray elements) {
|
||||
|
|
4
deps/v8/src/api/api-macros-undef.h
vendored
4
deps/v8/src/api/api-macros-undef.h
vendored
|
@ -5,8 +5,8 @@
|
|||
// PRESUBMIT_INTENTIONALLY_MISSING_INCLUDE_GUARD
|
||||
|
||||
#undef LOG_API
|
||||
#undef ENTER_V8_DO_NOT_USE
|
||||
#undef ENTER_V8_HELPER_DO_NOT_USE
|
||||
#undef ENTER_V8_BASIC
|
||||
#undef ENTER_V8_HELPER_INTERNAL
|
||||
#undef PREPARE_FOR_DEBUG_INTERFACE_EXECUTION_WITH_ISOLATE
|
||||
#undef PREPARE_FOR_EXECUTION_WITH_CONTEXT
|
||||
#undef PREPARE_FOR_EXECUTION
|
||||
|
|
137
deps/v8/src/api/api-macros.h
vendored
137
deps/v8/src/api/api-macros.h
vendored
|
@ -35,98 +35,117 @@
|
|||
* TODO(verwaest): Remove calls form API methods to DO_NOT_USE macros.
|
||||
*/
|
||||
|
||||
#define API_RCS_SCOPE(isolate, class_name, function_name) \
|
||||
RCS_SCOPE(isolate, \
|
||||
#define API_RCS_SCOPE(i_isolate, class_name, function_name) \
|
||||
RCS_SCOPE(i_isolate, \
|
||||
i::RuntimeCallCounterId::kAPI_##class_name##_##function_name);
|
||||
|
||||
#define ENTER_V8_DO_NOT_USE(isolate) i::VMState<v8::OTHER> __state__((isolate))
|
||||
#define ENTER_V8_BASIC(i_isolate) \
|
||||
/* Embedders should never enter V8 after terminating it */ \
|
||||
DCHECK(!i_isolate->is_execution_terminating()); \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate))
|
||||
|
||||
#define ENTER_V8_HELPER_DO_NOT_USE(isolate, context, class_name, \
|
||||
function_name, bailout_value, \
|
||||
HandleScopeClass, do_callback) \
|
||||
if (IsExecutionTerminatingCheck(isolate)) { \
|
||||
return bailout_value; \
|
||||
} \
|
||||
HandleScopeClass handle_scope(isolate); \
|
||||
CallDepthScope<do_callback> call_depth_scope(isolate, context); \
|
||||
API_RCS_SCOPE(isolate, class_name, function_name); \
|
||||
i::VMState<v8::OTHER> __state__((isolate)); \
|
||||
#define ENTER_V8_HELPER_INTERNAL(i_isolate, context, class_name, \
|
||||
function_name, bailout_value, \
|
||||
HandleScopeClass, do_callback) \
|
||||
if (i_isolate->is_execution_terminating()) { \
|
||||
return bailout_value; \
|
||||
} \
|
||||
HandleScopeClass handle_scope(i_isolate); \
|
||||
CallDepthScope<do_callback> call_depth_scope(i_isolate, context); \
|
||||
API_RCS_SCOPE(i_isolate, class_name, function_name); \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate)); \
|
||||
bool has_pending_exception = false
|
||||
|
||||
#define PREPARE_FOR_DEBUG_INTERFACE_EXECUTION_WITH_ISOLATE(isolate, T) \
|
||||
if (IsExecutionTerminatingCheck(isolate)) { \
|
||||
return MaybeLocal<T>(); \
|
||||
} \
|
||||
InternalEscapableScope handle_scope(isolate); \
|
||||
CallDepthScope<false> call_depth_scope(isolate, v8::Local<v8::Context>()); \
|
||||
i::VMState<v8::OTHER> __state__((isolate)); \
|
||||
#define PREPARE_FOR_DEBUG_INTERFACE_EXECUTION_WITH_ISOLATE(i_isolate, T) \
|
||||
if (i_isolate->is_execution_terminating()) { \
|
||||
return MaybeLocal<T>(); \
|
||||
} \
|
||||
InternalEscapableScope handle_scope(i_isolate); \
|
||||
CallDepthScope<false> call_depth_scope(i_isolate, v8::Local<v8::Context>()); \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate)); \
|
||||
bool has_pending_exception = false
|
||||
|
||||
#define PREPARE_FOR_EXECUTION_WITH_CONTEXT(context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, \
|
||||
do_callback) \
|
||||
auto isolate = context.IsEmpty() \
|
||||
? i::Isolate::Current() \
|
||||
: reinterpret_cast<i::Isolate*>(context->GetIsolate()); \
|
||||
ENTER_V8_HELPER_DO_NOT_USE(isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, do_callback);
|
||||
auto i_isolate = context.IsEmpty() \
|
||||
? i::Isolate::Current() \
|
||||
: reinterpret_cast<i::Isolate*>(context->GetIsolate()); \
|
||||
ENTER_V8_HELPER_INTERNAL(i_isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, do_callback);
|
||||
|
||||
#define PREPARE_FOR_EXECUTION(context, class_name, function_name, T) \
|
||||
PREPARE_FOR_EXECUTION_WITH_CONTEXT(context, class_name, function_name, \
|
||||
MaybeLocal<T>(), InternalEscapableScope, \
|
||||
false)
|
||||
|
||||
#define ENTER_V8(isolate, context, class_name, function_name, bailout_value, \
|
||||
HandleScopeClass) \
|
||||
ENTER_V8_HELPER_DO_NOT_USE(isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, true)
|
||||
#define ENTER_V8(i_isolate, context, class_name, function_name, bailout_value, \
|
||||
HandleScopeClass) \
|
||||
ENTER_V8_HELPER_INTERNAL(i_isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, true)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define ENTER_V8_NO_SCRIPT(isolate, context, class_name, function_name, \
|
||||
#define ENTER_V8_NO_SCRIPT(i_isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass) \
|
||||
ENTER_V8_HELPER_DO_NOT_USE(isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, false); \
|
||||
i::DisallowJavascriptExecutionDebugOnly __no_script__((isolate))
|
||||
ENTER_V8_HELPER_INTERNAL(i_isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, false); \
|
||||
i::DisallowJavascriptExecutionDebugOnly __no_script__((i_isolate))
|
||||
|
||||
#define DCHECK_NO_SCRIPT_NO_EXCEPTION_MAYBE_TEARDOWN(i_isolate) \
|
||||
i::DisallowJavascriptExecutionDebugOnly __no_script__((i_isolate)); \
|
||||
i::DisallowExceptions __no_exceptions__((i_isolate))
|
||||
|
||||
// Lightweight version for APIs that don't require an active context.
|
||||
#define ASSERT_NO_SCRIPT_NO_EXCEPTION(isolate) \
|
||||
i::DisallowJavascriptExecutionDebugOnly __no_script__((isolate)); \
|
||||
i::DisallowExceptions __no_exceptions__((isolate))
|
||||
#define DCHECK_NO_SCRIPT_NO_EXCEPTION(i_isolate) \
|
||||
/* Embedders should never enter V8 after terminating it */ \
|
||||
DCHECK(!i_isolate->is_execution_terminating()); \
|
||||
DCHECK_NO_SCRIPT_NO_EXCEPTION_MAYBE_TEARDOWN(i_isolate)
|
||||
|
||||
#define ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate) \
|
||||
i::VMState<v8::OTHER> __state__((isolate)); \
|
||||
ASSERT_NO_SCRIPT_NO_EXCEPTION(isolate)
|
||||
#define ENTER_V8_NO_SCRIPT_NO_EXCEPTION(i_isolate) \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate)); \
|
||||
DCHECK_NO_SCRIPT_NO_EXCEPTION(i_isolate)
|
||||
|
||||
#define ENTER_V8_FOR_NEW_CONTEXT(isolate) \
|
||||
i::VMState<v8::OTHER> __state__((isolate)); \
|
||||
i::DisallowExceptions __no_exceptions__((isolate))
|
||||
#else
|
||||
#define ENTER_V8_NO_SCRIPT(isolate, context, class_name, function_name, \
|
||||
// Used instead of ENTER_V8_NO_SCRIPT_NO_EXCEPTION where the V8 Api is entered
|
||||
// during termination sequences.
|
||||
#define ENTER_V8_MAYBE_TEARDOWN(i_isolate) \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate)); \
|
||||
DCHECK_NO_SCRIPT_NO_EXCEPTION_MAYBE_TEARDOWN(i_isolate)
|
||||
|
||||
#define ENTER_V8_FOR_NEW_CONTEXT(i_isolate) \
|
||||
DCHECK(!(i_isolate)->is_execution_terminating()); \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate)); \
|
||||
i::DisallowExceptions __no_exceptions__((i_isolate))
|
||||
#else // DEBUG
|
||||
#define ENTER_V8_NO_SCRIPT(i_isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass) \
|
||||
ENTER_V8_HELPER_DO_NOT_USE(isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, false)
|
||||
ENTER_V8_HELPER_INTERNAL(i_isolate, context, class_name, function_name, \
|
||||
bailout_value, HandleScopeClass, false)
|
||||
|
||||
#define ASSERT_NO_SCRIPT_NO_EXCEPTION(isolate)
|
||||
#define DCHECK_NO_SCRIPT_NO_EXCEPTION(i_isolate)
|
||||
#define DCHECK_NO_SCRIPT_NO_EXCEPTION_MAYBE_TEARDOWN(i_isolate)
|
||||
|
||||
#define ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate) \
|
||||
i::VMState<v8::OTHER> __state__((isolate));
|
||||
#define ENTER_V8_NO_SCRIPT_NO_EXCEPTION(i_isolate) \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate));
|
||||
|
||||
#define ENTER_V8_FOR_NEW_CONTEXT(isolate) \
|
||||
i::VMState<v8::OTHER> __state__((isolate));
|
||||
#define ENTER_V8_MAYBE_TEARDOWN(i_isolate) \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate));
|
||||
|
||||
#define ENTER_V8_FOR_NEW_CONTEXT(i_isolate) \
|
||||
i::VMState<v8::OTHER> __state__((i_isolate));
|
||||
#endif // DEBUG
|
||||
|
||||
#define EXCEPTION_BAILOUT_CHECK_SCOPED_DO_NOT_USE(isolate, value) \
|
||||
do { \
|
||||
if (has_pending_exception) { \
|
||||
call_depth_scope.Escape(); \
|
||||
return value; \
|
||||
} \
|
||||
#define EXCEPTION_BAILOUT_CHECK_SCOPED_DO_NOT_USE(i_isolate, value) \
|
||||
do { \
|
||||
if (has_pending_exception) { \
|
||||
call_depth_scope.Escape(); \
|
||||
return value; \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
#define RETURN_ON_FAILED_EXECUTION(T) \
|
||||
EXCEPTION_BAILOUT_CHECK_SCOPED_DO_NOT_USE(isolate, MaybeLocal<T>())
|
||||
EXCEPTION_BAILOUT_CHECK_SCOPED_DO_NOT_USE(i_isolate, MaybeLocal<T>())
|
||||
|
||||
#define RETURN_ON_FAILED_EXECUTION_PRIMITIVE(T) \
|
||||
EXCEPTION_BAILOUT_CHECK_SCOPED_DO_NOT_USE(isolate, Nothing<T>())
|
||||
EXCEPTION_BAILOUT_CHECK_SCOPED_DO_NOT_USE(i_isolate, Nothing<T>())
|
||||
|
||||
#define RETURN_ESCAPED(value) return handle_scope.Escape(value);
|
||||
|
|
3
deps/v8/src/api/api-natives.cc
vendored
3
deps/v8/src/api/api-natives.cc
vendored
|
@ -4,15 +4,12 @@
|
|||
|
||||
#include "src/api/api-natives.h"
|
||||
|
||||
#include "src/api/api-inl.h"
|
||||
#include "src/common/message-template.h"
|
||||
#include "src/execution/isolate-inl.h"
|
||||
#include "src/heap/heap-inl.h"
|
||||
#include "src/logging/runtime-call-stats-scope.h"
|
||||
#include "src/objects/api-callbacks.h"
|
||||
#include "src/objects/hash-table-inl.h"
|
||||
#include "src/objects/lookup.h"
|
||||
#include "src/objects/property-cell.h"
|
||||
#include "src/objects/templates.h"
|
||||
|
||||
namespace v8 {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue