diff --git a/common.gypi b/common.gypi index 8a14bb85767b4f..84b94447f9ad62 100644 --- a/common.gypi +++ b/common.gypi @@ -38,7 +38,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.11', + 'v8_embedder_string': '-node.8', ##### V8 defaults for Node.js ##### diff --git a/configure.py b/configure.py index c9397f1c496880..486f52a5f9ce93 100755 --- a/configure.py +++ b/configure.py @@ -2069,6 +2069,7 @@ def configure_v8(o, configs): if sys.platform != 'darwin': if o['variables']['v8_enable_webassembly'] and o['variables']['target_arch'] == 'x64': o['variables']['v8_enable_wasm_simd256_revec'] = 1 + o['variables']['v8_enable_verify_write_barriers'] = 1 if options.debug else 0 def configure_openssl(o): variables = o['variables'] diff --git a/deps/v8/.clang-format b/deps/v8/.clang-format index d655b2039f8848..370034d67bba3a 100644 --- a/deps/v8/.clang-format +++ b/deps/v8/.clang-format @@ -14,6 +14,11 @@ Macros: - CASE_=case - FOR_WITH_HANDLE_SCOPE(isolate, init, loop_var, limit_check, increment)=for(init; loop_var; increment) - WHILE_WITH_HANDLE_SCOPE(isolate, limit_check)=while(limit_check) + # Make clang-format parse conditions in flag implications as expressions, not type definitions. + - DEFINE_IMPLICATION(cond,flag,value)=if(cond) { flag; }; + - DEFINE_WEAK_IMPLICATION(cond,flag,value)=if(cond) { flag; }; + - DEFINE_VALUE_IMPLICATION(cond,flag,value)=if(cond) { flag = value; }; + - DEFINE_WEAK_VALUE_IMPLICATION(cond,flag,value)=if(cond) { flag = value; }; StatementMacros: - DECL_CAST - DECL_VERIFIER diff --git a/deps/v8/.gn b/deps/v8/.gn index e13ae6d5ec82da..6ead7196c515cf 100644 --- a/deps/v8/.gn +++ b/deps/v8/.gn @@ -36,6 +36,9 @@ default_args = { # Use Siso instead of Ninja. use_siso = true + + # V8 should stay in C++20 for now. + use_cxx23 = false } # These are the list of GN files that run exec_script. This whitelist exists diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS index 867cc3398e49f6..f677d68e9cf337 100644 --- a/deps/v8/AUTHORS +++ b/deps/v8/AUTHORS @@ -272,6 +272,7 @@ Rong Wang Ross Kirsling Ruben Bridgewater Ryan Dahl +Sahil Shaikh Sakthipriyan Vairamani (thefourtheye) Sander Mathijs van Veen Sandro Santilli @@ -339,6 +340,7 @@ Zhao Jiazhong Zhao Qin Zhaojun Meng Zheng Liu +Zhongqi Wang Zhongping Wang 柳荣一 Yang Xiang diff --git a/deps/v8/BUILD.bazel b/deps/v8/BUILD.bazel index d49da552c42612..ab41feeb1b8890 100644 --- a/deps/v8/BUILD.bazel +++ b/deps/v8/BUILD.bazel @@ -512,7 +512,6 @@ v8_config( "GOOGLE3", "V8_ADVANCED_BIGINT_ALGORITHMS", "V8_CONCURRENT_MARKING", - "V8_ENABLE_LEAPTIERING", "V8_ENABLE_SPARKPLUG", "V8_ENABLE_EXTENSIBLE_RO_SNAPSHOT", "V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA", @@ -523,6 +522,18 @@ v8_config( "V8_ENABLE_CHECKS", ], "//conditions:default": [], + }) + select({ + "@v8//bazel/config:asan_enabled" : [ "V8_USE_ADDRESS_SANITIZER" ], + "//conditions:default": [], + }) + select({ + "@v8//bazel/config:hwasan_enabled" : [ "V8_USE_HWADDRESS_SANITIZER" ], + "//conditions:default": [], + }) + select({ + "@v8//bazel/config:msan_enabled" : [ "V8_USE_MEMORY_SANITIZER" ], + "//conditions:default": [], + }) + select({ + "@v8//bazel/config:ubsan_enabled" : [ "V8_USE_UNDEFINED_BEHAVIOR_SANITIZER" ], + "//conditions:default": [], }) + select( { "@v8//bazel/config:v8_target_ia32": ["V8_TARGET_ARCH_IA32"], @@ -797,6 +808,7 @@ filegroup( "src/base/abort-mode.cc", "src/base/abort-mode.h", "src/base/address-region.h", + "src/base/algorithm.h", "src/base/atomic-utils.h", "src/base/atomicops.h", "src/base/base-export.h", @@ -826,6 +838,7 @@ filegroup( "src/base/file-utils.cc", "src/base/file-utils.h", "src/base/flags.h", + "src/base/float16.h", "src/base/fpu.cc", "src/base/fpu.h", "src/base/functional/bind-internal.h", @@ -843,6 +856,7 @@ filegroup( "src/base/logging.cc", "src/base/logging.h", "src/base/macros.h", + "src/base/memcopy.h", "src/base/memory.h", "src/base/numbers/bignum.cc", "src/base/numbers/bignum.h", @@ -1625,6 +1639,7 @@ filegroup( "src/execution/isolate.cc", "src/execution/isolate.h", "src/execution/isolate-data.h", + "src/execution/isolate-data-fields.h", "src/execution/isolate-inl.h", "src/execution/isolate-utils.h", "src/execution/isolate-utils-inl.h", @@ -1701,9 +1716,9 @@ filegroup( "src/heap/base-space.h", "src/heap/base/active-system-pages.cc", "src/heap/base/active-system-pages.h", - "src/heap/memory-chunk-metadata.cc", - "src/heap/memory-chunk-metadata.h", - "src/heap/memory-chunk-metadata-inl.h", + "src/heap/base-page.cc", + "src/heap/base-page.h", + "src/heap/base-page-inl.h", "src/heap/code-range.cc", "src/heap/code-range.h", "src/heap/trusted-range.cc", @@ -1783,9 +1798,9 @@ filegroup( "src/heap/incremental-marking-job.h", "src/heap/index-generator.cc", "src/heap/index-generator.h", - "src/heap/large-page-metadata.cc", - "src/heap/large-page-metadata.h", - "src/heap/large-page-metadata-inl.h", + "src/heap/large-page.cc", + "src/heap/large-page.h", + "src/heap/large-page-inl.h", "src/heap/large-spaces.cc", "src/heap/large-spaces.h", "src/heap/linear-allocation-area.h", @@ -1827,9 +1842,9 @@ filegroup( "src/heap/memory-allocator.h", "src/heap/memory-balancer.cc", "src/heap/memory-balancer.h", - "src/heap/mutable-page-metadata.cc", - "src/heap/mutable-page-metadata.h", - "src/heap/mutable-page-metadata-inl.h", + "src/heap/mutable-page.cc", + "src/heap/mutable-page.h", + "src/heap/mutable-page-inl.h", "src/heap/memory-chunk.cc", "src/heap/memory-chunk.h", "src/heap/memory-chunk-constants.h", @@ -1854,9 +1869,9 @@ filegroup( "src/heap/heap-visitor.cc", "src/heap/heap-visitor.h", "src/heap/heap-visitor-inl.h", - "src/heap/page-metadata.cc", - "src/heap/page-metadata.h", - "src/heap/page-metadata-inl.h", + "src/heap/normal-page.cc", + "src/heap/normal-page.h", + "src/heap/normal-page-inl.h", "src/heap/paged-spaces.cc", "src/heap/paged-spaces.h", "src/heap/paged-spaces-inl.h", @@ -2203,6 +2218,8 @@ filegroup( "src/objects/hole.h", "src/objects/trusted-object.h", "src/objects/trusted-object-inl.h", + "src/objects/trusted-pointer.h", + "src/objects/trusted-pointer-inl.h", "src/objects/option-utils.cc", "src/objects/option-utils.h", "src/objects/ordered-hash-table.cc", @@ -2463,6 +2480,8 @@ filegroup( "src/runtime/runtime-weak-refs.cc", "src/sandbox/bounded-size.h", "src/sandbox/bounded-size-inl.h", + "src/sandbox/bytecode-verifier.h", + "src/sandbox/bytecode-verifier.cc", "src/sandbox/check.h", "src/sandbox/external-pointer.h", "src/sandbox/external-pointer-inl.h", @@ -2490,6 +2509,8 @@ filegroup( "src/sandbox/code-sandboxing-mode.h", "src/sandbox/compactible-external-entity-table-inl.h", "src/sandbox/compactible-external-entity-table.h", + "src/sandbox/external-strings-cage.cc", + "src/sandbox/external-strings-cage.h", "src/sandbox/isolate.h", "src/sandbox/isolate-inl.h", "src/sandbox/indirect-pointer.h", @@ -2558,6 +2579,7 @@ filegroup( "src/snapshot/startup-serializer.h", "src/strings/char-predicates.h", "src/strings/char-predicates-inl.h", + "src/strings/owning-external-string-resource.h", "src/strings/string-builder.cc", "src/strings/string-builder.h", "src/strings/string-builder-inl.h", @@ -2583,6 +2605,7 @@ filegroup( "src/tasks/task-utils.cc", "src/tasks/task-utils.h", "src/torque/runtime-macro-shims.h", + "src/tracing/perfetto-sdk.h", "src/tracing/trace-event.cc", "src/tracing/trace-event.h", "src/tracing/trace-event-no-perfetto.h", @@ -2606,7 +2629,6 @@ filegroup( "src/utils/identity-map.h", "src/utils/locked-queue.h", "src/utils/locked-queue-inl.h", - "src/utils/memcopy.cc", "src/utils/memcopy.h", "src/utils/output-stream.cc", "src/utils/output-stream.h", @@ -2923,7 +2945,9 @@ filegroup( "src/maglev/maglev-pipeline-statistics.h", "src/maglev/maglev-post-hoc-optimizations-processors.h", "src/maglev/maglev-pre-regalloc-codegen-processors.h", + "src/maglev/maglev-range.h", "src/maglev/maglev-range-analysis.h", + "src/maglev/maglev-range-verification.h", "src/maglev/maglev-reducer-inl.h", "src/maglev/maglev-reducer.h", "src/maglev/maglev-regalloc-data.h", @@ -2950,6 +2974,7 @@ filegroup( "src/maglev/maglev-phi-representation-selector.cc", "src/maglev/maglev-truncation.cc", "src/maglev/maglev-pipeline-statistics.cc", + "src/maglev/maglev-range-verification.cc", "src/maglev/maglev-regalloc.cc", "src/maglev/maglev.cc", ], @@ -3025,12 +3050,13 @@ filegroup( "src/wasm/code-space-access.h", "src/wasm/compilation-environment.h", "src/wasm/compilation-environment-inl.h", + "src/wasm/compilation-hints-generation.cc", + "src/wasm/compilation-hints-generation.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/float16.h", "src/wasm/function-body-decoder.cc", "src/wasm/function-body-decoder.h", "src/wasm/function-body-decoder-impl.h", @@ -3096,7 +3122,11 @@ filegroup( "src/wasm/wasm-features.cc", "src/wasm/wasm-features.h", "src/wasm/wasm-import-wrapper-cache.cc", + "src/wasm/wasm-stack-wrapper-cache.cc", + "src/wasm/wasm-wrapper-cache.cc", "src/wasm/wasm-import-wrapper-cache.h", + "src/wasm/wasm-stack-wrapper-cache.h", + "src/wasm/wasm-wrapper-cache.h", "src/wasm/wasm-init-expr.h", "src/wasm/wasm-js.cc", "src/wasm/wasm-js.h", @@ -3128,6 +3158,7 @@ filegroup( "src/wasm/wrappers.cc", "src/wasm/wrappers.h", "src/wasm/wrappers-inl.h", + "src/wasm/wasm-wrapper-cache-inl.h", "third_party/utf8-decoder/generalized-utf8-decoder.h", ], "//conditions:default": [], @@ -3247,8 +3278,8 @@ filegroup( "src/compiler/backend/spill-placer.cc", "src/compiler/backend/spill-placer.h", "src/compiler/backend/unwinding-info-writer.h", - "src/compiler/basic-block-instrumentor.cc", - "src/compiler/basic-block-instrumentor.h", + "src/compiler/basic-block-call-graph-profiler.cc", + "src/compiler/basic-block-call-graph-profiler.h", "src/compiler/branch-elimination.cc", "src/compiler/branch-elimination.h", "src/compiler/bytecode-analysis.cc", @@ -3502,6 +3533,7 @@ filegroup( "src/compiler/turboshaft/late-load-elimination-reducer.h", "src/compiler/turboshaft/layered-hash-map.h", "src/compiler/turboshaft/load-store-simplification-reducer.h", + "src/compiler/turboshaft/load-store-verification-reducer.h", "src/compiler/turboshaft/loop-finder.cc", "src/compiler/turboshaft/loop-finder.h", "src/compiler/turboshaft/loop-peeling-phase.cc", @@ -3737,7 +3769,10 @@ filegroup( "src/maglev/maglev-ir.h", "src/maglev/maglev-ir-inl.h", "src/maglev/maglev-kna-processor.h", + "src/maglev/maglev-range.h", "src/maglev/maglev-range-analysis.h", + "src/maglev/maglev-range-verification.cc", + "src/maglev/maglev-range-verification.h", "src/maglev/maglev-reducer-inl.h", "src/maglev/maglev-reducer.h", "src/maglev/maglev-register-frame-array.h", @@ -3799,6 +3834,7 @@ filegroup( "src/builtins/builtins-string-gen.cc", "src/builtins/builtins-string-gen.h", "src/builtins/builtins-string-tsa.cc", + "src/builtins/builtins-string-tsa-inl.h", "src/builtins/builtins-typed-array-gen.cc", "src/builtins/builtins-typed-array-gen.h", "src/builtins/builtins-utils-gen.h", diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn index 3a51ee81fadd13..6801927b0d079b 100644 --- a/deps/v8/BUILD.gn +++ b/deps/v8/BUILD.gn @@ -9,7 +9,6 @@ import("//build/config/dcheck_always_on.gni") import("//build/config/host_byteorder.gni") import("//build/config/mips.gni") import("//build/config/riscv.gni") -import("//build/config/rust.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build_overrides/build.gni") import("//third_party/icu/config.gni") @@ -21,6 +20,10 @@ if (is_clang) { import("//build/config/clang/clang.gni") } +if (v8_enable_temporal_support) { + import("//build/config/rust.gni") +} + if (is_ios) { import("//build/config/apple/mobile_config.gni") # For `target_platform`. } @@ -457,7 +460,8 @@ declare_args() { v8_enable_experimental_tsa_builtins = false # Use the encoding of undefined in double values. - v8_enable_undefined_double = false + # Only enabled for fuzzing in V8 Fuzzilli builds + v8_enable_undefined_double = v8_fuzzilli v8_dcheck_always_on = dcheck_always_on @@ -489,6 +493,12 @@ declare_args() { # Use a hard-coded secret value when hashing. v8_use_default_hasher_secret = true + + # add instrumentation for Dumpling differential fuzzing + v8_dumpling = false + + # Enable compilation of riscv32. + v8_riscv_enable_deprecated_riscv32 = false } # Derived defaults. @@ -598,16 +608,18 @@ if (v8_enable_external_code_space == "") { v8_enable_pointer_compression && v8_enable_pointer_compression_shared_cage && (v8_current_cpu == "x64" || v8_current_cpu == "arm64" || - v8_current_cpu == "loong64") + v8_current_cpu == "loong64" || v8_current_cpu == "riscv64") } if (v8_enable_sparkplug == "") { v8_enable_sparkplug = !v8_jitless } if (v8_enable_maglev == "") { - v8_enable_maglev = v8_enable_turbofan && - (v8_current_cpu == "arm" || v8_current_cpu == "x64" || - v8_current_cpu == "arm64" || v8_current_cpu == "s390x" || - v8_current_cpu == "ppc64" || v8_current_cpu == "riscv64") + v8_enable_maglev = + v8_enable_turbofan && + (v8_current_cpu == "arm" || v8_current_cpu == "x64" || + v8_current_cpu == "arm64" || v8_current_cpu == "s390x" || + v8_current_cpu == "ppc64" || v8_current_cpu == "riscv64" || + v8_current_cpu == "loong64") } assert(v8_enable_turbofan || !v8_enable_maglev, "Maglev is not available when Turbofan is disabled.") @@ -978,6 +990,8 @@ external_v8_defines = [ "V8_DEPRECATION_WARNINGS", "V8_IMMINENT_DEPRECATION_WARNINGS", "V8_USE_PERFETTO", + "V8_USE_PERFETTO_JSON_EXPORT", + "V8_USE_PERFETTO_SDK", "V8_MAP_PACKING", "V8_IS_TSAN", "V8_ENABLE_DIRECT_HANDLE", @@ -990,6 +1004,8 @@ external_v8_defines = [ "V8_TARGET_OS_MACOS", "V8_TARGET_OS_WIN", "V8_TARGET_OS_CHROMEOS", + "V8_TARGET_ARCH_ARM64", + "V8_TARGET_ARCH_PPC64", ] enabled_external_v8_defines = [ @@ -1026,6 +1042,12 @@ if (v8_imminent_deprecation_warnings) { if (v8_use_perfetto) { enabled_external_v8_defines += [ "V8_USE_PERFETTO" ] } +if (v8_use_perfetto_json_export) { + enabled_external_v8_defines += [ "V8_USE_PERFETTO_JSON_EXPORT" ] +} +if (v8_use_perfetto_sdk) { + enabled_external_v8_defines += [ "V8_USE_PERFETTO_SDK" ] +} if (v8_enable_map_packing) { enabled_external_v8_defines += [ "V8_MAP_PACKING" ] } @@ -1066,6 +1088,18 @@ if (target_os == "android") { enabled_external_v8_defines += [ "V8_TARGET_OS_CHROMEOS" ] } +# Some V8_TARGET_ARCH_ defines that affect Api constants (see usages of +# V8_TARGET_ARCH_* in v8-internal.h). +# The target architecture may differ from host one e.g. in mksnapshot or in +# msan builds. +# TODO(ishell): support all target archs and add V8_HAVE_TARGET_ARCH similar +# to V8_TARGET_OS_* and V8_HAVE_TARGET_OS defines. +if (v8_current_cpu == "arm64") { + enabled_external_v8_defines += [ "V8_TARGET_ARCH_ARM64" ] +} else if (v8_current_cpu == "ppc64") { + enabled_external_v8_defines += [ "V8_TARGET_ARCH_PPC64" ] +} + disabled_external_v8_defines = external_v8_defines - enabled_external_v8_defines # Put defines that are used in public headers here; public headers are @@ -1176,8 +1210,7 @@ config("features") { if (v8_enable_pointer_compression) { if (v8_enable_pointer_compression_shared_cage) { defines += [ - # TODO(442942399): Re-enable after bug has been addressed. - # "V8_CONTIGUOUS_COMPRESSED_RO_SPACE", + "V8_CONTIGUOUS_COMPRESSED_RO_SPACE", "V8_CONTIGUOUS_COMPRESSED_RO_SPACE_SIZE_MB=${v8_contiguous_compressed_ro_space_size_mb}", ] } else { @@ -1326,6 +1359,12 @@ config("features") { if (v8_fuzzilli) { defines += [ "V8_FUZZILLI" ] } + if (v8_dumpling) { + defines += [ "V8_DUMPLING" ] + } + if (v8_riscv_enable_deprecated_riscv32) { + defines += [ "V8_RISCV_ENABLE_DEPRECATED_RISCV32" ] + } if (v8_enable_fuzztest) { defines += [ "V8_ENABLE_FUZZTEST" ] } @@ -1459,7 +1498,6 @@ config("features") { if (v8_enable_undefined_double) { defines += [ "V8_ENABLE_UNDEFINED_DOUBLE" ] } - defines += [ "V8_ENABLE_LEAPTIERING" ] if (v8_enable_partition_alloc) { defines += [ "V8_ENABLE_PARTITION_ALLOC" ] } @@ -1486,24 +1524,16 @@ config("toolchain") { ldflags = [] if (v8_current_cpu == "arm") { - defines += [ "V8_TARGET_ARCH_ARM" ] - if (arm_version >= 7) { - defines += [ "CAN_USE_ARMV7_INSTRUCTIONS" ] - } - if (arm_fpu == "vfpv3-d16") { - defines += [ "CAN_USE_VFP3_INSTRUCTIONS" ] - } else if (arm_fpu == "vfpv3") { - defines += [ - "CAN_USE_VFP3_INSTRUCTIONS", - "CAN_USE_VFP32DREGS", - ] - } else if (arm_fpu == "neon") { - defines += [ - "CAN_USE_VFP3_INSTRUCTIONS", - "CAN_USE_VFP32DREGS", - "CAN_USE_NEON", - ] - } + defines += [ + "V8_TARGET_ARCH_ARM", + + # TODO(arm): Now that we always require v7+ and neon, we can simplify the + # code and then stop defining these. + "CAN_USE_ARMV7_INSTRUCTIONS", + "CAN_USE_VFP3_INSTRUCTIONS", + "CAN_USE_VFP32DREGS", + "CAN_USE_NEON", + ] # TODO(infra): Add support for arm_test_noprobe. @@ -1570,14 +1600,14 @@ config("toolchain") { defines += [ "V8_TARGET_ARCH_S390X" ] if (host_byteorder == "little") { defines += [ "V8_TARGET_ARCH_S390X_LE_SIM" ] - } else if (current_os != "zos") { - cflags += [ "-march=z196" ] + } else if (!v8_target_is_simulator && current_os != "zos") { + cflags += [ "-march=z14" ] } } if (v8_current_cpu == "ppc64") { defines += [ "V8_TARGET_ARCH_PPC64" ] cflags += [ "-ffp-contract=off" ] - if (current_os == "aix") { + if (current_os == "aix" && !is_clang) { cflags += [ # Work around AIX ceil, trunc and round oddities. "-mcpu=power5+", @@ -1586,18 +1616,26 @@ config("toolchain") { # Work around AIX assembler popcntb bug. "-mno-popcntb", ] + } else if (!v8_target_is_simulator) { + cflags += [ "-mcpu=pwr9" ] } } - # Under simulator build, compiler will not provide __riscv_xlen. Define here if (v8_current_cpu == "riscv64" || v8_current_cpu == "riscv32") { if (v8_target_is_simulator) { - defines += [ "_RISCV_TARGET_SIMULATOR" ] + defines += [ "RISCV_TARGET_SIMULATOR" ] } if (riscv_use_rvv || v8_target_is_simulator) { defines += [ "CAN_USE_RVV_INSTRUCTIONS" ] defines += [ "RVV_VLEN=${riscv_rvv_vlen}" ] } + + if (riscv_use_zicfiss) { + defines += [ "V8_ENABLE_RISCV_SHADOW_STACK" ] + } + if (riscv_use_zicond) { + defines += [ "__riscv_zicond" ] + } if (riscv_use_zba) { defines += [ "__riscv_zba" ] } @@ -1607,10 +1645,19 @@ config("toolchain") { if (riscv_use_zbs) { defines += [ "__riscv_zbs" ] } + defines += [ "RISCV_CODE_ALIGNMENT=${riscv_code_alignment}" ] + defines += + [ "RISCV_CONSTANT_POOL_ALIGNMENT=${riscv_constant_pool_alignment}" ] } + if (v8_current_cpu == "riscv64") { defines += [ "V8_TARGET_ARCH_RISCV64" ] - defines += [ "__riscv_xlen=64" ] + + # When building the simulator, the compiler does not provide __riscv_xlen, + # so we explicitly define it here. + if (v8_target_is_simulator) { + defines += [ "__riscv_xlen=64" ] + } if (!is_clang) { cflags += [ "-ffp-contract=off" ] } @@ -1621,7 +1668,12 @@ config("toolchain") { if (v8_current_cpu == "riscv32") { defines += [ "V8_TARGET_ARCH_RISCV32" ] - defines += [ "__riscv_xlen=32" ] + + # When building the simulator, the compiler does not provide __riscv_xlen, + # so we explicitly define it here. + if (v8_target_is_simulator) { + defines += [ "__riscv_xlen=32" ] + } } if (v8_current_cpu == "x86") { @@ -3084,6 +3136,7 @@ v8_source_set("v8_initializers") { "src/builtins/builtins-sharedarraybuffer-gen.cc", "src/builtins/builtins-string-gen.cc", "src/builtins/builtins-string-gen.h", + "src/builtins/builtins-string-tsa-inl.h", "src/builtins/builtins-string-tsa.cc", "src/builtins/builtins-typed-array-gen.cc", "src/builtins/builtins-typed-array-gen.h", @@ -3140,6 +3193,9 @@ v8_source_set("v8_initializers") { } else if (v8_current_cpu == "arm64") { sources += [ "src/wasm/interpreter/arm64/interpreter-builtins-arm64.cc" ] + } else if (v8_current_cpu == "riscv64") { + sources += + [ "src/wasm/interpreter/riscv/interpreter-builtins-riscv.cc" ] } } } @@ -3555,7 +3611,7 @@ v8_header_set("v8_internal_headers") { "src/compiler/backend/register-allocator.h", "src/compiler/backend/spill-placer.h", "src/compiler/backend/unwinding-info-writer.h", - "src/compiler/basic-block-instrumentor.h", + "src/compiler/basic-block-call-graph-profiler.h", "src/compiler/branch-elimination.h", "src/compiler/bytecode-analysis.h", "src/compiler/bytecode-graph-builder.h", @@ -3699,6 +3755,7 @@ v8_header_set("v8_internal_headers") { "src/compiler/turboshaft/late-load-elimination-reducer.h", "src/compiler/turboshaft/layered-hash-map.h", "src/compiler/turboshaft/load-store-simplification-reducer.h", + "src/compiler/turboshaft/load-store-verification-reducer.h", "src/compiler/turboshaft/loop-finder.h", "src/compiler/turboshaft/loop-peeling-phase.h", "src/compiler/turboshaft/loop-peeling-reducer.h", @@ -3804,6 +3861,7 @@ v8_header_set("v8_internal_headers") { "src/execution/frames.h", "src/execution/futex-emulation.h", "src/execution/interrupts-scope.h", + "src/execution/isolate-data-fields.h", "src/execution/isolate-data.h", "src/execution/isolate-inl.h", "src/execution/isolate-utils-inl.h", @@ -3849,6 +3907,8 @@ v8_header_set("v8_internal_headers") { "src/heap/allocation-result.h", "src/heap/allocation-stats.h", "src/heap/array-buffer-sweeper.h", + "src/heap/base-page-inl.h", + "src/heap/base-page.h", "src/heap/base-space.h", "src/heap/code-range.h", "src/heap/code-stats.h", @@ -3899,8 +3959,8 @@ v8_header_set("v8_internal_headers") { "src/heap/incremental-marking-job.h", "src/heap/incremental-marking.h", "src/heap/index-generator.h", - "src/heap/large-page-metadata-inl.h", - "src/heap/large-page-metadata.h", + "src/heap/large-page-inl.h", + "src/heap/large-page.h", "src/heap/large-spaces.h", "src/heap/linear-allocation-area.h", "src/heap/list.h", @@ -3931,8 +3991,6 @@ v8_header_set("v8_internal_headers") { "src/heap/memory-chunk-constants.h", "src/heap/memory-chunk-inl.h", "src/heap/memory-chunk-layout.h", - "src/heap/memory-chunk-metadata-inl.h", - "src/heap/memory-chunk-metadata.h", "src/heap/memory-chunk.h", "src/heap/memory-measurement-inl.h", "src/heap/memory-measurement.h", @@ -3941,14 +3999,15 @@ v8_header_set("v8_internal_headers") { "src/heap/minor-gc-job.h", "src/heap/minor-mark-sweep-inl.h", "src/heap/minor-mark-sweep.h", - "src/heap/mutable-page-metadata-inl.h", - "src/heap/mutable-page-metadata.h", + "src/heap/mutable-page-inl.h", + "src/heap/mutable-page.h", "src/heap/new-spaces-inl.h", "src/heap/new-spaces.h", + "src/heap/normal-page-inl.h", + "src/heap/normal-page.h", "src/heap/object-lock-inl.h", "src/heap/object-lock.h", "src/heap/object-stats.h", - "src/heap/page-metadata.h", "src/heap/paged-spaces-inl.h", "src/heap/paged-spaces.h", "src/heap/parallel-work-item.h", @@ -4250,6 +4309,8 @@ v8_header_set("v8_internal_headers") { "src/objects/transitions.h", "src/objects/trusted-object-inl.h", "src/objects/trusted-object.h", + "src/objects/trusted-pointer-inl.h", + "src/objects/trusted-pointer.h", "src/objects/turbofan-types-inl.h", "src/objects/turbofan-types.h", "src/objects/turboshaft-types-inl.h", @@ -4338,6 +4399,7 @@ v8_header_set("v8_internal_headers") { "src/runtime/runtime.h", "src/sandbox/bounded-size-inl.h", "src/sandbox/bounded-size.h", + "src/sandbox/bytecode-verifier.h", "src/sandbox/check.h", "src/sandbox/code-entrypoint-tag.h", "src/sandbox/code-pointer-inl.h", @@ -4357,6 +4419,7 @@ v8_header_set("v8_internal_headers") { "src/sandbox/external-pointer-table-inl.h", "src/sandbox/external-pointer-table.h", "src/sandbox/external-pointer.h", + "src/sandbox/external-strings-cage.h", "src/sandbox/hardware-support.h", "src/sandbox/indirect-pointer-inl.h", "src/sandbox/indirect-pointer-tag.h", @@ -4401,6 +4464,7 @@ v8_header_set("v8_internal_headers") { "src/snapshot/startup-serializer.h", "src/strings/char-predicates-inl.h", "src/strings/char-predicates.h", + "src/strings/owning-external-string-resource.h", "src/strings/string-builder-inl.h", "src/strings/string-builder.h", "src/strings/string-case.h", @@ -4476,6 +4540,7 @@ v8_header_set("v8_internal_headers") { "src/tracing/code-data-source.h", "src/tracing/code-trace-context.h", "src/tracing/perfetto-logger.h", + "src/tracing/perfetto-sdk.h", "src/tracing/perfetto-utils.h", ] } @@ -4519,6 +4584,9 @@ v8_header_set("v8_internal_headers") { "src/maglev/maglev-pipeline-statistics.h", "src/maglev/maglev-post-hoc-optimizations-processors.h", "src/maglev/maglev-pre-regalloc-codegen-processors.h", + "src/maglev/maglev-range-analysis.h", + "src/maglev/maglev-range-verification.h", + "src/maglev/maglev-range.h", "src/maglev/maglev-reducer-inl.h", "src/maglev/maglev-reducer.h", "src/maglev/maglev-regalloc-data.h", @@ -4539,6 +4607,8 @@ v8_header_set("v8_internal_headers") { sources += [ "src/maglev/s390/maglev-assembler-s390-inl.h" ] } else if (v8_current_cpu == "ppc64") { sources += [ "src/maglev/ppc/maglev-assembler-ppc-inl.h" ] + } else if (v8_current_cpu == "loong64") { + sources += [ "src/maglev/loong64/maglev-assembler-loong64-inl.h" ] } } @@ -4595,10 +4665,10 @@ v8_header_set("v8_internal_headers") { "src/wasm/code-space-access.h", "src/wasm/compilation-environment-inl.h", "src/wasm/compilation-environment.h", + "src/wasm/compilation-hints-generation.h", "src/wasm/constant-expression-interface.h", "src/wasm/constant-expression.h", "src/wasm/decoder.h", - "src/wasm/float16.h", "src/wasm/function-body-decoder-impl.h", "src/wasm/function-body-decoder.h", "src/wasm/function-compiler.h", @@ -4653,10 +4723,13 @@ v8_header_set("v8_internal_headers") { "src/wasm/wasm-opcodes.h", "src/wasm/wasm-result.h", "src/wasm/wasm-serialization.h", + "src/wasm/wasm-stack-wrapper-cache.h", "src/wasm/wasm-subtyping.h", "src/wasm/wasm-tier.h", "src/wasm/wasm-tracing.h", "src/wasm/wasm-value.h", + "src/wasm/wasm-wrapper-cache-inl.h", + "src/wasm/wasm-wrapper-cache.h", "src/wasm/well-known-imports.h", "src/wasm/wrappers-inl.h", "src/wasm/wrappers.h", @@ -5028,6 +5101,11 @@ v8_header_set("v8_internal_headers") { "src/baseline/riscv/baseline-compiler-riscv-inl.h", ] } + + if (riscv_use_zicfiss) { + sources += [ "src/execution/riscv/shadow-stack-riscv.h" ] + } + if (v8_enable_webassembly) { # Trap handling is enabled on riscv64 Linux and in simulators on # x64 on Linux. @@ -5138,7 +5216,7 @@ v8_compiler_sources = [ "src/compiler/backend/register-allocator-verifier.cc", "src/compiler/backend/register-allocator.cc", "src/compiler/backend/spill-placer.cc", - "src/compiler/basic-block-instrumentor.cc", + "src/compiler/basic-block-call-graph-profiler.cc", "src/compiler/branch-elimination.cc", "src/compiler/bytecode-analysis.cc", "src/compiler/bytecode-graph-builder.cc", @@ -5295,6 +5373,7 @@ if (!v8_enable_maglev) { "src/maglev/maglev-ir.cc", "src/maglev/maglev-known-node-aspects.cc", "src/maglev/maglev-phi-representation-selector.cc", + "src/maglev/maglev-range-verification.cc", "src/maglev/maglev-truncation.cc", ] } @@ -5668,6 +5747,7 @@ v8_source_set("v8_base_without_compiler") { "src/handles/traced-handles.cc", "src/heap/allocation-observer.cc", "src/heap/array-buffer-sweeper.cc", + "src/heap/base-page.cc", "src/heap/code-range.cc", "src/heap/code-stats.cc", "src/heap/collection-barrier.cc", @@ -5698,7 +5778,7 @@ v8_source_set("v8_base_without_compiler") { "src/heap/incremental-marking-job.cc", "src/heap/incremental-marking.cc", "src/heap/index-generator.cc", - "src/heap/large-page-metadata.cc", + "src/heap/large-page.cc", "src/heap/large-spaces.cc", "src/heap/local-factory.cc", "src/heap/local-heap.cc", @@ -5710,17 +5790,16 @@ v8_source_set("v8_base_without_compiler") { "src/heap/marking.cc", "src/heap/memory-allocator.cc", "src/heap/memory-balancer.cc", - "src/heap/memory-chunk-metadata.cc", "src/heap/memory-chunk.cc", "src/heap/memory-measurement.cc", "src/heap/memory-pool.cc", "src/heap/memory-reducer.cc", "src/heap/minor-gc-job.cc", "src/heap/minor-mark-sweep.cc", - "src/heap/mutable-page-metadata.cc", + "src/heap/mutable-page.cc", "src/heap/new-spaces.cc", + "src/heap/normal-page.cc", "src/heap/object-stats.cc", - "src/heap/page-metadata.cc", "src/heap/paged-spaces.cc", "src/heap/pretenuring-handler.cc", "src/heap/read-only-heap.cc", @@ -5939,9 +6018,11 @@ v8_source_set("v8_base_without_compiler") { "src/runtime/runtime-typedarray.cc", "src/runtime/runtime-weak-refs.cc", "src/runtime/runtime.cc", + "src/sandbox/bytecode-verifier.cc", "src/sandbox/code-pointer-table.cc", "src/sandbox/cppheap-pointer-table.cc", "src/sandbox/external-pointer-table.cc", + "src/sandbox/external-strings-cage.cc", "src/sandbox/hardware-support.cc", "src/sandbox/js-dispatch-table.cc", "src/sandbox/sandbox.cc", @@ -5988,7 +6069,6 @@ v8_source_set("v8_base_without_compiler") { "src/utils/detachable-vector.cc", "src/utils/hex-format.cc", "src/utils/identity-map.cc", - "src/utils/memcopy.cc", "src/utils/ostreams.cc", "src/utils/output-stream.cc", "src/utils/sha-256.cc", @@ -6039,6 +6119,7 @@ v8_source_set("v8_base_without_compiler") { "src/maglev/maglev-known-node-aspects.cc", "src/maglev/maglev-phi-representation-selector.cc", "src/maglev/maglev-pipeline-statistics.cc", + "src/maglev/maglev-range-verification.cc", "src/maglev/maglev-regalloc.cc", "src/maglev/maglev-truncation.cc", "src/maglev/maglev.cc", @@ -6073,6 +6154,11 @@ v8_source_set("v8_base_without_compiler") { "src/maglev/ppc/maglev-assembler-ppc.cc", "src/maglev/ppc/maglev-ir-ppc.cc", ] + } else if (v8_current_cpu == "loong64") { + sources += [ + "src/maglev/loong64/maglev-assembler-loong64.cc", + "src/maglev/loong64/maglev-ir-loong64.cc", + ] } } @@ -6104,6 +6190,7 @@ v8_source_set("v8_base_without_compiler") { "src/wasm/basic-block-calculator.cc", "src/wasm/canonical-types.cc", "src/wasm/code-space-access.cc", + "src/wasm/compilation-hints-generation.cc", "src/wasm/constant-expression-interface.cc", "src/wasm/constant-expression.cc", "src/wasm/function-body-decoder.cc", @@ -6138,8 +6225,10 @@ v8_source_set("v8_base_without_compiler") { "src/wasm/wasm-opcodes.cc", "src/wasm/wasm-result.cc", "src/wasm/wasm-serialization.cc", + "src/wasm/wasm-stack-wrapper-cache.cc", "src/wasm/wasm-subtyping.cc", "src/wasm/wasm-tracing.cc", + "src/wasm/wasm-wrapper-cache.cc", "src/wasm/well-known-imports.cc", ] if (v8_wasm_random_fuzzers) { @@ -6400,6 +6489,9 @@ v8_source_set("v8_base_without_compiler") { if (current_cpu == "x64" && is_linux) { sources += [ "src/trap-handler/handler-outside-simulator.cc" ] } + if (riscv_use_zicfiss) { + sources += [ "src/execution/riscv/shadow-stack-riscv.cc" ] + } } } else if (v8_current_cpu == "riscv32") { sources += [ @@ -6493,6 +6585,15 @@ v8_source_set("v8_base_without_compiler") { ] } + if (v8_dumpling) { + sources += [ + "src/dumpling/dumpling-manager.cc", + "src/dumpling/dumpling-manager.h", + "src/dumpling/object-dumping.cc", + "src/dumpling/object-dumping.h", + ] + } + if (v8_enable_i18n_support) { deps += [ ":run_gen-regexp-special-case" ] sources += [ "$target_gen_dir/src/regexp/special-case.cc" ] @@ -6694,6 +6795,7 @@ v8_component("v8_libbase") { "src/base/abort-mode.cc", "src/base/abort-mode.h", "src/base/address-region.h", + "src/base/algorithm.h", "src/base/atomic-utils.h", "src/base/atomicops.h", "src/base/base-export.h", @@ -6723,6 +6825,7 @@ v8_component("v8_libbase") { "src/base/file-utils.cc", "src/base/file-utils.h", "src/base/flags.h", + "src/base/float16.h", "src/base/fpu.cc", "src/base/fpu.h", "src/base/free_deleter.h", @@ -6740,6 +6843,7 @@ v8_component("v8_libbase") { "src/base/logging.cc", "src/base/logging.h", "src/base/macros.h", + "src/base/memcopy.h", "src/base/memory.h", "src/base/numbers/bignum-dtoa.cc", "src/base/numbers/bignum-dtoa.h", @@ -7431,6 +7535,7 @@ v8_source_set("cppgc_base") { if (v8_use_perfetto) { sources += [ + "src/tracing/perfetto-sdk.h", "src/tracing/trace-categories.cc", "src/tracing/trace-categories.h", ] diff --git a/deps/v8/COMMON_OWNERS b/deps/v8/COMMON_OWNERS index 1a14c2458d6d0d..87e36677744ae4 100644 --- a/deps/v8/COMMON_OWNERS +++ b/deps/v8/COMMON_OWNERS @@ -8,6 +8,7 @@ dinfuehr@chromium.org dlehmann@chromium.org dmercadier@chromium.org ecmziegler@chromium.org +emaxx@google.com evih@chromium.org fgm@chromium.org gdeepti@chromium.org diff --git a/deps/v8/DEPS b/deps/v8/DEPS index 86740bd8ebbf1d..f51413a07f8453 100644 --- a/deps/v8/DEPS +++ b/deps/v8/DEPS @@ -6,6 +6,7 @@ use_relative_paths = True gclient_gn_args_file = 'build/config/gclient_args.gni' gclient_gn_args = [ + 'checkout_src_internal', ] vars = { @@ -58,6 +59,9 @@ vars = { # Used for downloading the Fuchsia SDK without running hooks. 'checkout_fuchsia_no_hooks': False, + # V8 doesn't need src_internal, but some shared GN files use this variable. + 'checkout_src_internal': False, + # reclient CIPD package version 'reclient_version': 're_client_version:0.185.0.db415f21-gomaip', @@ -75,24 +79,24 @@ vars = { 'build_with_chromium': False, # GN CIPD package version. - 'gn_version': 'git_revision:07d3c6f4dc290fae5ca6152ebcb37d6815c411ab', + 'gn_version': 'git_revision:5550ba0f4053c3cbb0bff3d60ded9d867b6fa371', # ninja CIPD package version # https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja 'ninja_version': 'version:3@1.12.1.chromium.4', # siso CIPD package version - 'siso_version': 'git_revision:0915813c4c786240e12d03aa3018c02bab4df14f', + 'siso_version': 'git_revision:1624786919608fb2140226f6468cd8d0b52fe3b5', # 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:29.20251023.3.1', + 'fuchsia_version': 'version:30.20251218.4.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling partition_alloc_version # and whatever else without interference from each other. - 'partition_alloc_version': 'db8446987dfff3cfc0c100b7d58e6a404ef639eb', + 'partition_alloc_version': 'b2155fca494c5b6266d42f9129ae3a7b85482c95', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_build-tools_version @@ -130,9 +134,9 @@ vars = { deps = { 'build': - Var('chromium_url') + '/chromium/src/build.git' + '@' + '81330a6e45719ab8c0d22e5548afbedb5482b068', + Var('chromium_url') + '/chromium/src/build.git' + '@' + 'd747365c051153cc89f25e6adc95538aabcdd319', 'buildtools': - Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '723d636763a2635105e0e912bae25f662b2acaa8', + Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '4dc32b3f510b330137385e2b3a631ca8e13a8e22', 'buildtools/linux64': { 'packages': [ { @@ -178,7 +182,7 @@ deps = { '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' + '@' + 'd2940bdbb0e28fd002ec31b89f8182bbf63da092', + Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '9079aeefcefcd55b0e994fb8bda51e06827337bd', 'third_party/android_platform': { 'url': Var('chromium_url') + '/chromium/src/third_party/android_platform.git' + '@' + 'e3919359f2387399042d31401817db4a02d756ec', 'condition': 'checkout_android', @@ -232,7 +236,7 @@ deps = { 'dep_type': 'cipd', }, 'third_party/catapult': { - 'url': Var('chromium_url') + '/catapult.git' + '@' + '4daf7b2cead7fb17ec3da4eedb30215e3bd3674a', + 'url': Var('chromium_url') + '/catapult.git' + '@' + 'c9916a593bec75bdaa231475af0e8740f857bf10', 'condition': 'checkout_android', }, 'third_party/clang-format/script': @@ -246,19 +250,19 @@ deps = { 'condition': 'checkout_android', }, 'third_party/depot_tools': - Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '8a1ec6a0213ae033f6749f261e1c528488349991', + Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + 'fb0b652edba70f5c4ac867f3beca9e535f905b4c', 'third_party/dragonbox/src': - Var('chromium_url') + '/external/github.com/jk-jeon/dragonbox.git' + '@' + '6c7c925b571d54486b9ffae8d9d18a822801cbda', + Var('chromium_url') + '/external/github.com/jk-jeon/dragonbox.git' + '@' + 'beeeef91cf6fef89a4d4ba5e95d47ca64ccb3a44', 'third_party/fp16/src': Var('chromium_url') + '/external/github.com/Maratyszcza/FP16.git' + '@' + '3d2de1816307bac63c16a297e8c4dc501b4076df', 'third_party/fast_float/src': Var('chromium_url') + '/external/github.com/fastfloat/fast_float.git' + '@' + 'cb1d42aaa1e14b09e1452cfdef373d051b8c02a4', 'third_party/fuchsia-gn-sdk': { - 'url': Var('chromium_url') + '/chromium/src/third_party/fuchsia-gn-sdk.git' + '@' + '99294ee55f28f8ae5a3552f4c435528e4c1686b6', + 'url': Var('chromium_url') + '/chromium/src/third_party/fuchsia-gn-sdk.git' + '@' + '947109b3f1f40fb060e7c91df049ee53fe89d573', 'condition': 'checkout_fuchsia', }, 'third_party/simdutf': - Var('chromium_url') + '/chromium/src/third_party/simdutf' + '@' + 'acd71a451c1bcb808b7c3a77e0242052909e381e', + Var('chromium_url') + '/chromium/src/third_party/simdutf' + '@' + '75bea7342fdac6b57f7e3099ddf4dc84d77384f6', # Exists for rolling the Fuchsia SDK. Check out of the SDK should always # rely on the hook running |update_sdk.py| script below. 'third_party/fuchsia-sdk/sdk': { @@ -272,21 +276,21 @@ deps = { 'dep_type': 'cipd', }, 'third_party/google_benchmark_chrome': { - 'url': Var('chromium_url') + '/chromium/src/third_party/google_benchmark.git' + '@' + 'fa1929c5500ccfc01852ba50ff9258303e93601e', + 'url': Var('chromium_url') + '/chromium/src/third_party/google_benchmark.git' + '@' + 'abeba5d5e6db5bdf85261045e148f1db3fdc40ad', }, 'third_party/google_benchmark_chrome/src': { - 'url': Var('chromium_url') + '/external/github.com/google/benchmark.git' + '@' + '761305ec3b33abf30e08d50eb829e19a802581cc', + 'url': Var('chromium_url') + '/external/github.com/google/benchmark.git' + '@' + '188e8278990a9069ffc84441cb5a024fd0bede37', }, 'third_party/fuzztest': - Var('chromium_url') + '/chromium/src/third_party/fuzztest.git' + '@' + 'aa6ba9074b8d66a2e2853a0a0992c25966022e13', + Var('chromium_url') + '/chromium/src/third_party/fuzztest.git' + '@' + '91bba347d770411d32719d2b779746bacd49ad27', 'third_party/fuzztest/src': - Var('chromium_url') + '/external/github.com/google/fuzztest.git' + '@' + '7940ee9a7ebce6419c6391eef8b289524b16f198', + Var('chromium_url') + '/external/github.com/google/fuzztest.git' + '@' + 'a72f099a943c257afe8d4d87c10a22b23e17786d', 'third_party/googletest/src': - Var('chromium_url') + '/external/github.com/google/googletest.git' + '@' + 'b2b9072ecbe874f5937054653ef8f2731eb0f010', + Var('chromium_url') + '/external/github.com/google/googletest.git' + '@' + '4fe3307fb2d9f86d19777c7eb0e4809e9694dde7', 'third_party/highway/src': Var('chromium_url') + '/external/github.com/google/highway.git' + '@' + '84379d1c73de9681b54fbe1c035a23c7bd5d272d', 'third_party/icu': - Var('chromium_url') + '/chromium/deps/icu.git' + '@' + 'f27805b7d7d8618fa73ce89e9d28e0a8b2216fec', + Var('chromium_url') + '/chromium/deps/icu.git' + '@' + 'a86a32e67b8d1384b33f8fa48c83a6079b86f8cd', 'third_party/instrumented_libs': { 'url': Var('chromium_url') + '/chromium/third_party/instrumented_libraries.git' + '@' + '69015643b3f68dbd438c010439c59adc52cac808', 'condition': 'checkout_instrumented_libraries', @@ -302,179 +306,179 @@ deps = { 'third_party/jsoncpp/source': Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '42e892d96e47b1f6e29844cc705e148ec4856448', 'third_party/libc++/src': - Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + 'cdb24138c1591d12b07d5147825ec7dfeb495276', + Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + '7ab65651aed6802d2599dcb7a73b1f82d5179d05', 'third_party/libc++abi/src': - Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + 'a02fa0058d8d52aca049868d229808a3e5dadbad', + Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + '8f11bb1d4438d0239d0dfc1bd9456a9f31629dda', 'third_party/libpfm4': Var('chromium_url') + '/chromium/src/third_party/libpfm4.git' + '@' + '25c29f04c9127e1ca09e6c1181f74850aa7f118b', 'third_party/libpfm4/src': Var('chromium_url') + '/external/git.code.sf.net/p/perfmon2/libpfm4.git' + '@' + '964baf9d35d5f88d8422f96d8a82c672042e7064', 'third_party/libunwind/src': - Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + '61ba011ba3c4ed238af93ebad476d3ab5a2fb5ab', + Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + 'a726f5347e1e423d59f5c2d434b6a29265c43051', 'third_party/llvm-libc/src': - Var('chromium_url') + '/external/github.com/llvm/llvm-project/libc.git' + '@' + 'db35841a6fcbeee98e4d7fe6ba3df1a876a18a62', + Var('chromium_url') + '/external/github.com/llvm/llvm-project/libc.git' + '@' + '259b6a7101beea301d6dfb96445f03f7d2e13754', 'third_party/llvm-build/Release+Asserts': { 'dep_type': 'gcs', 'bucket': 'chromium-browser-clang', 'objects': [ { - 'object_name': 'Linux_x64/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'f6a487ffd0e56ba7a39b063d85d1f8ff7846514f50635785730cffb7368872ce', - 'size_bytes': 55669844, - 'generation': 1759771493989631, + 'object_name': 'Linux_x64/clang-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': 'a2d632dfbd997b1c545c4ab858c664e33b55bf6423b58793ed9eb42c8d2a8249', + 'size_bytes': 57165612, + 'generation': 1765411203931092, 'condition': 'host_os == "linux"', }, { - 'object_name': 'Linux_x64/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '4fc7aacf4c25e50a25a941f1186a9e042ae26a2c5c698f359907798fa68106c8', - 'size_bytes': 14053336, - 'generation': 1759771494041411, + 'object_name': 'Linux_x64/clang-tidy-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': 'eccc0770ce912c2da813856b5f83b729e26a71cea99c63dc5ae63e92fc3cfd53', + 'size_bytes': 14313444, + 'generation': 1765411203943205, 'condition': 'host_os == "linux" and checkout_clang_tidy', }, { - 'object_name': 'Linux_x64/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '238897cb0b55ffcb7f6b8f6a10055e44e05023642441a800895704ced91d37d1', - 'size_bytes': 14197108, - 'generation': 1759771494144266, + 'object_name': 'Linux_x64/clangd-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': 'd5d2c507783f551eb8ce24f19610233df1af799a2c4ae7ff64a843d9d27104d4', + 'size_bytes': 14517932, + 'generation': 1765411203940105, 'condition': 'host_os == "linux" and checkout_clangd', }, { - 'object_name': 'Linux_x64/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '2c5b0bf210ca982d8ec37cacf3d06d9c45bd6e68b33dcaabce0d108d6c266a36', - 'size_bytes': 2272128, - 'generation': 1759771494296549, + 'object_name': 'Linux_x64/llvm-code-coverage-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': 'a29fc6b6e582df4ce0a2178bbc8225e01b6446d3788b89932765558523e4de4a', + 'size_bytes': 2307836, + 'generation': 1765411203990197, 'condition': 'host_os == "linux" and checkout_clang_coverage_tools', }, { - 'object_name': 'Linux_x64/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'fd644634db56977b072d951f26571ac41c9c298bf5989e99efeb150ee8427364', - 'size_bytes': 5666140, - 'generation': 1759771494159187, + 'object_name': 'Linux_x64/llvmobjdump-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '8b6b59b573731321a0320917d011b8f373d14d9556db63bad1a8a2449e275f05', + 'size_bytes': 5771312, + 'generation': 1765411203963068, 'condition': '(checkout_linux or checkout_mac or checkout_android) and host_os == "linux"', }, { - 'object_name': 'Mac/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '44811b6ed6868142c088807f6bcc0d08811a7b11d3f2bc2124c45868037e8cc3', - 'size_bytes': 53583464, - 'generation': 1759771495565305, + 'object_name': 'Mac/clang-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '3443ffd7392237fe82cf2eb62f56315e090dc6030a1cadc98dd4e938a28d2b2a', + 'size_bytes': 54346192, + 'generation': 1765411205883988, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac/clang-mac-runtime-library-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '8a2e16410bede5d52c77a012f182dde2350b05e647f7c1acaf7823ce816b4422', - 'size_bytes': 1005144, - 'generation': 1759771503758969, + 'object_name': 'Mac/clang-mac-runtime-library-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '350d349928e9075d9409c1d59c2fcba70e0b47a7cca8eef100a835e509bf4093', + 'size_bytes': 1009740, + 'generation': 1765411213098351, 'condition': 'checkout_mac and not host_os == "mac"', }, { - 'object_name': 'Mac/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '66633fe8846fddeda86b5ee992b945939bfe46567c9c685900c39531d22ce5cf', - 'size_bytes': 14133312, - 'generation': 1759771495642847, + 'object_name': 'Mac/clang-tidy-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '953077b4b49d9a92981c1d8a8e44a5564d551931e81a089a6741d7db5c8be72f', + 'size_bytes': 14338004, + 'generation': 1765411205893281, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clang_tidy', }, { - 'object_name': 'Mac/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '44088b951aa7ddc96c0f32703b076311a7e7b803b3adfe0bfe9725f78c4fab29', - 'size_bytes': 15627392, - 'generation': 1759771495653658, + 'object_name': 'Mac/clangd-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '16fbcb0ff1e7eed822d007af549a2820c69ff32aa5a951518cecc8ea161b300f', + 'size_bytes': 16279576, + 'generation': 1765411205896181, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clangd', }, { - 'object_name': 'Mac/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '79d62c78d256a508a0f3dbe59aa0fdf0391a9d462bf74e56adc1dee82efa83ac', - 'size_bytes': 2321940, - 'generation': 1759771495825689, + 'object_name': 'Mac/llvm-code-coverage-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '9ff2acd949d45fea14553baf8e035e8d2cd731ad7b747b1d3f1d726d77102373', + 'size_bytes': 2330756, + 'generation': 1765411205937658, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clang_coverage_tools', }, { - 'object_name': 'Mac/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'a10d075e19e7b614ffd8c5a65f04fbd45011ec74c735dda89f0b3780ab397329', - 'size_bytes': 5567160, - 'generation': 1759771495741126, + 'object_name': 'Mac/llvmobjdump-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': 'cf0d536e8ee4b92426819b64ba2e9b080796f97beb85a68ebe01894783c82955', + 'size_bytes': 5621768, + 'generation': 1765411205900222, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac_arm64/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'c97e4f62cdd77edf725ccbf4cd63b589302605bf643c871f83214f39e629b2ea', - 'size_bytes': 44593804, - 'generation': 1759771504972271, + 'object_name': 'Mac_arm64/clang-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '82d056f890fd3f86f711d2153e365e240673c98f94feb09758ecca7b487431fc', + 'size_bytes': 45447500, + 'generation': 1765411214931139, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Mac_arm64/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '3a0eb0fb3a4633c8b4b143e826c5476c41cdd6bd0db8e93a74bbee6520b02b79', - 'size_bytes': 12136348, - 'generation': 1759771505073378, + 'object_name': 'Mac_arm64/clang-tidy-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '04c7feb0058499149468edef9ce7b6155831ef22b756ae9aa39e5a9504937701', + 'size_bytes': 12329844, + 'generation': 1765411214943784, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clang_tidy', }, { - 'object_name': 'Mac_arm64/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '2a5dc1f385bacd25b974b8aa15c57008e33bc384521e2d705a940acbb3292356', - 'size_bytes': 12479180, - 'generation': 1759771505148040, + 'object_name': 'Mac_arm64/clangd-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '8e41df7efa35f732f46561bbbe1967743f8270276c0adb3dfa77ccd65b377ee1', + 'size_bytes': 12730784, + 'generation': 1765411214956057, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clangd', }, { - 'object_name': 'Mac_arm64/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '00bf0f82ca9aff15f32e7f0cf7e7b25d36a5a672a1a9bc345c1b7e140a478f93', - 'size_bytes': 1948520, - 'generation': 1759771505303586, + 'object_name': 'Mac_arm64/llvm-code-coverage-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '64aad877a3a74b9ae3a000bea9f3025011c0f246e58c64eb7a3ff93db4fccf11', + 'size_bytes': 1968060, + 'generation': 1765411215019503, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clang_coverage_tools', }, { - 'object_name': 'Mac_arm64/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '7aa959752d6beafc74129e4822912021f855584e55a55600044f1d42b889f8b0', - 'size_bytes': 5292960, - 'generation': 1759771505201957, + 'object_name': 'Mac_arm64/llvmobjdump-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '07ae49a9d0bca1909f870cf2bc8af2eeb8da57ce2153385c5fdf5a009c946d6e', + 'size_bytes': 5373248, + 'generation': 1765411214948454, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Win/clang-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'fc756186dea61e700bd0f885b585050d9356bbd7f942dafae25d38eef4671adf', - 'size_bytes': 47657436, - 'generation': 1759771514781908, + 'object_name': 'Win/clang-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '7c584196707e592fb4e4bd14cf2bb1399be250e666030aa15ba3482ca5a1adab', + 'size_bytes': 48674988, + 'generation': 1765411224454962, 'condition': 'host_os == "win"', }, { - 'object_name': 'Win/clang-tidy-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'f7ecd7e8d555e8622e0096ea1aca3ddb3fb4e89e91228c3c87289a4b8ca7919c', - 'size_bytes': 14016476, - 'generation': 1759771514824669, + 'object_name': 'Win/clang-tidy-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': 'e848dddd208e626afac825d740b76fd9e91af627dc8fb6293bd3297e06cadc0f', + 'size_bytes': 14269616, + 'generation': 1765411224494029, 'condition': 'host_os == "win" and checkout_clang_tidy', }, { - 'object_name': 'Win/clang-win-runtime-library-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '0a426702c9e0f92ea27f9611a1665cc5df9a58820360d3fa6a4026b9a0e5120f', - 'size_bytes': 2501292, - 'generation': 1759771523074183, + 'object_name': 'Win/clang-win-runtime-library-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '073eaf43b1897500a1a826851b8cce43ac04cf395f1e05eb14f273102221b165', + 'size_bytes': 2526948, + 'generation': 1765411231670451, 'condition': 'checkout_win and not host_os == "win"', }, { - 'object_name': 'Win/clangd-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'b172d0246511cdeffbc5a4fa44ad402a6b9eacd9d3e2e77d88a9965f80d344d5', - 'size_bytes': 14364312, - 'generation': 1759771514873065, + 'object_name': 'Win/clangd-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '6c944d6d1f3627b30661a977ebaf28dfdb28a80cab3a2b4c0297447e60360f58', + 'size_bytes': 14680960, + 'generation': 1765411224477368, 'condition': 'host_os == "win" and checkout_clangd', }, { - 'object_name': 'Win/llvm-code-coverage-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': 'b70528795afd95729971b74939e512c638a8a93fd1ee1c9205a6240f7af28802', - 'size_bytes': 2368144, - 'generation': 1759771515105244, + 'object_name': 'Win/llvm-code-coverage-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '4552393e501da36109e4d7ea6c5a8582c361c6812d00a641d5f19c6f3db804f3', + 'size_bytes': 2398400, + 'generation': 1765411224579579, 'condition': 'host_os == "win" and checkout_clang_coverage_tools', }, { - 'object_name': 'Win/llvmobjdump-llvmorg-22-init-8940-g4d4cb757-84.tar.xz', - 'sha256sum': '94c068f109e220e028a38f5beced7d6acd67725fc0b1da9fa8ed1b959f12d799', - 'size_bytes': 5673824, - 'generation': 1759771514962844, + 'object_name': 'Win/llvmobjdump-llvmorg-22-init-17020-gbd1bd178-2.tar.xz', + 'sha256sum': '0fee07e9de315cfeea0802a6a411e1111217fd57b44645394509e9a4ecfe361f', + 'size_bytes': 5749012, + 'generation': 1765411224494520, 'condition': '(checkout_linux or checkout_mac or checkout_android) and host_os == "win"', }, ], }, 'third_party/logdog/logdog': - Var('chromium_url') + '/infra/luci/luci-py/client/libs/logdog' + '@' + '0b2078a90f7a638d576b3a7c407d136f2fb62399', + Var('chromium_url') + '/infra/luci/luci-py/client/libs/logdog' + '@' + '62fe96d7fd97a62f21a4665d2e71f69e9eedb04e', 'third_party/markupsafe': Var('chromium_url') + '/chromium/src/third_party/markupsafe.git' + '@' + '4256084ae14175d38a3ff7d739dca83ae49ccec6', 'third_party/ninja': { @@ -492,56 +496,56 @@ deps = { 'condition': 'not build_with_chromium', }, 'third_party/perfetto': - Var('android_url') + '/platform/external/perfetto.git' + '@' + '40b529923598b739b2892a536a7692eedbed5685', + Var('chromium_url') + '/external/github.com/google/perfetto.git' + '@' + '698c3b289159cf14ac110e21d5ed424c8a9f35b4', 'third_party/protobuf': - Var('chromium_url') + '/chromium/src/third_party/protobuf.git' + '@' + 'fcb7931541e4fe633b796db3f3e6f54c2dd297a8', + Var('chromium_url') + '/chromium/src/third_party/protobuf.git' + '@' + '110575cc0100e5b912b45f7a81d880ebef5e15c5', 'third_party/re2/src': - Var('chromium_url') + '/external/github.com/google/re2.git' + '@' + '61c4644171ee6b480540bf9e569cba06d9090b4b', + Var('chromium_url') + '/external/github.com/google/re2.git' + '@' + 'e7aec5985072c1dbe735add802653ef4b36c231a', 'third_party/requests': { 'url': Var('chromium_url') + '/external/github.com/kennethreitz/requests.git' + '@' + 'c7e0fc087ceeadb8b4c84a0953a422c474093d6d', 'condition': 'checkout_android', }, 'tools/rust': - Var('chromium_url') + '/chromium/src/tools/rust' + '@' + '12557fcc00d7e94caa5e270d7343b566e48a68ae', + Var('chromium_url') + '/chromium/src/tools/rust' + '@' + 'd1690596df82f4968e4a157034691f18dc8a9d35', 'tools/win': Var('chromium_url') + '/chromium/src/tools/win' + '@' + '24494b071e019a2baea4355d9870ffc5fc0bbafe', 'third_party/rust': - Var('chromium_url') + '/chromium/src/third_party/rust' + '@' + '4d93511ebaceb09ebdd83c8876a4a936b75fa04d', + Var('chromium_url') + '/chromium/src/third_party/rust' + '@' + 'c39a70c914bbac46c52bddb7ee136e04fdf1e687', 'third_party/rust-toolchain': { 'dep_type': 'gcs', 'bucket': 'chromium-browser-clang', 'objects': [ { - 'object_name': 'Linux_x64/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', - 'sha256sum': '2bdaea0b11cb11a8f2f4dcb79b0dbb4bf38e2bd22479ff8014f55b9b6890e135', - 'size_bytes': 142044388, - 'generation': 1758743116775859, + 'object_name': 'Linux_x64/rust-toolchain-a4cfac7093a1c1c7fbdb6bc75d6b6dc4d385fc69-2-llvmorg-22-init-17020-gbd1bd178.tar.xz', + 'sha256sum': '5ca1ca6268ce2dcfe878c623f0f49e4eba983bb36e79ceddb9c745ef48efc933', + 'size_bytes': 140484296, + 'generation': 1765411196238822, 'condition': 'host_os == "linux"', }, { - 'object_name': 'Mac/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', - 'sha256sum': '351347e1930a900c63b3953cdb10775b73572c6145e389f3820ba920816d46ca', - 'size_bytes': 135891820, - 'generation': 1758743118329536, + 'object_name': 'Mac/rust-toolchain-a4cfac7093a1c1c7fbdb6bc75d6b6dc4d385fc69-2-llvmorg-22-init-17020-gbd1bd178.tar.xz', + 'sha256sum': '26f095b3217e9619d6172bdc4b7329e51ebe2fb7508a313b8c3a6fce21416170', + 'size_bytes': 135435424, + 'generation': 1765411198122573, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac_arm64/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', - 'sha256sum': '33d6b8cf4fc6617aa98888a46bc1dbef29ae9a9ebd01c3f248ef8c08ec5f198b', - 'size_bytes': 123302332, - 'generation': 1758743119839246, + 'object_name': 'Mac_arm64/rust-toolchain-a4cfac7093a1c1c7fbdb6bc75d6b6dc4d385fc69-2-llvmorg-22-init-17020-gbd1bd178.tar.xz', + 'sha256sum': '64d5fb112d809b1c4a047ef7bd99e88534de470b82d86ce6ad729b12c5611488', + 'size_bytes': 122796960, + 'generation': 1765411200047613, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Win/rust-toolchain-15283f6fe95e5b604273d13a428bab5fc0788f5a-1-llvmorg-22-init-8940-g4d4cb757.tar.xz', - 'sha256sum': '4f6dfa230e5d401bf9aadd804142b412467177b17d50a3f52a8c69c1957aa2db', - 'size_bytes': 199998880, - 'generation': 1758743121322555, + 'object_name': 'Win/rust-toolchain-a4cfac7093a1c1c7fbdb6bc75d6b6dc4d385fc69-2-llvmorg-22-init-17020-gbd1bd178.tar.xz', + 'sha256sum': 'a3cf74c96f7959a8507786665c23a2fb8ac67f107279ef888a8d3da066c0bca5', + 'size_bytes': 198058716, + 'generation': 1765411201950690, 'condition': 'host_os == "win"', }, ], }, - 'third_party/siso': { + 'third_party/siso/cipd': { 'packages': [ { 'package': 'build/siso/${{platform}}', @@ -552,13 +556,13 @@ deps = { 'condition': 'not build_with_chromium and host_cpu != "s390x" and host_os != "zos" and host_cpu != "ppc64"', }, 'third_party/zlib': - Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '85f05b0835f934e52772efc308baa80cdd491838', + Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '2182f37a0861358faa9f6b8e0dacce32142c3a33', 'tools/clang': - Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '97f0845783b3d8ebca7541afb46ec53c3f4bd3ac', + Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '3240f2283a294839cf928f7329fe1a89230fa74e', 'tools/protoc_wrapper': Var('chromium_url') + '/chromium/src/tools/protoc_wrapper.git' + '@' + '3438d4183bfc7c0d6850e8b970204cc8189f0323', 'third_party/abseil-cpp': { - 'url': Var('chromium_url') + '/chromium/src/third_party/abseil-cpp.git' + '@' + '3fb321d9764442ceaf2e17b6e68ab6b6836bc78a', + 'url': Var('chromium_url') + '/chromium/src/third_party/abseil-cpp.git' + '@' + '1597226b825a16493de66c1732171efe89b271d9', 'condition': 'not build_with_chromium', }, 'third_party/zoslib': { @@ -590,6 +594,7 @@ include_rules = [ '+absl/container/flat_hash_set.h', '+absl/container/btree_map.h', '+absl/functional/overload.h', + '+absl/numeric/int128.h', '+absl/status', '+absl/strings/str_format.h', '+absl/synchronization/mutex.h', diff --git a/deps/v8/MODULE.bazel b/deps/v8/MODULE.bazel index 3370e06bc077b9..e70af14ad617b7 100644 --- a/deps/v8/MODULE.bazel +++ b/deps/v8/MODULE.bazel @@ -3,10 +3,10 @@ module( version = "0.0.0", ) -bazel_dep(name = "bazel_skylib", version = "1.7.1") -bazel_dep(name = "rules_cc", version = "0.1.2") +bazel_dep(name = "bazel_skylib", version = "1.8.1") +bazel_dep(name = "rules_cc", version = "0.2.0") bazel_dep(name = "rules_python", version = "1.0.0") -bazel_dep(name = "platforms", version = "0.0.11") +bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "abseil-cpp", version = "20250814.0") bazel_dep(name = "highway", version = "1.2.0") @@ -15,6 +15,9 @@ pip.parse( hub_name = "v8_python_deps", python_version = "3.11", requirements_lock = "//:bazel/requirements.txt", - extra_pip_args = ["--require-hashes"], + extra_pip_args = [ + "--require-hashes", + "--index-url=https://pypi.org/simple", + ], ) use_repo(pip, "v8_python_deps") diff --git a/deps/v8/WATCHLISTS b/deps/v8/WATCHLISTS index 0e9e78b120c9eb..8fff0bde11fde4 100644 --- a/deps/v8/WATCHLISTS +++ b/deps/v8/WATCHLISTS @@ -60,6 +60,9 @@ 'arm': { 'filepath': '/arm/', }, + 'riscv': { + 'filepath': '/riscv/', + }, 'merges': { 'filepath': '.', }, @@ -140,6 +143,9 @@ 'v8-ppc-ports@googlegroups.com', 'v8-risc-v-ports@chromium.org', ], + 'riscv': [ + 'v8-risc-v-ports@chromium.org', + ], 'merges': [ # Only enabled on branches created with tools/release/create_release.py 'v8-merges@googlegroups.com', diff --git a/deps/v8/bazel/config/BUILD.bazel b/deps/v8/bazel/config/BUILD.bazel index c81f2782031269..17e379b8e27baa 100644 --- a/deps/v8/bazel/config/BUILD.bazel +++ b/deps/v8/bazel/config/BUILD.bazel @@ -357,3 +357,28 @@ selects.config_setting_group( ":is_fastbuild", ], ) + +# To build with sanitizers in the command line, define the local +# variable SANITIZER. +# Eg: bazel build --copt=-fsanitize=address --linkopt=-fsanitize=address \ +# --define=SANITIZER=asan ... + +config_setting( + name = "asan_enabled", + values = {"define": "SANITIZER=asan"}, +) + +config_setting( + name = "hwasan_enabled", + values = {"define": "SANITIZER=hwasan"}, +) + +config_setting( + name = "msan_enabled", + values = {"define": "SANITIZER=msan"}, +) + +config_setting( + name = "ubsan_enabled", + values = {"define": "SANITIZER=ubsan"}, +) diff --git a/deps/v8/bazel/defs.bzl b/deps/v8/bazel/defs.bzl index a7e1e2af786ce4..26bb03fa5f5c16 100644 --- a/deps/v8/bazel/defs.bzl +++ b/deps/v8/bazel/defs.bzl @@ -111,6 +111,7 @@ def _default_args(): "@v8//bazel/config:is_posix": [ "-fPIC", "-fno-strict-aliasing", + "-fconstexpr-steps=2000000", "-Werror", "-Wextra", "-Wno-unneeded-internal-declaration", diff --git a/deps/v8/gni/v8.gni b/deps/v8/gni/v8.gni index d198859576a4bd..4cb3301eec1306 100644 --- a/deps/v8/gni/v8.gni +++ b/deps/v8/gni/v8.gni @@ -61,8 +61,7 @@ declare_args() { # is still not accessible unless --harmony-temporal is enabled at runtime) # # Furthermore, some architectures don't have Rust toolchains in Chromium - v8_enable_temporal_support = !(defined(build_with_node) && build_with_node) && - target_cpu != "ppc64" && target_cpu != "s390x" + v8_enable_temporal_support = !(defined(build_with_node) && build_with_node) # Use static libraries instead of source_sets. v8_static_library = false @@ -80,6 +79,12 @@ declare_args() { # Implement tracing using Perfetto (https://perfetto.dev). v8_use_perfetto = false + # Use Perfetto JSON Export. + v8_use_perfetto_json_export = "" + + # Use Perfetto SDK headers. + v8_use_perfetto_sdk = false + # Override global symbol level setting for v8. v8_symbol_level = symbol_level @@ -225,7 +230,7 @@ declare_args() { # When `v8_enable_pointer_compression_shared_cage` RO space is placed into a # contiguous area at the front of the cage. In case RO allocations fails this # size needs to be adjusted. - v8_contiguous_compressed_ro_space_size_mb = 8 + v8_contiguous_compressed_ro_space_size_mb = 16 # Change code emission and runtime features to be CET shadow-stack compliant # (incomplete and experimental). @@ -269,12 +274,25 @@ if (v8_enable_backtrace == "") { v8_enable_backtrace = is_debug && !v8_optimized_debug } +if (v8_use_perfetto_sdk) { + # When using perfetto SDK, we also need to enable perfetto support. + v8_use_perfetto = true +} + # Chromium is configured to use the perfetto client library, v8 should also # use perfetto for tracing. if (build_with_chromium) { v8_use_perfetto = true } +# Enable JSON export by default when using perfetto but not the SDK. +if (v8_use_perfetto_json_export == "") { + v8_use_perfetto_json_export = v8_use_perfetto && !v8_use_perfetto_sdk +} +assert( + !(v8_use_perfetto_sdk && v8_use_perfetto_json_export), + "Perfetto JSON Export is not available when building with the Perfetto SDK.") + # Includes profiles to optimize builtins if # * it is a Chromium build, and # * Chromium builds with optimization. @@ -305,7 +323,8 @@ if (v8_enable_pointer_compression == "") { # Windows, Linux, MacOS and tvOS. is_drumbrake_supported = v8_enable_webassembly && v8_enable_pointer_compression && - (v8_current_cpu == "x64" || v8_current_cpu == "arm64") && + (v8_current_cpu == "x64" || v8_current_cpu == "arm64" || + v8_current_cpu == "riscv64") && (target_os == "win" || target_os == "linux" || target_os == "mac" || target_os == "ios") diff --git a/deps/v8/include/cppgc/allocation.h b/deps/v8/include/cppgc/allocation.h index a7955fd1016e8e..450db00479e87a 100644 --- a/deps/v8/include/cppgc/allocation.h +++ b/deps/v8/include/cppgc/allocation.h @@ -50,18 +50,17 @@ class MakeGarbageCollectedTraitInternal { protected: static inline void MarkObjectAsFullyConstructed(const void* payload) { // See api_constants for an explanation of the constants. - std::atomic* atomic_mutable_bitfield = - reinterpret_cast*>( - const_cast(reinterpret_cast( - reinterpret_cast(payload) - - api_constants::kFullyConstructedBitFieldOffsetFromPayload))); + std::atomic_ref atomic_mutable_bitfield( + *const_cast(reinterpret_cast( + reinterpret_cast(payload) - + api_constants::kFullyConstructedBitFieldOffsetFromPayload))); // It's safe to split use load+store here (instead of a read-modify-write // operation), since it's guaranteed that this 16-bit bitfield is only // modified by a single thread. This is cheaper in terms of code bloat (on // ARM) and performance. - uint16_t value = atomic_mutable_bitfield->load(std::memory_order_relaxed); + uint16_t value = atomic_mutable_bitfield.load(std::memory_order_relaxed); value |= api_constants::kFullyConstructedBitMask; - atomic_mutable_bitfield->store(value, std::memory_order_release); + atomic_mutable_bitfield.store(value, std::memory_order_release); } // Dispatch based on compile-time information. diff --git a/deps/v8/include/cppgc/internal/api-constants.h b/deps/v8/include/cppgc/internal/api-constants.h index f3b0d8571d3b9d..73b955d7053ae1 100644 --- a/deps/v8/include/cppgc/internal/api-constants.h +++ b/deps/v8/include/cppgc/internal/api-constants.h @@ -28,7 +28,7 @@ constexpr size_t kGB = kMB * 1024; static constexpr size_t kFullyConstructedBitFieldOffsetFromPayload = 2 * sizeof(uint16_t); // Mask for in-construction bit. -static constexpr uint16_t kFullyConstructedBitMask = uint16_t{1}; +static constexpr uint16_t kFullyConstructedBitMask = uint16_t{1} << 15; static constexpr size_t kPageSizeBits = 17; static constexpr size_t kPageSize = size_t{1} << kPageSizeBits; diff --git a/deps/v8/include/cppgc/internal/member-storage.h b/deps/v8/include/cppgc/internal/member-storage.h index f862740db65c65..7fff2ea807fb04 100644 --- a/deps/v8/include/cppgc/internal/member-storage.h +++ b/deps/v8/include/cppgc/internal/member-storage.h @@ -154,6 +154,14 @@ class V8_TRIVIAL_ABI CompressedPointer final { // the cage alignment. CPPGC_DCHECK((!compressed || compressed == kCompressedSentinel) || (compressed & (1 << 31))); + + // Tell the compiler that decompressing this compressed pointer + // is a no-op. Note that Clang is unable to inline Decompress() + // into an assume, so we need to write it out fully. + [[assume(((static_cast(static_cast(compressed)) + << api_constants::kPointerCompressionShift) & + base) == uptr)]]; + return compressed; } diff --git a/deps/v8/include/libplatform/v8-tracing.h b/deps/v8/include/libplatform/v8-tracing.h index 2271729240b9cb..9d05949c38efac 100644 --- a/deps/v8/include/libplatform/v8-tracing.h +++ b/deps/v8/include/libplatform/v8-tracing.h @@ -14,9 +14,11 @@ #include "v8-platform.h" // NOLINT(build/include_directory) namespace perfetto { +#if defined(V8_USE_PERFETTO_JSON_EXPORT) namespace trace_processor { class TraceProcessorStorage; } +#endif // defined(V8_USE_PERFETTO_JSON_EXPORT) class TracingSession; } @@ -231,6 +233,12 @@ class V8_PLATFORM_EXPORT TraceConfig { #define V8_PLATFORM_NON_EXPORTED_BASE(code) code #endif // defined(_MSC_VER) +/** + * V8 Tracing controller default implementation. + * + * Will become obsolete in Perfetto build + * (v8_use_perfetto_json_export = true). + */ class V8_PLATFORM_EXPORT TracingController : public V8_PLATFORM_NON_EXPORTED_BASE(v8::TracingController) { public: @@ -307,10 +315,13 @@ class V8_PLATFORM_EXPORT TracingController std::unique_ptr trace_config_; std::atomic_bool recording_{false}; -#if defined(V8_USE_PERFETTO) - std::ostream* output_stream_ = nullptr; +#if defined(V8_USE_PERFETTO_JSON_EXPORT) std::unique_ptr trace_processor_; +#endif + +#if defined(V8_USE_PERFETTO) + std::ostream* output_stream_ = nullptr; TraceEventListener* listener_for_testing_ = nullptr; std::unique_ptr tracing_session_; #else // !defined(V8_USE_PERFETTO) diff --git a/deps/v8/include/v8-callbacks.h b/deps/v8/include/v8-callbacks.h index 850b7ccbd4f210..e5eba5a203b8bc 100644 --- a/deps/v8/include/v8-callbacks.h +++ b/deps/v8/include/v8-callbacks.h @@ -260,6 +260,15 @@ enum class CrashKeyId { using AddCrashKeyCallback = void (*)(CrashKeyId id, const std::string& value); +// --- CrashKeyString Callbacks --- +using CrashKey = void*; +enum class CrashKeySize { Size32, Size64, Size256, Size1024 }; + +using AllocateCrashKeyStringCallback = + std::function; +using SetCrashKeyStringCallback = + std::function; + // --- Enter/Leave Script Callback --- using BeforeCallEnteredCallback = void (*)(Isolate*); using CallCompletedCallback = void (*)(Isolate*); diff --git a/deps/v8/include/v8-context.h b/deps/v8/include/v8-context.h index 1d52f5bf40652e..21137f628f2def 100644 --- a/deps/v8/include/v8-context.h +++ b/deps/v8/include/v8-context.h @@ -276,6 +276,20 @@ class V8_EXPORT Context : public Data { * Gets the embedder data with the given index, which must have been set by a * previous call to SetEmbedderData with the same index. */ + V8_INLINE Local GetEmbedderDataV2(int index); + + /** + * Sets the embedder data with the given index, growing the data as + * needed. Note that index 0 currently has a special meaning for Chrome's + * debugger. + */ + void SetEmbedderDataV2(int index, Local value); + + /** + * Gets the embedder data with the given index, which must have been set by a + * previous call to SetEmbedderData with the same index. + */ + V8_DEPRECATE_SOON("Use GetEmbedderDataV2 instead") V8_INLINE Local GetEmbedderData(int index); /** @@ -291,6 +305,7 @@ class V8_EXPORT Context : public Data { * needed. Note that index 0 currently has a special meaning for Chrome's * debugger. */ + V8_DEPRECATE_SOON("Use SetEmbedderDataV2 instead") void SetEmbedderData(int index, Local value); /** @@ -304,7 +319,7 @@ class V8_EXPORT Context : public Data { V8_INLINE void* GetAlignedPointerFromEmbedderData(int index, EmbedderDataTypeTag tag); - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromEmbedderData with EmbedderDataTypeTag " "parameter instead.") V8_INLINE void* GetAlignedPointerFromEmbedderData(Isolate* isolate, @@ -313,7 +328,7 @@ class V8_EXPORT Context : public Data { kEmbedderDataTypeTagDefault); } - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromEmbedderData with EmbedderDataTypeTag " "parameter instead.") V8_INLINE void* GetAlignedPointerFromEmbedderData(int index) { @@ -329,7 +344,7 @@ class V8_EXPORT Context : public Data { * index, growing the data as needed. Note that index 0 currently has a * special meaning for Chrome's debugger. */ - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use SetAlignedPointerInEmbedderData with EmbedderDataTypeTag parameter " "instead.") void SetAlignedPointerInEmbedderData(int index, void* value) { @@ -453,6 +468,7 @@ class V8_EXPORT Context : public Data { internal::ValueHelper::InternalRepresentationType GetDataFromSnapshotOnce( size_t index); Local SlowGetEmbedderData(int index); + Local SlowGetEmbedderDataV2(int index); void* SlowGetAlignedPointerFromEmbedderData(int index, EmbedderDataTypeTag tag); }; @@ -471,7 +487,7 @@ Local Context::GetEmbedderData(int index) { A value = I::ReadRawField(embedder_data, value_offset); #ifdef V8_COMPRESS_POINTERS // We read the full pointer value and then decompress it in order to avoid - // dealing with potential endiannes issues. + // dealing with potential endianness issues. value = I::DecompressTaggedField(embedder_data, static_cast(value)); #endif @@ -482,6 +498,29 @@ Local Context::GetEmbedderData(int index) { #endif } +V8_INLINE Local Context::GetEmbedderDataV2(int index) { +#ifndef V8_ENABLE_CHECKS + using A = internal::Address; + using I = internal::Internals; + A ctx = internal::ValueHelper::ValueAsAddress(this); + A embedder_data = + I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset); + int value_offset = + I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index); + A value = I::ReadRawField(embedder_data, value_offset); +#ifdef V8_COMPRESS_POINTERS + // We read the full pointer value and then decompress it in order to avoid + // dealing with potential endianness issues. + value = I::DecompressTaggedField(embedder_data, static_cast(value)); +#endif + + auto* isolate = I::GetCurrentIsolate(); + return Local::New(isolate, value); +#else + return SlowGetEmbedderDataV2(index); +#endif +} + void* Context::GetAlignedPointerFromEmbedderData(Isolate* isolate, int index, EmbedderDataTypeTag tag) { #if !defined(V8_ENABLE_CHECKS) diff --git a/deps/v8/include/v8-data.h b/deps/v8/include/v8-data.h index bf40b746adf887..4e5d6e39f10c04 100644 --- a/deps/v8/include/v8-data.h +++ b/deps/v8/include/v8-data.h @@ -77,7 +77,11 @@ class V8_EXPORT Data { class V8_EXPORT FixedArray : public Data { public: int Length() const; - Local Get(Local context, int i) const; + + V8_DEPRECATED("Use the version without context") + Local Get(Local context, int i) const { return Get(i); } + + Local Get(int i) const; V8_INLINE static FixedArray* Cast(Data* data) { #ifdef V8_ENABLE_CHECKS diff --git a/deps/v8/include/v8-exception.h b/deps/v8/include/v8-exception.h index 5441a0ab6a403c..f240d9a609e92b 100644 --- a/deps/v8/include/v8-exception.h +++ b/deps/v8/include/v8-exception.h @@ -276,15 +276,18 @@ class V8_EXPORT TryCatch { void ResetInternal(); + // Helper methods for internal::Isolate. + bool capture_message() const; + void set_can_continue(bool value); + bool rethrow() const; + void set_rethrow(bool value); + internal::Isolate* i_isolate_; TryCatch* next_; void* exception_; void* message_obj_; internal::Address js_stack_comparable_address_; - bool is_verbose_ : 1; - bool can_continue_ : 1; - bool capture_message_ : 1; - bool rethrow_ : 1; + uint8_t flags_; friend class internal::Isolate; friend class internal::ThreadLocalTop; diff --git a/deps/v8/include/v8-extension.h b/deps/v8/include/v8-extension.h index 0705e2afbb8708..d0056cb286330d 100644 --- a/deps/v8/include/v8-extension.h +++ b/deps/v8/include/v8-extension.h @@ -33,7 +33,6 @@ class V8_EXPORT Extension { } const char* name() const { return name_; } - size_t source_length() const { return source_length_; } const String::ExternalOneByteStringResource* source() const { return source_; } @@ -48,7 +47,6 @@ class V8_EXPORT Extension { private: const char* name_; - size_t source_length_; // expected to initialize before source_ String::ExternalOneByteStringResource* source_; int dep_count_; const char** deps_; diff --git a/deps/v8/include/v8-external.h b/deps/v8/include/v8-external.h index c3feb1daad7e5f..ffe8fe6bc74ef6 100644 --- a/deps/v8/include/v8-external.h +++ b/deps/v8/include/v8-external.h @@ -34,7 +34,7 @@ class V8_EXPORT External : public Value { } static Local New(Isolate* isolate, void* value, ExternalPointerTypeTag tag); - V8_INLINE static External* Cast(Value* value) { + V8_INLINE static External* Cast(Data* value) { #ifdef V8_ENABLE_CHECKS CheckCast(value); #endif @@ -47,7 +47,7 @@ class V8_EXPORT External : public Value { void* Value(ExternalPointerTypeTag tag) const; private: - static void CheckCast(v8::Value* obj); + static void CheckCast(v8::Data* obj); }; } // namespace v8 diff --git a/deps/v8/include/v8-function-callback.h b/deps/v8/include/v8-function-callback.h index 0dad94ce22c270..68836f7a06d369 100644 --- a/deps/v8/include/v8-function-callback.h +++ b/deps/v8/include/v8-function-callback.h @@ -57,6 +57,7 @@ class ReturnValue { V8_INLINE void Set(const Local handle); template V8_INLINE void SetNonEmpty(const Local handle); + // Fast primitive number setters. V8_INLINE void Set(bool value); V8_INLINE void Set(double i); @@ -66,11 +67,13 @@ class ReturnValue { V8_INLINE void Set(uint16_t i); V8_INLINE void Set(uint32_t i); V8_INLINE void Set(uint64_t i); + // Fast JS primitive setters. V8_INLINE void SetNull(); V8_INLINE void SetUndefined(); V8_INLINE void SetFalse(); V8_INLINE void SetEmptyString(); + // Convenience getter for the Isolate. V8_INLINE Isolate* GetIsolate() const; @@ -103,7 +106,7 @@ class ReturnValue { V8_INLINE explicit ReturnValue(internal::Address* slot); // See FunctionCallbackInfo. - static constexpr int kIsolateValueIndex = -2; + static constexpr int kIsolateValueIndex = -1; internal::Address* value_; }; @@ -142,41 +145,75 @@ class FunctionCallbackInfo { friend class internal::CustomArguments; friend class debug::ConsoleCallArguments; friend void internal::PrintFunctionCallbackInfo(void*); + using I = internal::Internals; - // TODO(ishell, http://crbug.com/326505377): in case of non-constructor - // call, don't pass kNewTarget and kUnused. Add IsConstructCall flag to - // kIsolate field. - static constexpr int kUnusedIndex = 0; - static constexpr int kIsolateIndex = 1; - static constexpr int kContextIndex = 2; - static constexpr int kReturnValueIndex = 3; - static constexpr int kTargetIndex = 4; - static constexpr int kNewTargetIndex = 5; - static constexpr int kArgsLength = 6; - - static constexpr int kArgsLengthWithReceiver = kArgsLength + 1; - - // Codegen constants: - static constexpr int kSize = 3 * internal::kApiSystemPointerSize; - static constexpr int kImplicitArgsOffset = 0; - static constexpr int kValuesOffset = - kImplicitArgsOffset + internal::kApiSystemPointerSize; - static constexpr int kLengthOffset = - kValuesOffset + internal::kApiSystemPointerSize; - - static constexpr int kThisValuesIndex = -1; + // Frame block, matches the layout of ApiCallbackExitFrame. + // See ApiCallbackExitFrameConstants. + enum { + // + // Optional frame arguments block (exists only for API_CONSTRUCT_EXIT + // frame). + + // Frame arguments block. + kNewTargetIndex = -1, + + // + // Mandatory part, exists for both API_CALLBACK_EXIT and API_CONSTRUCT_EXIT + // frames. + // + + // Frame arguments block. + kArgcIndex, + + // Regular ExitFrame structure. + kFrameSPIndex, + kFrameTypeIndex, + kFrameConstantPoolIndex, // Optional, see I::kFrameCPSlotCount. + kFrameFPIndex = kFrameConstantPoolIndex + I::kFrameCPSlotCount, + kFramePCIndex, + + // Api arguments block, starts at kFirstArgumentIndex. + kFirstApiArgumentIndex, + kIsolateIndex = kFirstApiArgumentIndex, + kReturnValueIndex, + kContextIndex, + kTargetIndex, + + // JS args block, starts at kFrameFirstImplicitArgsIndex. + kReceiverIndex, + kFirstJSArgumentIndex, + + // Mandatory part includes receiver. + kArgsLength = kReceiverIndex + 1, + // Optional part size (exists only for API_CONSTRUCT_EXIT frame). + kOptionalArgsLength = 1, + + // The length of just Api arguments part. + kApiArgsLength = kReceiverIndex - kFirstApiArgumentIndex, + }; + + static_assert(kArgcIndex == 0); static_assert(ReturnValue::kIsolateValueIndex == kIsolateIndex - kReturnValueIndex); - V8_INLINE FunctionCallbackInfo(internal::Address* implicit_args, - internal::Address* values, int length); + internal::Address* address_of_first_argument() const { + return &values_[kFirstJSArgumentIndex]; + } + + V8_INLINE FunctionCallbackInfo() = default; - // TODO(https://crbug.com/326505377): flatten the v8::FunctionCallbackInfo - // object to avoid indirect loads through values_ and implicit_args_ and - // reduce the number of instructions in the CallApiCallback builtin. - internal::Address* implicit_args_; - internal::Address* values_; - internal::Address length_; + // FunctionCallbackInfo object provides a view of the stack area where the + // data is stored and thus it's not supposed to be copyable/movable. + FunctionCallbackInfo(const FunctionCallbackInfo&) = delete; + FunctionCallbackInfo& operator=(const FunctionCallbackInfo&) = delete; + FunctionCallbackInfo(FunctionCallbackInfo&&) = delete; + FunctionCallbackInfo& operator=(FunctionCallbackInfo&&) = delete; + + // Declare as mutable to let GC modify the contents of the slots even though + // it's not possible to change values via this class. + // Define the array size as 1 to make it clear that we are going to access + // it out-of-bounds from both sides anyway. + mutable internal::Address values_[1]; }; /** @@ -239,24 +276,10 @@ class PropertyCallbackInfo { * CompileRun("obj.a = 'obj'; var r = {a: 'r'}; Reflect.get(obj, 'x', r)"); * \endcode */ - V8_INLINE Local This() const; - - /** - * \return The object in the prototype chain of the receiver that has the - * interceptor. Suppose you have `x` and its prototype is `y`, and `y` - * has an interceptor. Then `info.This()` is `x` and `info.Holder()` is `y`. - * The Holder() could be a hidden object (the global object, rather - * than the global proxy). - * - * \note For security reasons, do not pass the object back into the runtime. - */ V8_DEPRECATED( - "V8 will stop providing access to hidden prototype (i.e. " - "JSGlobalObject). Use HolderV2() instead. \n" - "DO NOT try to workaround this by accessing JSGlobalObject via " - "v8::Object::GetPrototype() - it'll be deprecated soon too. \n" - "See http://crbug.com/333672197. ") - V8_INLINE Local Holder() const; + "Access to receiver will be deprecated soon. Use HolderV2() instead. \n" + "See http://crbug.com/455600234. ") + V8_INLINE Local This() const; /** * \return The object in the prototype chain of the receiver that has the @@ -264,6 +287,7 @@ class PropertyCallbackInfo { * has an interceptor. Then `info.This()` is `x` and `info.Holder()` is `y`. * In case the property is installed on the global object the Holder() * would return the global proxy. + * TODO(http://crbug.com/333672197): rename back to Holder(). */ V8_INLINE Local HolderV2() const; @@ -278,11 +302,18 @@ class PropertyCallbackInfo { V8_INLINE ReturnValue GetReturnValue() const; /** + * For [[Set]], [[DefineOwnProperty]] and [[Delete]] operations (i.e. + * for setter/definer/deleter callbacks) indicates whether TypeError + * should be thrown upon operation failure. The callback should throw + * TypeError only if it's necessary to provide more details than a default + * error thrown by V8 contains in this case. + * * \return True if the intercepted function should throw if an error occurs. - * Usually, `true` corresponds to `'use strict'`. + * Usually, `true` corresponds to `'use strict'` execution mode. * - * \note Always `false` when intercepting `Reflect.set()` - * independent of the language mode. + * \note Always `false` when the operation was initiated by respecive + * `Reflect` call (i.e. `Reflect.set()`, `Reflect.defineProperty()` and + * `Reflect.deleteProperty()`). */ V8_INLINE bool ShouldThrowOnError() const; @@ -293,22 +324,79 @@ class PropertyCallbackInfo { friend class internal::PropertyCallbackArguments; friend class internal::CustomArguments; friend void internal::PrintPropertyCallbackInfo(void*); + using I = internal::Internals; - static constexpr int kPropertyKeyIndex = 0; - static constexpr int kShouldThrowOnErrorIndex = 1; - static constexpr int kHolderIndex = 2; - static constexpr int kIsolateIndex = 3; - static constexpr int kHolderV2Index = 4; - static constexpr int kReturnValueIndex = 5; - static constexpr int kDataIndex = 6; - static constexpr int kThisIndex = 7; - static constexpr int kArgsLength = 8; + // ShouldThrowOnError() can return true only for setter/definer/deleter + // callbacks which match [[Set]]/[[DefineOwnProperty]]/[[Delete]] + // operations. We detect these operations by return value type - they + // all return boolean value, even though setter/deleter callbacks are + // still using v8::PropertyCallbackInfo. + // TODO(https://crbug.com/348660658): cleanup this, once the callbacks are + // migrated to a new return type. + static constexpr bool HasShouldThrowOnError() { + return std::is_same_v || std::is_same_v; + } - static constexpr int kSize = kArgsLength * internal::kApiSystemPointerSize; + // Indicates whether this is a named accessor/interceptor callback call + // or an indexed one. + V8_INLINE bool IsNamed() const; + + // Frame block, matches the layout of ApiAccessorExitFrame. + // See ApiAccessorExitFrameConstants. + enum { + // Frame arguments block. + kPropertyKeyIndex, + + // Regular ExitFrame structure. + kFrameSPIndex, + kFrameTypeIndex, + kFrameConstantPoolIndex, // Optional, see I::kFrameCPSlotCount. + kFrameFPIndex = kFrameConstantPoolIndex + I::kFrameCPSlotCount, + kFramePCIndex, + + // Other arguments block, starts at kFirstArgumentIndex. + kFirstApiArgumentIndex, + kIsolateIndex = kFirstApiArgumentIndex, + kReturnValueIndex, + kCallbackInfoIndex, + // TODO(http://crbug.com/455600234): drop this once This() is removed. + kUnusedIndex, // Optional, see I::kSPAlignmentSlotCount. + kHolderIndex = kUnusedIndex + I::kSPAlignmentSlotCount, + // TODO(http://crbug.com/455600234): drop this once This() is removed. + kThisIndex, + + // + // Optional part, used only by setter/definer/deleter callbacks. + // + kFirstOptionalArgument, + kShouldThrowOnErrorIndex = kFirstOptionalArgument, + + // Used as value handle storage when called via CallApiSetter builtin. + kValueIndex, + + kFullArgsLength, + kMandatoryArgsLength = kFirstOptionalArgument, + kOptionalArgsLength = kFullArgsLength - kFirstOptionalArgument, + + // Various lengths of just Api arguments part. + kMandatoryApiArgsLength = kMandatoryArgsLength - kFirstApiArgumentIndex, + kFullApiArgsLength = kFullArgsLength - kFirstApiArgumentIndex, + }; + + // PropertyCallbackInfo object provides a view of the stack area where the + // data is stored and thus it's not supposed to be copyable/movable. + PropertyCallbackInfo(const PropertyCallbackInfo&) = delete; + PropertyCallbackInfo& operator=(const PropertyCallbackInfo&) = delete; + PropertyCallbackInfo(PropertyCallbackInfo&&) = delete; + PropertyCallbackInfo& operator=(PropertyCallbackInfo&&) = delete; PropertyCallbackInfo() = default; - mutable internal::Address args_[kArgsLength]; + // Declare as mutable to let GC modify the contents of the slots even though + // it's not possible to change values via this class. + // Define the array size as 1 to make it clear that we are going to access + // it out-of-bounds anyway. + mutable internal::Address args_[1]; }; using FunctionCallback = void (*)(const FunctionCallbackInfo& info); @@ -377,25 +465,9 @@ void ReturnValue::SetNonEmpty(const BasicTracedReference& handle) { template template void ReturnValue::Set(const Local handle) { - // "V8_DEPRECATE_SOON" this method if |T| is |void|. -#ifdef V8_IMMINENT_DEPRECATION_WARNINGS - static constexpr bool is_allowed_void = false; - static_assert(!std::is_void_v, - "ReturnValue::Set(const Local) is deprecated. " - "Do nothing to indicate that the operation succeeded or use " - "SetFalse() to indicate that the operation failed (don't " - "forget to handle info.ShouldThrowOnError()). " - "See http://crbug.com/348660658 for details."); -#else - static constexpr bool is_allowed_void = std::is_void_v; -#endif // V8_IMMINENT_DEPRECATION_WARNINGS - static_assert(is_allowed_void || std::is_base_of_v, "type check"); + static_assert(std::is_base_of_v, "type check"); if (V8_UNLIKELY(handle.IsEmpty())) { SetDefaultValue(); - } else if constexpr (is_allowed_void) { - // Simulate old behaviour for "v8::AccessorSetterCallback" for which - // it was possible to set the return value even for ReturnValue. - Set(handle->BooleanValue(GetIsolate())); } else { SetInternal(handle.ptr()); } @@ -404,29 +476,11 @@ void ReturnValue::Set(const Local handle) { template template void ReturnValue::SetNonEmpty(const Local handle) { - // "V8_DEPRECATE_SOON" this method if |T| is |void|. -#ifdef V8_IMMINENT_DEPRECATION_WARNINGS - static constexpr bool is_allowed_void = false; - static_assert(!std::is_void_v, - "ReturnValue::SetNonEmpty(const Local) is deprecated. " - "Do nothing to indicate that the operation succeeded or use " - "SetFalse() to indicate that the operation failed (don't " - "forget to handle info.ShouldThrowOnError()). " - "See http://crbug.com/348660658 for details."); -#else - static constexpr bool is_allowed_void = std::is_void_v; -#endif // V8_IMMINENT_DEPRECATION_WARNINGS - static_assert(is_allowed_void || std::is_base_of_v, "type check"); + static_assert(std::is_base_of_v, "type check"); #ifdef V8_ENABLE_CHECKS internal::VerifyHandleIsNonEmpty(handle.IsEmpty()); #endif // V8_ENABLE_CHECKS - if constexpr (is_allowed_void) { - // Simulate old behaviour for "v8::AccessorSetterCallback" for which - // it was possible to set the return value even for ReturnValue. - Set(handle->BooleanValue(GetIsolate())); - } else { - SetInternal(handle.ptr()); - } + SetInternal(handle.ptr()); } template @@ -611,54 +665,58 @@ void ReturnValue::Set(S* whatever) { static_assert(sizeof(S) < 0, "incompilable to prevent inadvertent misuse"); } -template -FunctionCallbackInfo::FunctionCallbackInfo(internal::Address* implicit_args, - internal::Address* values, - int length) - : implicit_args_(implicit_args), values_(values), length_(length) {} - template Local FunctionCallbackInfo::operator[](int i) const { - // values_ points to the first argument (not the receiver). if (i < 0 || Length() <= i) return Undefined(GetIsolate()); - return Local::FromSlot(values_ + i); + return Local::FromSlot(&values_[kFirstJSArgumentIndex + i]); } template Local FunctionCallbackInfo::This() const { - // values_ points to the first argument (not the receiver). - return Local::FromSlot(values_ + kThisValuesIndex); + return Local::FromSlot(&values_[kReceiverIndex]); } template Local FunctionCallbackInfo::NewTarget() const { - return Local::FromSlot(&implicit_args_[kNewTargetIndex]); + if (IsConstructCall()) { + // Can't use &values_[kNewTargetIndex] because of "array index -1 is + // before the beginning of the array" error. + internal::Address* values = &values_[0]; + return Local::FromSlot(values + kNewTargetIndex); + } + return Undefined(GetIsolate()); } template Local FunctionCallbackInfo::Data() const { - auto target = Local::FromSlot(&implicit_args_[kTargetIndex]); + auto target = Local::FromSlot(&values_[kTargetIndex]); return api_internal::GetFunctionTemplateData(GetIsolate(), target); } template Isolate* FunctionCallbackInfo::GetIsolate() const { - return *reinterpret_cast(&implicit_args_[kIsolateIndex]); + return reinterpret_cast(values_[kIsolateIndex]); } template ReturnValue FunctionCallbackInfo::GetReturnValue() const { - return ReturnValue(&implicit_args_[kReturnValueIndex]); + return ReturnValue(&values_[kReturnValueIndex]); } template bool FunctionCallbackInfo::IsConstructCall() const { - return !NewTarget()->IsUndefined(); + return I::SmiValue(values_[kFrameTypeIndex]) == I::kFrameTypeApiConstructExit; } template int FunctionCallbackInfo::Length() const { - return static_cast(length_); + return static_cast(values_[kArgcIndex]); +} + +template +bool PropertyCallbackInfo::IsNamed() const { + return I::SmiValue(args_[kFrameTypeIndex]) == + I::kFrameTypeApiNamedAccessorExit; } template @@ -668,7 +726,10 @@ Isolate* PropertyCallbackInfo::GetIsolate() const { template Local PropertyCallbackInfo::Data() const { - return Local::FromSlot(&args_[kDataIndex]); + internal::Address callback_info = args_[kCallbackInfoIndex]; + internal::Address data = + I::ReadTaggedPointerField(callback_info, I::kCallbackInfoDataOffset); + return Local::New(GetIsolate(), data); } template @@ -676,26 +737,9 @@ Local PropertyCallbackInfo::This() const { return Local::FromSlot(&args_[kThisIndex]); } -template -Local PropertyCallbackInfo::Holder() const { - return Local::FromSlot(&args_[kHolderIndex]); -} - -namespace api_internal { -// Returns JSGlobalProxy if holder is JSGlobalObject or unmodified holder -// otherwise. -V8_EXPORT internal::Address ConvertToJSGlobalProxyIfNecessary( - internal::Address holder); -} // namespace api_internal - template Local PropertyCallbackInfo::HolderV2() const { - using I = internal::Internals; - if (!I::HasHeapObjectTag(args_[kHolderV2Index])) { - args_[kHolderV2Index] = - api_internal::ConvertToJSGlobalProxyIfNecessary(args_[kHolderIndex]); - } - return Local::FromSlot(&args_[kHolderV2Index]); + return Local::FromSlot(&args_[kHolderIndex]); } template @@ -705,7 +749,7 @@ ReturnValue PropertyCallbackInfo::GetReturnValue() const { template bool PropertyCallbackInfo::ShouldThrowOnError() const { - using I = internal::Internals; + if constexpr (!HasShouldThrowOnError()) return false; if (args_[kShouldThrowOnErrorIndex] != I::IntegralToSmi(I::kInferShouldThrowMode)) { return args_[kShouldThrowOnErrorIndex] != I::IntegralToSmi(I::kDontThrow); diff --git a/deps/v8/include/v8-function.h b/deps/v8/include/v8-function.h index 9ee77596cd3796..18532519f8b89c 100644 --- a/deps/v8/include/v8-function.h +++ b/deps/v8/include/v8-function.h @@ -31,8 +31,8 @@ class V8_EXPORT Function : public Object { * for a given FunctionCallback. */ static MaybeLocal New( - Local context, FunctionCallback callback, - Local data = Local(), int length = 0, + Local context, FunctionCallback callback, Local data = {}, + int length = 0, ConstructorBehavior behavior = ConstructorBehavior::kAllow, SideEffectType side_effect_type = SideEffectType::kHasSideEffect); diff --git a/deps/v8/include/v8-internal.h b/deps/v8/include/v8-internal.h index 8d28f22018609a..e705cd14141884 100644 --- a/deps/v8/include/v8-internal.h +++ b/deps/v8/include/v8-internal.h @@ -308,6 +308,13 @@ constexpr size_t kExternalPointerTableReservationSize = 256 * MB; // smaller than the maximum table size even after the C++ compiler multiplies // them by 8 to be used as indexes into a table of 64 bit pointers. constexpr uint32_t kExternalPointerIndexShift = 7; +#elif defined(V8_TARGET_OS_IOS) +// iOS restricts large memory allocations, with 128 MB being the maximum size we +// can configure. If we exceed this, SegmentedTable::Initialize will throw a V8 +// out-of-memory error when running the JetStream benchmark +// (https://browserbench.org/JetStream/). +constexpr size_t kExternalPointerTableReservationSize = 128 * MB; +constexpr uint32_t kExternalPointerIndexShift = 8; #else constexpr size_t kExternalPointerTableReservationSize = 512 * MB; constexpr uint32_t kExternalPointerIndexShift = 6; @@ -466,8 +473,8 @@ struct TagRange { // Need to perform the math with uint32_t. Otherwise, the uint16_ts would // be promoted to (signed) int, allowing the compiler to (wrongly) assume // that an underflow cannot happen as that would be undefined behavior. - return static_cast(tag) - first <= - static_cast(last) - first; + return static_cast(tag) - static_cast(first) <= + static_cast(last) - static_cast(first); } constexpr bool Contains(TagRange tag_range) const { @@ -483,7 +490,7 @@ struct TagRange { return (static_cast(first) << 16) | last; } - // Internally we represent tag ranges as half-open ranges [first, last). + // Internally we represent tag ranges as closed ranges [first, last]. const Tag first; const Tag last; }; @@ -901,6 +908,9 @@ class Internals { static const int kExternalTwoByteRepresentationTag = 0x02; static const int kExternalOneByteRepresentationTag = 0x0a; + // AccessorInfo::data and InterceptorInfo::data field. + static const int kCallbackInfoDataOffset = 1 * kApiTaggedSize; + static const uint32_t kNumIsolateDataSlots = 4; static const int kStackGuardSize = 8 * kApiSystemPointerSize; static const int kNumberOfBooleanFlags = 6; @@ -1000,6 +1010,24 @@ class Internals { static const int kIsolateRootsOffset = kContinuationPreservedEmbedderDataOffset + kApiSystemPointerSize; +#if V8_TARGET_ARCH_PPC64 + static constexpr int kFrameCPSlotCount = 1; +#else + static constexpr int kFrameCPSlotCount = 0; +#endif + +#if V8_TARGET_ARCH_ARM64 + // The padding required to keep SP 16-byte aligned. + static constexpr int kSPAlignmentSlotCount = 1; +#else + static constexpr int kSPAlignmentSlotCount = 0; +#endif + + static const int kFrameTypeApiCallExit = 18; + static const int kFrameTypeApiConstructExit = 19; + static const int kFrameTypeApiNamedAccessorExit = 20; + static const int kFrameTypeApiIndexedAccessorExit = 21; + // Assert scopes static const int kDisallowGarbageCollectionAlign = alignof(uint32_t); static const int kDisallowGarbageCollectionSize = sizeof(uint32_t); @@ -1020,13 +1048,9 @@ class Internals { using Tagged_t = uint32_t; struct StaticReadOnlyRoot { #ifdef V8_ENABLE_WEBASSEMBLY - static constexpr Tagged_t kBuildDependentTheHoleValue = 0x20001; + static constexpr Tagged_t kBuildDependentTheHoleValue = 0x2fffd; #else -#ifdef V8_INTL_SUPPORT - static constexpr Tagged_t kBuildDependentTheHoleValue = 0x6581; -#else - static constexpr Tagged_t kBuildDependentTheHoleValue = 0x58d1; -#endif + static constexpr Tagged_t kBuildDependentTheHoleValue = 0xfffd; #endif #define DEF_ROOT(name, value) static constexpr Tagged_t k##name = value; diff --git a/deps/v8/include/v8-isolate.h b/deps/v8/include/v8-isolate.h index 1efaa547bc0ed3..f929f13a4de8ff 100644 --- a/deps/v8/include/v8-isolate.h +++ b/deps/v8/include/v8-isolate.h @@ -357,18 +357,6 @@ class V8_EXPORT Isolate { */ bool allow_atomics_wait = true; - /** - * The following parameters describe the offsets for addressing type info - * for wrapped API objects and are used by the fast C API - * (for details see v8-fast-api-calls.h). - * - * V8_DEPRECATED was applied in v14.3. - */ - V8_DEPRECATED("This field is unused.") - int embedder_wrapper_type_index = -1; - V8_DEPRECATED("This field is unused.") - int embedder_wrapper_object_index = -1; - /** * Callbacks to invoke in case of fatal or OOM errors. */ @@ -1492,6 +1480,13 @@ class V8_EXPORT Isolate { */ void SetAddCrashKeyCallback(AddCrashKeyCallback); + /** + * Enables the host application to provide a mechanism for allocating a new + * crash key and setting/updating values for them. + */ + void SetCrashKeyStringCallbacks(AllocateCrashKeyStringCallback, + SetCrashKeyStringCallback); + /** * Optional notification that the system is running low on memory. * V8 uses these notifications to attempt to free memory. @@ -1553,6 +1548,19 @@ class V8_EXPORT Isolate { */ void SetIsLoading(bool is_loading); + /** + * Optional notification to tell V8 whether the embedder is currently + * handling user input. If the embedder uses this notification, it should + * call SetIsInputHandling(true) when input handling starts, and + * SetIsInputHandling(false) when it ends. + * Calling SetIsInputHandling(true) while handling input, or calling + * SetIsInputHandling(false) while not handling input, both have no effect. + * V8 uses these notifications to guide heuristics. + * This is an unfinished experimental feature. Semantics and implementation + * may change frequently. + */ + void SetIsInputHandling(bool is_input_handling); + /** * Optional notification to tell V8 whether the embedder is currently frozen. * V8 uses these notifications to guide heuristics. diff --git a/deps/v8/include/v8-metrics.h b/deps/v8/include/v8-metrics.h index 1e8a546b8418bb..b67196c3e1be1c 100644 --- a/deps/v8/include/v8-metrics.h +++ b/deps/v8/include/v8-metrics.h @@ -53,6 +53,7 @@ struct GarbageCollectionFullCycle { std::optional priority = std::nullopt; bool reduce_memory = false; bool is_loading = false; + bool is_input_handling = false; GarbageCollectionPhases total; GarbageCollectionPhases total_cpp; GarbageCollectionPhases main_thread; diff --git a/deps/v8/include/v8-object.h b/deps/v8/include/v8-object.h index 65a144474cb095..8e46e71c35e976 100644 --- a/deps/v8/include/v8-object.h +++ b/deps/v8/include/v8-object.h @@ -163,30 +163,44 @@ enum PropertyAttribute { }; /** - * Accessor[Getter|Setter] are used as callback functions when setting|getting - * a particular data property. See Object::SetNativeDataProperty and + * This callback function is called when getting a particular data property + * (i.e. when performing [[Get]] operation). + * + * The callback returns the result by calling `info.GetReturnValue().Set(..)`. + * + * \param property The name of the property being requested. + * \param info Information about the intercepted request, such as + * isolate, object holding the property, return value. See + * `PropertyCallbackInfo`. + * + * See Object::SetNativeDataProperty and * ObjectTemplate::SetNativeDataProperty methods. */ using AccessorNameGetterCallback = void (*)(Local property, const PropertyCallbackInfo& info); -using AccessorNameSetterCallback = - void (*)(Local property, Local value, - const PropertyCallbackInfo& info); - /** - * Access control specifications. + * This callback function is called when setting a particular data property + * (i.e. when performing [[Set]] operation). + * + * In case of operation failure the callback should + * - call `info.GetReturnValue().Set(false)`, + * - (optionally) upon operation failure and info.ShouldThrowOnError() + * is true (indicating execution in `'use strict'` mode) the callback can + * throw TypeError if the error message needs to include more details than + * a TypeError thrown by V8 in this case. * - * Some accessors should be accessible across contexts. These - * accessors have an explicit access control parameter which specifies - * the kind of cross-context access that should be allowed. + * \param property The name of the property being requested. + * \param info Information about the intercepted request, such as + * isolate, object holding the property, return value, or whether running in + * `'use strict'` mode. See `PropertyCallbackInfo`. * + * See Object::SetNativeDataProperty and + * ObjectTemplate::SetNativeDataProperty methods. */ -enum V8_DEPRECATED( - "This enum is no longer used and will be removed in V8 14.3.") - AccessControl { - DEFAULT V8_ENUM_DEPRECATED("not used") = 0, - }; +using AccessorNameSetterCallback = + void (*)(Local property, Local value, + const PropertyCallbackInfo& info); /** * Property filter bits. They can be or'ed to build a composite filter. @@ -517,7 +531,7 @@ class V8_EXPORT Object : public Value { int index, EmbedderDataTypeTag tag); - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromInternalField with EmbedderDataTypeTag " "parameter instead.") V8_INLINE void* GetAlignedPointerFromInternalField(int index) { @@ -525,7 +539,7 @@ class V8_EXPORT Object : public Value { kEmbedderDataTypeTagDefault); } - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromInternalField with EmbedderDataTypeTag " "parameter instead.") V8_INLINE void* GetAlignedPointerFromInternalField(v8::Isolate* isolate, @@ -542,7 +556,7 @@ class V8_EXPORT Object : public Value { index, tag); } - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromInternalField with EmbedderDataTypeTag " "parameter instead.") V8_INLINE static void* GetAlignedPointerFromInternalField( @@ -559,7 +573,7 @@ class V8_EXPORT Object : public Value { index, tag); } - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromInternalField with EmbedderDataTypeTag " "parameter instead.") V8_INLINE static void* GetAlignedPointerFromInternalField( @@ -576,14 +590,14 @@ class V8_EXPORT Object : public Value { void SetAlignedPointerInInternalField(int index, void* value, EmbedderDataTypeTag tag); - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use SetAlignedPointerInInternalField with EmbedderDataTypeTag parameter " "instead.") void SetAlignedPointerInInternalField(int index, void* value) { SetAlignedPointerInInternalField(index, value, kEmbedderDataTypeTagDefault); } - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use SetAlignedPointerInInternalField with EmbedderDataTypeTag " "parameter instead.") void SetAlignedPointerInInternalFields(int argc, int indices[], @@ -821,7 +835,7 @@ class V8_EXPORT Object : public Value { void* GetAlignedPointerFromEmbedderDataInCreationContext( int index, EmbedderDataTypeTag tag); - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromEmbedderDataInCreationContext with " "EmbedderDataTypeTag parameter instead.") void* GetAlignedPointerFromEmbedderDataInCreationContext(v8::Isolate* isolate, @@ -830,7 +844,7 @@ class V8_EXPORT Object : public Value { isolate, index, kEmbedderDataTypeTagDefault); } - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use GetAlignedPointerFromEmbedderDataInCreationContext with " "EmbedderDataTypeTag parameter instead.") void* GetAlignedPointerFromEmbedderDataInCreationContext(int index) { diff --git a/deps/v8/include/v8-platform.h b/deps/v8/include/v8-platform.h index 8d87fe973bc945..ee71def69585ad 100644 --- a/deps/v8/include/v8-platform.h +++ b/deps/v8/include/v8-platform.h @@ -316,6 +316,29 @@ class JobTask { virtual size_t GetMaxConcurrency(size_t worker_count) const = 0; }; +// Allows a thread to temporarily boost another thread's priority to match its +// own priority. The priority is reset when the object is destroyed, which must +// happens on the boosted thread. +class ScopedBoostablePriority { + public: + ScopedBoostablePriority() = default; + virtual ~ScopedBoostablePriority() = default; + ScopedBoostablePriority(const ScopedBoostablePriority&) = delete; + ScopedBoostablePriority& operator=(const ScopedBoostablePriority& other) = + delete; + + // Boosts the priority of the thread where this ScopedBoostablePriority was + // created. Can be called from any thread, but requires proper external + // synchronization with the constructor, destructor and any other call to + // BoostPriority/Reset(). If called multiple times, only the first call takes + // effect. + virtual bool BoostPriority() = 0; + + // Resets the priority of the thread where this ScopedBoostablePriority was + // created to its original priority. + virtual void Reset() = 0; +}; + /** * A "blocking call" refers to any call that causes the calling thread to wait * off-CPU. It includes but is not limited to calls that wait on synchronous @@ -369,7 +392,7 @@ class ConvertableToTraceFormat { * * Can be implemented by an embedder to record trace events from V8. * - * Will become obsolete in Perfetto SDK build (v8_use_perfetto = true). + * Will become obsolete in Perfetto build (v8_use_perfetto = true). */ class TracingController { public: @@ -446,6 +469,77 @@ class TracingController { virtual void RemoveTraceStateObserver(TraceStateObserver*) {} }; +// Opaque type representing a handle to a shared memory region. +class SharedMemoryHandle { + public: + // For the handle itself, we use the underlying type (e.g. unsigned int) + // instead of e.g. mach_port_t to avoid pulling in large OS header files into + // this header file. Instead, the users of these routines are expected to + // include the respective OS headers in addition to this one. + +#if V8_OS_DARWIN + // A mach_port_t referencing a memory entry object. + using PlatformHandle = unsigned int; +#elif V8_OS_FUCHSIA + // A zx_handle_t to a VMO. + using PlatformHandle = uint32_t; +#elif V8_OS_WIN + // A Windows HANDLE to a file mapping object. + using PlatformHandle = void*; +#else + // A file descriptor. + using PlatformHandle = int; +#endif + + static constexpr SharedMemoryHandle FromPlatformHandle( + PlatformHandle handle) { + return SharedMemoryHandle(handle); + } + + PlatformHandle GetPlatformHandle() const { return handle_; } + + private: + SharedMemoryHandle() = delete; + explicit constexpr SharedMemoryHandle(PlatformHandle handle) + : handle_(handle) {} + + PlatformHandle handle_; +}; + +#define DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(Wrap, Unwrap) \ + V8_DEPRECATE_SOON("Use SharedMemoryHandle::FromPlatformHandle instead") \ + inline SharedMemoryHandle Wrap(SharedMemoryHandle::PlatformHandle handle) { \ + return SharedMemoryHandle::FromPlatformHandle(handle); \ + } \ + V8_DEPRECATE_SOON("Use SharedMemoryHandle::GetPlatformHandle instead") \ + inline SharedMemoryHandle::PlatformHandle Unwrap( \ + SharedMemoryHandle handle) { \ + return handle.GetPlatformHandle(); \ + } + +#if V8_OS_DARWIN +DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromMachMemoryEntry, + MachMemoryEntryFromSharedMemoryHandle) +#elif V8_OS_FUCHSIA +DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromVMO, + VMOFromSharedMemoryHandle) +#elif V8_OS_WIN +DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromFileMapping, + FileMappingFromSharedMemoryHandle) +#else +DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS(SharedMemoryHandleFromFileDescriptor, + FileDescriptorFromSharedMemoryHandle) +#endif + +#undef DEFINE_SHARED_MEMORY_HANDLE_WRAPPERS + +// TODO(https://crbug.com/463925491): Remove this type alias once Chromium's +// "gin" V8 binding migrates off it. +using PlatformSharedMemoryHandle = std::optional; +V8_DEPRECATE_SOON("Use std::nullopt instead") +static constexpr PlatformSharedMemoryHandle kInvalidSharedMemoryHandle = + std::nullopt; + /** * A V8 memory page allocator. * @@ -703,57 +797,6 @@ class ThreadIsolatedAllocator { virtual int Pkey() const { return -1; } }; -// Opaque type representing a handle to a shared memory region. -using PlatformSharedMemoryHandle = intptr_t; -static constexpr PlatformSharedMemoryHandle kInvalidSharedMemoryHandle = -1; - -// Conversion routines from the platform-dependent shared memory identifiers -// into the opaque PlatformSharedMemoryHandle type. These use the underlying -// types (e.g. unsigned int) instead of the typedef'd ones (e.g. mach_port_t) -// to avoid pulling in large OS header files into this header file. Instead, -// the users of these routines are expected to include the respecitve OS -// headers in addition to this one. -#if V8_OS_DARWIN -// Convert between a shared memory handle and a mach_port_t referencing a memory -// entry object. -inline PlatformSharedMemoryHandle SharedMemoryHandleFromMachMemoryEntry( - unsigned int port) { - return static_cast(port); -} -inline unsigned int MachMemoryEntryFromSharedMemoryHandle( - PlatformSharedMemoryHandle handle) { - return static_cast(handle); -} -#elif V8_OS_FUCHSIA -// Convert between a shared memory handle and a zx_handle_t to a VMO. -inline PlatformSharedMemoryHandle SharedMemoryHandleFromVMO(uint32_t handle) { - return static_cast(handle); -} -inline uint32_t VMOFromSharedMemoryHandle(PlatformSharedMemoryHandle handle) { - return static_cast(handle); -} -#elif V8_OS_WIN -// Convert between a shared memory handle and a Windows HANDLE to a file mapping -// object. -inline PlatformSharedMemoryHandle SharedMemoryHandleFromFileMapping( - void* handle) { - return reinterpret_cast(handle); -} -inline void* FileMappingFromSharedMemoryHandle( - PlatformSharedMemoryHandle handle) { - return reinterpret_cast(handle); -} -#else -// Convert between a shared memory handle and a file descriptor. -inline PlatformSharedMemoryHandle SharedMemoryHandleFromFileDescriptor(int fd) { - return static_cast(fd); -} -inline int FileDescriptorFromSharedMemoryHandle( - PlatformSharedMemoryHandle handle) { - return static_cast(handle); -} -#endif - /** * Possible permissions for memory pages. */ @@ -970,7 +1013,16 @@ class VirtualAddressSpace { */ virtual V8_WARN_UNUSED_RESULT Address AllocateSharedPages(Address hint, size_t size, PagePermissions permissions, - PlatformSharedMemoryHandle handle, uint64_t offset) = 0; + SharedMemoryHandle handle, uint64_t offset) = 0; + + // TODO(https://crbug.com/463925491): Remove me once API users change from + // PlatformSharedMemoryHandle to SharedMemoryHandle. + V8_DEPRECATE_SOON("Use AllocateSharedPages() with SharedMemoryHandle") + V8_WARN_UNUSED_RESULT Address AllocateSharedPages( + Address hint, size_t size, PagePermissions permissions, + std::optional handle, uint64_t offset) { + return AllocateSharedPages(hint, size, permissions, *handle, offset); + } /** * Frees previously allocated shared pages. @@ -1048,7 +1100,7 @@ class VirtualAddressSpace { Address hint, size_t size, size_t alignment, PagePermissions max_page_permissions, std::optional key = std::nullopt, - PlatformSharedMemoryHandle handle = kInvalidSharedMemoryHandle) = 0; + std::optional handle = std::nullopt) = 0; // // TODO(v8) maybe refactor the methods below before stabilizing the API. For @@ -1343,6 +1395,14 @@ class Platform { return CreateJobImpl(priority, std::move(job_task), location); } + /** + * Instantiates a ScopedBoostablePriority to boost a thread's priority. + */ + virtual std::unique_ptr + CreateBoostablePriorityScope() { + return nullptr; + } + /** * Instantiates a ScopedBlockingCall to annotate a scope that may/will block. */ diff --git a/deps/v8/include/v8-primitive.h b/deps/v8/include/v8-primitive.h index 87215cf6ece31d..457a8838461faa 100644 --- a/deps/v8/include/v8-primitive.h +++ b/deps/v8/include/v8-primitive.h @@ -199,7 +199,7 @@ class V8_EXPORT String : public Name { * the end of the buffer. If null termination is requested, the output buffer * will always be null terminated even if not all characters fit. In that * case, the capacity must be at least one. The required size of the output - * buffer can be determined using Utf8Length(). + * buffer can be determined using Utf8LengthV2(). * * \param buffer The buffer into which the string will be written. * \param capacity The number of bytes available in the output buffer. diff --git a/deps/v8/include/v8-profiler.h b/deps/v8/include/v8-profiler.h index 61f427ea47c691..7e2d0933e92e68 100644 --- a/deps/v8/include/v8-profiler.h +++ b/deps/v8/include/v8-profiler.h @@ -48,6 +48,21 @@ template class V8_EXPORT std::vector; namespace v8 { +/** + * Identifies which component initiated CPU profiling for proper attribution. + */ +enum class CpuProfileSource : uint8_t { + /** Default value when no explicit source is specified. */ + kUnspecified = 0, + /** Profiling initiated via the DevTools Inspector protocol. */ + kInspector = 1, + /** Profiling initiated by the embedder (e.g., Blink) via self-profiling API. + */ + kSelfProfiling = 2, + /** Profiling initiated internally by V8 (e.g., tracing CPU profiler). */ + kInternal = 3, +}; + struct V8_EXPORT CpuProfileDeoptInfo { /** A pointer to a static string owned by v8. */ const char* deopt_reason; @@ -378,11 +393,13 @@ class V8_EXPORT CpuProfilingOptions { * the profiler's sampling interval. * \param filter_context If specified, profiles will only contain frames * using this context. Other frames will be elided. + * \param profile_source Identifies the source of this CPU profile. */ CpuProfilingOptions( CpuProfilingMode mode = kLeafNodeLineNumbers, unsigned max_samples = kNoSampleLimit, int sampling_interval_us = 0, - MaybeLocal filter_context = MaybeLocal()); + MaybeLocal filter_context = MaybeLocal(), + CpuProfileSource profile_source = CpuProfileSource::kUnspecified); CpuProfilingOptions(CpuProfilingOptions&&) = default; CpuProfilingOptions& operator=(CpuProfilingOptions&&) = default; @@ -390,6 +407,7 @@ class V8_EXPORT CpuProfilingOptions { CpuProfilingMode mode() const { return mode_; } unsigned max_samples() const { return max_samples_; } int sampling_interval_us() const { return sampling_interval_us_; } + CpuProfileSource profile_source() const { return profile_source_; } private: friend class internal::CpuProfile; @@ -401,6 +419,7 @@ class V8_EXPORT CpuProfilingOptions { unsigned max_samples_; int sampling_interval_us_; Global filter_context_; + CpuProfileSource profile_source_; }; /** @@ -1113,7 +1132,7 @@ class V8_EXPORT HeapProfiler { /** * The resolver used by the snapshot generator to get names for V8 objects. */ - V8_DEPRECATE_SOON("Use context_name_resolver callback instead.") + V8_DEPRECATED("Use context_name_resolver callback instead.") ObjectNameResolver* global_object_name_resolver = nullptr; /** * The resolver used by the snapshot generator to get names for v8::Context @@ -1151,7 +1170,7 @@ class V8_EXPORT HeapProfiler { * * \returns the snapshot. */ - V8_DEPRECATE_SOON("Use overload with ContextNameResolver* resolver instead.") + V8_DEPRECATED("Use overload with ContextNameResolver* resolver instead.") const HeapSnapshot* TakeHeapSnapshot( ActivityControl* control, ObjectNameResolver* global_object_name_resolver, bool hide_internals = true, bool capture_numeric_value = false); diff --git a/deps/v8/include/v8-promise.h b/deps/v8/include/v8-promise.h index 8c127c8122a2ec..36412c774d1b51 100644 --- a/deps/v8/include/v8-promise.h +++ b/deps/v8/include/v8-promise.h @@ -19,7 +19,7 @@ class Context; #endif /** - * An instance of the built-in Promise constructor (ES6 draft). + * An instance of the built-in Promise constructor. */ class V8_EXPORT Promise : public Object { public: @@ -65,10 +65,21 @@ class V8_EXPORT Promise : public Object { }; /** - * Register a resolution/rejection handler with a promise. - * The handler is given the respective resolution/rejection value as - * an argument. If the promise is already resolved/rejected, the handler is - * invoked at the end of turn. + * Register a resolution/rejection handler with a promise. The handler is + * given the respective resolution/rejection value as an argument. If the + * promise is already resolved/rejected, the handler is invoked at the end of + * turn. + * + * This performs the PerformPromiseThen abstract operation with a fresh native + * promise as result, rather than the similar Promise.prototype.then + * operation. In particular, it does not do species lookup on the Promise + * constructor, and is therefore guaranteed to return a Promise. + * + * https://tc39.es/ecma262/#sec-performpromisethen + * + * This is consistent with Promise reactions in WebIDL: + * + * https://webidl.spec.whatwg.org/#dfn-perform-steps-once-promise-is-settled */ V8_WARN_UNUSED_RESULT MaybeLocal Catch(Local context, Local handler); diff --git a/deps/v8/include/v8-sandbox.h b/deps/v8/include/v8-sandbox.h index 06d01761798582..185bcbaccc3e69 100644 --- a/deps/v8/include/v8-sandbox.h +++ b/deps/v8/include/v8-sandbox.h @@ -62,41 +62,7 @@ enum class CppHeapPointerTag : uint16_t { kLastTag = 0x7fff, }; -// Convenience struct to represent tag ranges. This is used for type checks -// against supertypes, which cover a range of types (their subtypes). -// Both the lower- and the upper bound are inclusive. In other words, this -// struct represents the range [lower_bound, upper_bound]. -// TODO(saelo): reuse internal::TagRange here. -struct CppHeapPointerTagRange { - constexpr CppHeapPointerTagRange(CppHeapPointerTag lower, - CppHeapPointerTag upper) - : lower_bound(lower), upper_bound(upper) {} - CppHeapPointerTag lower_bound; - CppHeapPointerTag upper_bound; - - // Check whether the tag of the given CppHeapPointerTable entry is within - // this range. This method encodes implementation details of the - // CppHeapPointerTable, which is necessary as it is used by - // ReadCppHeapPointerField below. - // Returns true if the check is successful and the tag of the given entry is - // within this range, false otherwise. - bool CheckTagOf(uint64_t entry) { - // Note: the cast to uint32_t is important here. Otherwise, the uint16_t's - // would be promoted to int in the range check below, which would result in - // undefined behavior (signed integer undeflow) if the actual value is less - // than the lower bound. Then, the compiler would take advantage of the - // undefined behavior and turn the range check into a simple - // `actual_tag <= last_tag` comparison, which is incorrect. - uint32_t actual_tag = static_cast(entry); - // The actual_tag is shifted to the left by one and contains the marking - // bit in the LSB. To ignore that during the type check, simply add one to - // the (shifted) range. - constexpr int kTagShift = internal::kCppHeapPointerTagShift; - uint32_t first_tag = static_cast(lower_bound) << kTagShift; - uint32_t last_tag = (static_cast(upper_bound) << kTagShift) + 1; - return actual_tag >= first_tag && actual_tag <= last_tag; - } -}; +using CppHeapPointerTagRange = internal::TagRange; constexpr CppHeapPointerTagRange kAnyCppHeapPointer( CppHeapPointerTag::kFirstTag, CppHeapPointerTag::kLastTag); @@ -142,9 +108,12 @@ template V8_INLINE static T* ReadCppHeapPointerField(v8::Isolate* isolate, Address heap_object_ptr, int offset, CppHeapPointerTagRange tag_range) { + // This is a specialized version of the the CppHeapPointerTable accessors + // which (1) allows the code to be inlined into the callers for performance + // and (2) is optimized for code size as there are a huge number of callers + // from auto-generated bindings code. + #ifdef V8_COMPRESS_POINTERS - // See src/sandbox/cppheap-pointer-table-inl.h. Logic duplicated here so - // it can be inlined and doesn't require an additional call. const CppHeapPointerHandle handle = Internals::ReadRawField(heap_object_ptr, offset); const uint32_t index = handle >> kExternalPointerIndexShift; @@ -153,9 +122,21 @@ V8_INLINE static T* ReadCppHeapPointerField(v8::Isolate* isolate, reinterpret_cast*>(&table[index]); Address entry = std::atomic_load_explicit(ptr, std::memory_order_relaxed); - Address pointer = entry; - if (V8_LIKELY(tag_range.CheckTagOf(entry))) { - pointer = entry >> kCppHeapPointerPayloadShift; + // Note: the cast to uint32_t is important here. Otherwise, the uint16_t's + // would be promoted to int in the range check below, which would result in + // undefined behavior (signed integer underflow) if the actual value is less + // than the lower bound. Then, the compiler would take advantage of the + // undefined behavior and turn the range check into a simple + // `actual_tag <= last_tag` comparison, which is incorrect. + uint32_t actual_tag = static_cast(entry); + // The actual_tag is shifted to the left by one and contains the marking + // bit in the LSB. To ignore that during the type check, simply add one to + // the (shifted) range. + constexpr int kTagShift = internal::kCppHeapPointerTagShift; + uint32_t first_tag = static_cast(tag_range.first) << kTagShift; + uint32_t last_tag = (static_cast(tag_range.last) << kTagShift) + 1; + if (V8_LIKELY(actual_tag >= first_tag && actual_tag <= last_tag)) { + entry = entry >> kCppHeapPointerPayloadShift; } else { // If the type check failed, we simply return nullptr here. That way: // 1. The null handle always results in nullptr being returned here, which @@ -174,15 +155,25 @@ V8_INLINE static T* ReadCppHeapPointerField(v8::Isolate* isolate, // between returning nullptr or the original entry, since it will // simply compile to a `csel x0, x8, xzr, lo` instead of a // `csel x0, x10, x8, lo` instruction. - pointer = 0; + // 3. The machine code sequence ends up being pretty short, which is + // important here as this code will be inlined into a lot of functions. + entry = 0; } - return reinterpret_cast(pointer); + return reinterpret_cast(entry); #else // !V8_COMPRESS_POINTERS return reinterpret_cast( Internals::ReadRawField
(heap_object_ptr, offset)); #endif // !V8_COMPRESS_POINTERS } +// TODO(saelo): temporary workaround needed to introduce range-based type +// checks for the external pointer table. See comment above +// ExternalPointerCanBeEmpty(ExternalPointerTagRange) function for details. +V8_INLINE static constexpr bool ExternalPointerCanBeEmpty( + CppHeapPointerTagRange tag_range) { + return true; +} + } // namespace internal } // namespace v8 diff --git a/deps/v8/include/v8-script.h b/deps/v8/include/v8-script.h index debe89b50847ea..c07d95515e842f 100644 --- a/deps/v8/include/v8-script.h +++ b/deps/v8/include/v8-script.h @@ -187,6 +187,13 @@ class V8_EXPORT Module : public Data { kErrored }; + /** + * If the module is a Source Text Module, returns the name that was passed + * by the embedder as resource_name to the ScriptOrigin. If it's a Synthetic + * Module, returns the module_name passed to CreateSyntheticModule(). + */ + Local GetResourceName() const; + /** * Returns the module's current status. */ diff --git a/deps/v8/include/v8-source-location.h b/deps/v8/include/v8-source-location.h index 268e3e679aad59..057273ad8ef44e 100644 --- a/deps/v8/include/v8-source-location.h +++ b/deps/v8/include/v8-source-location.h @@ -22,7 +22,7 @@ namespace v8 { class V8_EXPORT SourceLocation final { public: /** - * Construct source location information corresponding to the location of the + * Constructs source location information corresponding to the location of the * call site. */ static constexpr SourceLocation Current( @@ -70,13 +70,14 @@ class V8_EXPORT SourceLocation final { * * \returns a human-readable string representing source location information. */ - std::string ToString() const { - if (loc_.line() == 0) { - return {}; - } - return std::string(loc_.function_name()) + "@" + loc_.file_name() + ":" + - std::to_string(loc_.line()); - } + std::string ToString() const; + + /** + * Checks whether this object is initialized. + * + * \returns true if this object is initialized, false otherwise. + */ + operator bool() const { return loc_.line() != 0; } private: constexpr explicit SourceLocation(const std::source_location& loc) diff --git a/deps/v8/include/v8-template.h b/deps/v8/include/v8-template.h index 3eff0105f18a86..6eaf6508445218 100644 --- a/deps/v8/include/v8-template.h +++ b/deps/v8/include/v8-template.h @@ -139,7 +139,7 @@ class V8_EXPORT Template : public Data { enum class Intercepted : uint8_t { kNo = 0, kYes = 1 }; /** - * Interceptor for get requests on an object. + * Interceptor for [[Get]] requests on an object. * * If the interceptor handles the request (i.e. the property should not be * looked up beyond the interceptor or in case an exception was thrown) it @@ -153,8 +153,8 @@ enum class Intercepted : uint8_t { kNo = 0, kYes = 1 }; * \param property The name of the property for which the request was * intercepted. * \param info Information about the intercepted request, such as - * isolate, receiver, return value, or whether running in `'use strict'` mode. - * See `PropertyCallbackInfo`. + * isolate, object holding the property, return value. See + * `PropertyCallbackInfo`. * * \code * Intercepted GetterCallback( @@ -183,17 +183,20 @@ enum class Intercepted : uint8_t { kNo = 0, kYes = 1 }; */ using NamedPropertyGetterCallback = Intercepted (*)( Local property, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using GenericNamedPropertyGetterCallback V8_DEPRECATED( - "Use NamedPropertyGetterCallback instead") = - void (*)(Local property, const PropertyCallbackInfo& info); /** - * Interceptor for set requests on an object. + * Interceptor for [[Set]] requests on an object. * * If the interceptor handles the request (i.e. the property should not be * looked up beyond the interceptor or in case an exception was thrown) it - * should return `Intercepted::kYes`. + * should + * - use `info.GetReturnValue().Set(false)` to indicate that the operation + * failed, + * - (optionally) upon operation failure and info.ShouldThrowOnError() + * is true (indicating execution in `'use strict'` mode) the callback can + * throw TypeError if the error message needs to include more details than + * a TypeError thrown by V8 in this case, + * - return `Intercepted::kYes`. * If the interceptor does not handle the request it must return * `Intercepted::kNo` and it must not produce side effects. * @@ -202,24 +205,19 @@ using GenericNamedPropertyGetterCallback V8_DEPRECATED( * \param value The value which the property will have if the request * is not intercepted. * \param info Information about the intercepted request, such as - * isolate, receiver, return value, or whether running in `'use strict'` mode. - * See `PropertyCallbackInfo`. + * isolate, object holding the property, return value, or whether running in + * `'use strict'` mode. See `PropertyCallbackInfo`. * * See also `ObjectTemplate::SetHandler.` */ using NamedPropertySetterCallback = Intercepted (*)(Local property, Local value, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using GenericNamedPropertySetterCallback V8_DEPRECATED( - "Use NamedPropertySetterCallback instead") = - void (*)(Local property, Local value, - const PropertyCallbackInfo& info); /** - * Intercepts all requests that query the attributes of the - * property, e.g., getOwnPropertyDescriptor(), propertyIsEnumerable(), and - * defineProperty(). + * Intercepts all requests that query the attributes of the property, + * e.g. [[GetOwnProperty]], [[DefineOwnProperty]], [[Set]] and derived ones + * like Object.prototype.propertyIsEnumerable() and similar. * * If the interceptor handles the request (i.e. the property should not be * looked up beyond the interceptor or in case an exception was thrown) it @@ -244,19 +242,19 @@ using GenericNamedPropertySetterCallback V8_DEPRECATED( */ using NamedPropertyQueryCallback = Intercepted (*)( Local property, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using GenericNamedPropertyQueryCallback V8_DEPRECATED( - "Use NamedPropertyQueryCallback instead") = - void (*)(Local property, const PropertyCallbackInfo& info); /** - * Interceptor for delete requests on an object. + * Interceptor for [[Delete]] requests on an object. * * If the interceptor handles the request (i.e. the property should not be * looked up beyond the interceptor or in case an exception was thrown) it * should - * - (optionally) use `info.GetReturnValue().Set()` to set to a Boolean value - * indicating whether the property deletion was successful or not, + * - use `info.GetReturnValue().Set(false)` to indicate that the operation + * failed, + * - (optionally) upon operation failure and info.ShouldThrowOnError() + * is true (indicating execution in `'use strict'` mode) the callback can + * throw TypeError if the error message needs to include more details than + * a TypeError thrown by V8 in this case, * - return `Intercepted::kYes`. * If the interceptor does not handle the request it must return * `Intercepted::kNo` and it must not produce side effects. @@ -264,21 +262,13 @@ using GenericNamedPropertyQueryCallback V8_DEPRECATED( * \param property The name of the property for which the request was * intercepted. * \param info Information about the intercepted request, such as - * isolate, receiver, return value, or whether running in `'use strict'` mode. - * See `PropertyCallbackInfo`. - * - * \note If you need to mimic the behavior of `delete`, i.e., throw in strict - * mode instead of returning false, use `info.ShouldThrowOnError()` to determine - * if you are in strict mode. + * isolate, object holding the property, return value, or whether running in + * `'use strict'` mode. See `PropertyCallbackInfo`. * * See also `ObjectTemplate::SetHandler.` */ using NamedPropertyDeleterCallback = Intercepted (*)( Local property, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using GenericNamedPropertyDeleterCallback V8_DEPRECATED( - "Use NamedPropertyDeleterCallback instead") = - void (*)(Local property, const PropertyCallbackInfo& info); /** * Returns an array containing the names of the properties the named @@ -288,18 +278,20 @@ using GenericNamedPropertyDeleterCallback V8_DEPRECATED( */ using NamedPropertyEnumeratorCallback = void (*)(const PropertyCallbackInfo& info); -// This variant will be deleted soon. -// This is just a renaming of the typedef. -using GenericNamedPropertyEnumeratorCallback V8_DEPRECATED( - "Use NamedPropertyEnumeratorCallback instead") = - NamedPropertyEnumeratorCallback; /** - * Interceptor for defineProperty requests on an object. + * Interceptor for [[DefineOwnProperty]] requests on an object. * * If the interceptor handles the request (i.e. the property should not be * looked up beyond the interceptor or in case an exception was thrown) it - * should return `Intercepted::kYes`. + * should + * - use `info.GetReturnValue().Set(false)` to indicate that the operation + * failed, + * - (optionally) upon operation failure and info.ShouldThrowOnError() + * is true (indicating execution in `'use strict'` mode) the callback can + * throw TypeError if the error message needs to include more details than + * a TypeError thrown by V8 in this case, + * - return `Intercepted::kYes`. * If the interceptor does not handle the request it must return * `Intercepted::kNo` and it must not produce side effects. * @@ -308,22 +300,17 @@ using GenericNamedPropertyEnumeratorCallback V8_DEPRECATED( * \param desc The property descriptor which is used to define the * property if the request is not intercepted. * \param info Information about the intercepted request, such as - * isolate, receiver, return value, or whether running in `'use strict'` mode. - * See `PropertyCallbackInfo`. + * isolate, object holding the property, return value, or whether running in + * `'use strict'` mode. See `PropertyCallbackInfo`. * * See also `ObjectTemplate::SetHandler`. */ using NamedPropertyDefinerCallback = Intercepted (*)(Local property, const PropertyDescriptor& desc, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using GenericNamedPropertyDefinerCallback V8_DEPRECATED( - "Use NamedPropertyDefinerCallback instead") = - void (*)(Local property, const PropertyDescriptor& desc, - const PropertyCallbackInfo& info); /** - * Interceptor for getOwnPropertyDescriptor requests on an object. + * Interceptor for [[GetOwnProperty]] requests on an object. * * If the interceptor handles the request (i.e. the property should not be * looked up beyond the interceptor or in case an exception was thrown) it @@ -341,17 +328,10 @@ using GenericNamedPropertyDefinerCallback V8_DEPRECATED( * isolate, receiver, return value, or whether running in `'use strict'` mode. * See `PropertyCallbackInfo`. * - * \note If GetOwnPropertyDescriptor is intercepted, it will - * always return true, i.e., indicate that the property was found. - * * See also `ObjectTemplate::SetHandler`. */ using NamedPropertyDescriptorCallback = Intercepted (*)( Local property, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using GenericNamedPropertyDescriptorCallback V8_DEPRECATED( - "Use NamedPropertyDescriptorCallback instead") = - void (*)(Local property, const PropertyCallbackInfo& info); // TODO(ishell): Rename IndexedPropertyXxxCallbackV2 back to // IndexedPropertyXxxCallback once the old IndexedPropertyXxxCallback is @@ -362,41 +342,24 @@ using GenericNamedPropertyDescriptorCallback V8_DEPRECATED( */ using IndexedPropertyGetterCallbackV2 = Intercepted (*)(uint32_t index, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using IndexedPropertyGetterCallback V8_DEPRECATED( - "Use IndexedPropertyGetterCallbackV2 instead") = - void (*)(uint32_t index, const PropertyCallbackInfo& info); /** * See `v8::NamedPropertySetterCallback`. */ using IndexedPropertySetterCallbackV2 = Intercepted (*)( uint32_t index, Local value, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using IndexedPropertySetterCallback V8_DEPRECATED( - "Use IndexedPropertySetterCallbackV2 instead") = - void (*)(uint32_t index, Local value, - const PropertyCallbackInfo& info); /** * See `v8::NamedPropertyQueryCallback`. */ using IndexedPropertyQueryCallbackV2 = Intercepted (*)(uint32_t index, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using IndexedPropertyQueryCallback V8_DEPRECATED( - "Use IndexedPropertyQueryCallbackV2 instead") = - void (*)(uint32_t index, const PropertyCallbackInfo& info); /** * See `v8::NamedPropertyDeleterCallback`. */ using IndexedPropertyDeleterCallbackV2 = Intercepted (*)(uint32_t index, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using IndexedPropertyDeleterCallback V8_DEPRECATED( - "Use IndexedPropertyDeleterCallbackV2 instead") = - void (*)(uint32_t index, const PropertyCallbackInfo& info); /** * Returns an array containing the indices of the properties the indexed @@ -413,21 +376,12 @@ using IndexedPropertyEnumeratorCallback = using IndexedPropertyDefinerCallbackV2 = Intercepted (*)(uint32_t index, const PropertyDescriptor& desc, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using IndexedPropertyDefinerCallback V8_DEPRECATED( - "Use IndexedPropertyDefinerCallbackV2 instead") = - void (*)(uint32_t index, const PropertyDescriptor& desc, - const PropertyCallbackInfo& info); /** * See `v8::NamedPropertyDescriptorCallback`. */ using IndexedPropertyDescriptorCallbackV2 = Intercepted (*)(uint32_t index, const PropertyCallbackInfo& info); -// This variant will be deleted soon. -using IndexedPropertyDescriptorCallback V8_DEPRECATED( - "Use IndexedPropertyDescriptorCallbackV2 instead") = - void (*)(uint32_t index, const PropertyCallbackInfo& info); /** * Returns true if the given context should be allowed to access the given @@ -597,7 +551,7 @@ class V8_EXPORT FunctionTemplate : public Template { * API call, see the comment above the class declaration. */ void SetCallHandler( - FunctionCallback callback, Local data = Local(), + FunctionCallback callback, Local data = {}, SideEffectType side_effect_type = SideEffectType::kHasSideEffect, const MemorySpan& c_function_overloads = {}); diff --git a/deps/v8/include/v8-trace-categories.h b/deps/v8/include/v8-trace-categories.h index 9072cb45675620..777116a02904d5 100644 --- a/deps/v8/include/v8-trace-categories.h +++ b/deps/v8/include/v8-trace-categories.h @@ -5,11 +5,15 @@ #ifndef INCLUDE_V8_TRACE_CATEGORIES_H_ #define INCLUDE_V8_TRACE_CATEGORIES_H_ -#include "v8config.h" +#include "v8config.h" // NOLINT(build/include_directory) #if defined(V8_USE_PERFETTO) +#if defined(V8_USE_PERFETTO_SDK) +#include "perfetto.h" // NOLINT(build/include_directory) +#else #include "perfetto/tracing/track_event.h" +#endif namespace v8 { diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h index d81777e603c67e..fa8b626bfad1cf 100644 --- a/deps/v8/include/v8-version.h +++ b/deps/v8/include/v8-version.h @@ -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 14 -#define V8_MINOR_VERSION 3 -#define V8_BUILD_NUMBER 127 -#define V8_PATCH_LEVEL 18 +#define V8_MINOR_VERSION 5 +#define V8_BUILD_NUMBER 201 +#define V8_PATCH_LEVEL 7 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff --git a/deps/v8/include/v8-wasm.h b/deps/v8/include/v8-wasm.h index 5483421f40ff50..d1e888995a3970 100644 --- a/deps/v8/include/v8-wasm.h +++ b/deps/v8/include/v8-wasm.h @@ -8,6 +8,7 @@ #include #include #include +#include #include "v8-internal.h" // NOLINT(build/include_directory) #include "v8-local-handle.h" // NOLINT(build/include_directory) @@ -20,12 +21,9 @@ namespace v8 { class ArrayBuffer; class Promise; -namespace internal { -namespace wasm { +namespace internal::wasm { class NativeModule; -class StreamingDecoder; -} // namespace wasm -} // namespace internal +} // namespace internal::wasm /** * An owned byte buffer with associated size. @@ -38,8 +36,10 @@ struct OwnedBuffer { OwnedBuffer() = default; }; -// Wrapper around a compiled WebAssembly module, which is potentially shared by -// different WasmModuleObjects. +/** + * Wrapper around a compiled WebAssembly module, which is potentially shared by + * different WasmModuleObjects. + */ class V8_EXPORT CompiledWasmModule { public: /** @@ -56,11 +56,12 @@ class V8_EXPORT CompiledWasmModule { const std::string& source_url() const { return source_url_; } private: + friend class WasmModuleCompilation; friend class WasmModuleObject; friend class WasmStreaming; explicit CompiledWasmModule(std::shared_ptr, - const char* source_url, size_t url_length); + std::string source_url); const std::shared_ptr native_module_; const std::string source_url_; @@ -169,7 +170,7 @@ class V8_EXPORT WasmStreaming final { * If {can_use_compiled_module} is false, the compiled module bytes previously * set by {SetCompiledModuleBytes} should not be used. */ - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use the new variant of Finish which takes the caching callback argument") void Finish(bool can_use_compiled_module = true) { ModuleCachingCallback callback; @@ -188,7 +189,8 @@ class V8_EXPORT WasmStreaming final { * must not be called after {Abort} has been called already. * If {SetHasCompiledModuleBytes()} was called before, a {caching_callback} * can be passed which can inspect the full received wire bytes and set cached - * module bytes which will be deserialized then. + * module bytes which will be deserialized then. This callback will happen + * synchronously within this call; the callback is not stored. */ void Finish(const ModuleCachingCallback& caching_callback); @@ -209,7 +211,7 @@ class V8_EXPORT WasmStreaming final { * The compiled module bytes should not be used until {Finish(true)} is * called, because they can be invalidated later by {Finish(false)}. */ - V8_DEPRECATE_SOON( + V8_DEPRECATED( "Use SetHasCompiledModule in combination with the new variant of Finish") bool SetCompiledModuleBytes(const uint8_t* bytes, size_t size) { SetHasCompiledModuleBytes(); @@ -257,6 +259,87 @@ class V8_EXPORT WasmStreaming final { MemorySpan cached_compiled_module_bytes_; }; +/** + * An interface for asynchronous WebAssembly module compilation, to be used e.g. + * for implementing source phase imports. + * Note: This interface is experimental and can change or be removed without + * notice. + */ +class V8_EXPORT WasmModuleCompilation final { + public: + using ModuleCachingCallback = WasmStreaming::ModuleCachingCallback; + + /** + * Start an asynchronous module compilation. This can be called on any thread. + * TODO(clemensb): Add some way to pass enabled features. + * TODO(clemensb): Add some way to pass compile time imports. + */ + WasmModuleCompilation(); + + ~WasmModuleCompilation(); + + WasmModuleCompilation(const WasmModuleCompilation&) = delete; + WasmModuleCompilation& operator=(const WasmModuleCompilation&) = delete; + + /** + * Pass a new chunk of bytes to WebAssembly compilation. + * The buffer passed into {OnBytesReceived} is owned by the caller and will + * not be accessed any more after this call returns. + */ + void OnBytesReceived(const uint8_t* bytes, size_t size); + + /** + * {Finish} must be called on the main thread after all bytes were passed to + * {OnBytesReceived}. + * It eventually calls the provided callback to deliver the compiled module or + * an error. This callback will also be called in foreground, but not + * necessarily within this call. + * {Finish} must not be called after {Abort} has been called already. + * If {SetHasCompiledModuleBytes()} was called before, a {caching_callback} + * can be passed which can inspect the full received wire bytes and set cached + * module bytes which will be deserialized then. This callback will happen + * synchronously within this call; the callback is not stored. + */ + void Finish( + Isolate*, const ModuleCachingCallback& caching_callback, + const std::function, Local> module_or_error)>& + resolution_callback); + + /** + * Abort compilation. This can be called from any thread. + * {Abort} must not be called repeatedly, or after {Finish}. + */ + void Abort(); + + /** + * Mark that the embedder has (potentially) cached compiled module bytes (i.e. + * a serialized {CompiledWasmModule}) that could match this streaming request. + * This will cause V8 to skip streaming compilation. + * The embedder should then pass a callback to the {Finish} method to pass the + * serialized bytes, after potentially checking their validity against the + * full received wire bytes. + */ + void SetHasCompiledModuleBytes(); + + /** + * Sets a callback which is called whenever a significant number of new + * functions are ready for serialization. + */ + void SetMoreFunctionsCanBeSerializedCallback( + std::function); + + /* + * Sets the UTF-8 encoded source URL for the {Script} object. This must be + * called before {Finish}. + */ + void SetUrl(const char* url, size_t length); + + private: + class Impl; + const std::unique_ptr impl_; +}; + /** * The V8 interface for a WebAssembly memory map descriptor. This is an * experimental feature that may change and be removed without further diff --git a/deps/v8/include/v8config.h b/deps/v8/include/v8config.h index 6dbda2b1b40fce..06a515ae94da9f 100644 --- a/deps/v8/include/v8config.h +++ b/deps/v8/include/v8config.h @@ -1067,4 +1067,12 @@ arm64 host #define V8_TARGET_BIG_ENDIAN_BOOL false #endif +// V8_USE_PERFETTO_SDK and V8_USE_PERFETTO_JSON_EXPORT must imply +// V8_USE_PERFETTO. +#if (defined(V8_USE_PERFETTO_SDK) || defined(V8_USE_PERFETTO_JSON_EXPORT)) && \ + !defined(V8_USE_PERFETTO) +#error Inconsistent build configuration: To build the V8 with Perfetto \ +features, set V8_USE_PERFETTO as well. +#endif + #endif // V8CONFIG_H_ diff --git a/deps/v8/infra/mb/mb_config.pyl b/deps/v8/infra/mb/mb_config.pyl index 566b46fc3ff4e7..d17dbc64d596fd 100644 --- a/deps/v8/infra/mb/mb_config.pyl +++ b/deps/v8/infra/mb/mb_config.pyl @@ -164,7 +164,7 @@ 'V8 Clusterfuzz Linux ASAN no inline - release builder': 'release_x86_asan_symbolized_verify_heap_undefined_double', 'V8 Clusterfuzz Linux64 ASAN - debug builder': 'debug_x64_asan_undefined_double', - 'V8 Clusterfuzz Linux64 ASAN - undefined double - debug builder': 'debug_x64_asan_undefined_double', + 'V8 Clusterfuzz Linux64 ASAN - undefined double - debug builder': 'debug_x64_asan', 'V8 Clusterfuzz Linux ASAN - debug builder': 'debug_x86_asan_undefined_double', 'V8 Clusterfuzz Linux64 ASAN arm64 - debug builder': 'debug_simulate_arm64_asan_undefined_double', @@ -233,8 +233,6 @@ 'V8 Linux - ppc64 - sim - builder': 'release_simulate_ppc64', 'V8 Linux - s390x - sim - builder': 'release_simulate_s390x', # RISC-V - 'V8 Linux - riscv32 - sim - debug builder': 'debug_simulate_riscv32', - 'V8 Linux - riscv32 - sim - builder': 'release_simulate_riscv32', 'V8 Linux - riscv64 - sim - debug builder': 'debug_simulate_riscv64', 'V8 Linux - riscv64 - sim - builder': 'release_simulate_riscv64', 'V8 Linux - riscv64 - sim - pointer compression - builder': 'release_simulate_riscv64_pointer_compression', @@ -279,6 +277,7 @@ 'v8_linux64_disable_runtime_call_stats_compile_rel': 'release_x64_disable_runtime_call_stats', 'v8_linux64_css_compile_dbg': 'debug_x64_conservative_stack_scanning', 'v8_linux64_full_compile_dbg': 'full_debug_x64', + 'v8_linux64_fuzzilli_imports_compile_rel': 'release_x64', 'v8_linux64_gc_stress_custom_snapshot_compile_dbg': 'debug_x64_trybot_custom', 'v8_linux64_gc_stress_compile_dbg': 'debug_x64_trybot', 'v8_linux64_gcc_compile_dbg': 'debug_x64_gcc', @@ -311,8 +310,6 @@ 'v8_linux64_loong64_compile_rel': 'release_simulate_loong64', 'v8_linux64_lower_limits_compile_rel': 'release_x64_lower_limits', 'v8_linux64_msan_compile_rel': 'release_simulate_arm64_msan_minimal_symbols', - 'v8_linux_riscv32_compile_dbg': 'debug_simulate_riscv32', - 'v8_linux_riscv32_compile_rel': 'release_simulate_riscv32', 'v8_linux64_riscv64_compile_dbg': 'debug_simulate_riscv64', 'v8_linux64_riscv64_compile_rel': 'release_simulate_riscv64', 'v8_linux64_riscv64_pointer_compression_compile_rel': 'release_simulate_riscv64_pointer_compression', @@ -465,8 +462,6 @@ 'debug_simulate_arm64_asan_undefined_double': [ 'debug_bot', 'simulate_arm64', 'asan', 'lsan', 'v8_enable_undefined_double'], - 'debug_simulate_riscv32': [ - 'debug_bot', 'simulate_riscv32'], 'debug_simulate_riscv64': [ 'debug_bot', 'simulate_riscv64'], @@ -503,8 +498,6 @@ '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_riscv64_pointer_compression': [ @@ -597,8 +590,8 @@ 'release_bot', 'x64', 'asan', 'dcheck_always_on', 'v8_enable_slow_dchecks', 'v8_verify_heap', 'v8_enable_undefined_double'], 'release_x64_sandbox_testing_undefined_double': [ - 'release_bot', 'x64', 'symbolized', 'backtrace', 'v8_enable_memory_corruption_api', - 'v8_enable_undefined_double'], + 'release_bot', 'x64', 'symbolized', 'backtrace', 'trace_pc_guard', + 'v8_enable_memory_corruption_api', 'v8_enable_undefined_double'], 'release_x64_asan_sandbox_testing_undefined_double': [ 'release_bot', 'x64', 'asan', 'symbolized', 'v8_enable_memory_corruption_api', 'v8_enable_undefined_double'], @@ -689,6 +682,8 @@ # Debug configs for x64. 'debug_x64': [ 'debug_bot', 'x64'], + 'debug_x64_asan': [ + 'debug_bot', 'x64', 'asan', 'lsan'], 'debug_x64_asan_undefined_double': [ 'debug_bot', 'x64', 'asan', 'lsan', 'v8_enable_undefined_double'], 'debug_x64_asan_centipede': [ @@ -1031,10 +1026,6 @@ '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"', }, @@ -1052,6 +1043,11 @@ 'gn_args': 'v8_no_inline=true', }, + 'trace_pc_guard': { + 'gn_args': 'sanitizer_coverage_flags="trace-pc-guard" ' + 'v8_enable_partition_alloc=false', + }, + 'tsan': { 'mixins': ['v8_enable_test_features'], 'gn_args': 'is_tsan=true', diff --git a/deps/v8/infra/testing/builders.pyl b/deps/v8/infra/testing/builders.pyl index 1117068160c9f1..10bc7d0f237ed7 100644 --- a/deps/v8/infra/testing/builders.pyl +++ b/deps/v8/infra/testing/builders.pyl @@ -478,6 +478,20 @@ {'name': 'v8testing', 'variant': 'default', 'shards': 8}, ], }, + 'v8_linux64_fuzzilli_imports_rel': { + 'swarming_dimensions' : { + 'cpu': 'x86-64-avx2', + 'os': 'Ubuntu-22.04', + }, + 'tests': [ + { + 'name': 'test262', + 'variant': 'default', + 'shards': 2, + 'test_args': ['--exit-after-n-failures=0'], + }, + ], + }, 'v8_linux64_fuzzilli_rel': { 'swarming_dimensions' : { 'os': 'Ubuntu-22.04', @@ -962,28 +976,12 @@ }, ############################################################################## # Linux with RISC-V simulators - 'v8_linux_riscv32_dbg': { - 'swarming_dimensions': { - 'os': 'Ubuntu-22.04', - }, - 'tests': [ - {'name': 'v8testing', 'shards': 6}, - ], - }, - 'v8_linux_riscv32_rel': { - 'swarming_dimensions': { - 'os': 'Ubuntu-22.04', - }, - 'tests': [ - {'name': 'v8testing', 'shards': 3}, - ], - }, 'v8_linux64_riscv64_dbg': { 'swarming_dimensions': { 'os': 'Ubuntu-22.04', }, 'tests': [ - {'name': 'v8testing', 'shards': 6}, + {'name': 'v8testing', 'shards': 9}, ], }, 'v8_linux64_riscv64_rel': { @@ -991,7 +989,7 @@ 'os': 'Ubuntu-22.04', }, 'tests': [ - {'name': 'v8testing', 'shards': 3}, + {'name': 'v8testing', 'shards': 4}, ], }, 'v8_linux64_riscv64_pointer_compression_rel': { @@ -999,7 +997,7 @@ 'os': 'Ubuntu-22.04', }, 'tests': [ - {'name': 'v8testing', 'shards': 3}, + {'name': 'v8testing', 'shards': 4}, ], }, ############################################################################## @@ -1949,6 +1947,9 @@ 'cpu': 'x86-64', 'os': 'Ubuntu-22.04', }, + 'swarming_task_attrs': { + 'priority': 25, + }, 'tests': [ {'name': 'mjsunit', 'variant': 'default'}, ], @@ -1994,7 +1995,7 @@ 'os': 'Ubuntu-22.04', }, 'tests': [ - {'name': 'test262', 'shards': 7}, + {'name': 'test262', 'shards': 10}, {'name': 'v8testing', 'shards': 3}, {'name': 'v8testing', 'variant': 'extra', 'shards': 3}, {'name': 'v8testing', 'variant': 'slow_path', 'shards': 1}, @@ -2589,32 +2590,6 @@ {'name': 'v8testing', 'shards': 3}, ], }, - 'V8 Linux - riscv32 - sim - debug': { - 'swarming_dimensions': { - 'os': 'Ubuntu-22.04', - }, - 'swarming_task_attrs': { - 'expiration': 14400, - 'hard_timeout': 3600, - 'priority': 35, - }, - 'tests': [ - {'name': 'v8testing', 'shards': 6}, - ], - }, - 'V8 Linux - riscv32 - sim': { - 'swarming_dimensions': { - 'os': 'Ubuntu-22.04', - }, - 'swarming_task_attrs': { - 'expiration': 14400, - 'hard_timeout': 3600, - 'priority': 35, - }, - 'tests': [ - {'name': 'v8testing', 'shards': 3}, - ], - }, 'V8 Linux - riscv64 - sim - debug': { 'swarming_dimensions': { 'os': 'Ubuntu-22.04', diff --git a/deps/v8/src/DEPS b/deps/v8/src/DEPS index d6da189c53496c..a8f50cf542da9b 100644 --- a/deps/v8/src/DEPS +++ b/deps/v8/src/DEPS @@ -17,7 +17,7 @@ include_rules = [ "-src/flags/flags-impl.h", "-src/heap", "+src/heap/memory-chunk-constants.h", - "+src/heap/memory-chunk-metadata.h", + "+src/heap/base-page.h", "+src/heap/code-range.h", "+src/heap/read-only-spaces.h", "+src/heap/trusted-range.h", @@ -43,11 +43,11 @@ include_rules = [ "+src/heap/local-heap-inl.h", "+src/heap/pretenuring-handler-inl.h", # TODO(v8:10496): Don't expose memory chunk outside of heap/. - "+src/heap/mutable-page-metadata.h", - "+src/heap/mutable-page-metadata-inl.h", + "+src/heap/mutable-page.h", + "+src/heap/mutable-page-inl.h", "+src/heap/memory-chunk.h", - "+src/heap/page-metadata-inl.h", "+src/heap/memory-pool.h", + "+src/heap/normal-page-inl.h", "+src/heap/paged-spaces-inl.h", "+src/heap/parked-scope-inl.h", "+src/heap/parked-scope.h", diff --git a/deps/v8/src/api/api-arguments-inl.h b/deps/v8/src/api/api-arguments-inl.h index 2f9c0faab2ee33..15cfc1b43b58a0 100644 --- a/deps/v8/src/api/api-arguments-inl.h +++ b/deps/v8/src/api/api-arguments-inl.h @@ -19,34 +19,44 @@ namespace v8 { namespace internal { -CustomArgumentsBase::CustomArgumentsBase(Isolate* isolate) - : Relocatable(isolate) {} - -template -CustomArguments::~CustomArguments() { - slot_at(kReturnValueIndex).store(Tagged(kHandleZapValue)); -} - template -template -Handle CustomArguments::GetReturnValue(Isolate* isolate) const { +Handle PropertyCallbackArguments::GetReturnValue() const { // Check the ReturnValue. FullObjectSlot slot = slot_at(kReturnValueIndex); DCHECK(Is(*slot)); - return Cast(Handle(slot.location())); + return Cast(Handle(slot.location())); +} + +bool PropertyCallbackArguments::is_named() const { + int frame_type = Smi::ToInt(Tagged(values_[T::kFrameTypeIndex])); + DCHECK(frame_type == StackFrame::API_NAMED_ACCESSOR_EXIT || + frame_type == StackFrame::API_INDEXED_ACCESSOR_EXIT); + return frame_type == StackFrame::API_NAMED_ACCESSOR_EXIT; } -inline Tagged PropertyCallbackArguments::holder() const { - return Cast(*slot_at(T::kHolderIndex)); +void PropertyCallbackArguments::set_property_key(Tagged name) { + values_[T::kPropertyKeyIndex] = name->ptr(); + values_[T::kFrameTypeIndex] = + Smi::FromInt(StackFrame::API_NAMED_ACCESSOR_EXIT).ptr(); } -inline Tagged PropertyCallbackArguments::receiver() const { - return *slot_at(T::kThisIndex); +void PropertyCallbackArguments::set_property_key(uint32_t index) { + values_[T::kPropertyKeyIndex] = index; + values_[T::kFrameTypeIndex] = + Smi::FromInt(StackFrame::API_INDEXED_ACCESSOR_EXIT).ptr(); +} + +DirectHandle PropertyCallbackArguments::holder() const { + return DirectHandle::FromSlot(slot_at(T::kHolderIndex).location()); +} + +DirectHandle PropertyCallbackArguments::receiver() const { + return DirectHandle::FromSlot(slot_at(T::kThisIndex).location()); } #define DCHECK_NAME_COMPATIBLE(interceptor, name) \ DCHECK(interceptor->is_named()); \ - DCHECK(!name->IsPrivate()); \ + DCHECK(!name->IsAnyPrivate()); \ DCHECK_IMPLIES(IsSymbol(*name), interceptor->can_intercept_symbols()); #define PREPARE_CALLBACK_INFO_ACCESSOR(ISOLATE, F, API_RETURN_TYPE, \ @@ -74,9 +84,83 @@ inline Tagged PropertyCallbackArguments::receiver() const { ExternalCallbackScope call_scope(ISOLATE, FUNCTION_ADDR(F), \ EXCEPTION_CONTEXT, &callback_info); -DirectHandle FunctionCallbackArguments::CallOrConstruct( - Tagged function, bool is_construct) { - Isolate* isolate = this->isolate(); +template +FunctionCallbackArguments::FunctionCallbackArguments( + Isolate* isolate, Tagged target, + Tagged receiver, const base::Vector args) + : Relocatable(isolate) { + Initialize(isolate, target, Smi::zero(), receiver, args); +} + +template +FunctionCallbackArguments::FunctionCallbackArguments( + Isolate* isolate, Tagged target, + Tagged new_target, Tagged receiver, + const base::Vector args) + : Relocatable(isolate) { + Initialize(isolate, target, new_target, receiver, args); +} + +template + requires(std::is_same_v> || + std::is_same_v) +void FunctionCallbackArguments::Initialize( + Isolate* isolate, Tagged target, + Tagged new_target, Tagged receiver, + const base::Vector args) { + uint32_t argc = static_cast(args.size()); + values_.resize(argc + T::kArgsLength + T::kOptionalArgsLength); + + Address* values = &values_.data()[T::kOptionalArgsLength]; + + // Initialize frame part. + values[T::kNewTargetIndex] = is_construct ? new_target.ptr() : 0; + values[T::kArgcIndex] = argc; + values[T::kFrameTypeIndex] = + Smi::FromInt(is_construct ? StackFrame::API_CONSTRUCT_EXIT + : StackFrame::API_CALLBACK_EXIT) + .ptr(); + + if (DEBUG_BOOL) { + // These values are not supposed to be looked at. + values[T::kFrameSPIndex] = kZapValue; + values[T::kFrameConstantPoolIndex] = kZapValue; + values[T::kFrameFPIndex] = kZapValue; + values[T::kFramePCIndex] = kZapValue; + } + + // Initialize Api arguments part. + values[T::kTargetIndex] = target.ptr(); + values[T::kIsolateIndex] = reinterpret_cast
(isolate); + values[T::kReturnValueIndex] = ReadOnlyRoots(isolate).undefined_value().ptr(); + values[T::kContextIndex] = isolate->context().ptr(); + + // Make sure the Isolate slot is safe to visit by GC (Isolate pointer + // is guaranteed to be page aligned). + DCHECK(HAS_SMI_TAG(values[T::kIsolateIndex])); + + // Initialize JS arguments part. + values[T::kReceiverIndex] = receiver.ptr(); + for (uint32_t i = 0; i < argc; ++i) { + if constexpr (std::is_same_v) { + values[T::kFirstJSArgumentIndex + i] = args[i]; + } else { + values[T::kFirstJSArgumentIndex + i] = (*args[i]).ptr(); + } + } +} + +FunctionCallbackArguments::~FunctionCallbackArguments() { + if (DEBUG_BOOL) { + // Make sure the result handle located inside this structure is not used + // after this object dies. + values_.data()[T::kReturnValueIndex] = kZapValue; + } +} + +Tagged FunctionCallbackArguments::CallOrConstruct( + Isolate* isolate, Tagged function, + bool is_construct) { RCS_SCOPE(isolate, RuntimeCallCounterId::kFunctionCallback); v8::FunctionCallback f = reinterpret_cast(function->callback(isolate)); @@ -85,30 +169,104 @@ DirectHandle FunctionCallbackArguments::CallOrConstruct( handle(function, isolate))) { return {}; } - FunctionCallbackInfo info(values_, argv_, argc_); + // v8::FunctionCallbackInfo structure might start at different positions in + // values_ array depending on whether it's a construct call or not. + auto info = + reinterpret_cast*>(slot_at(0).location()); ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f), is_construct ? ExceptionContext::kConstructor : ExceptionContext::kOperation, - &info); - f(info); - return GetReturnValue(isolate); + info); + f(*info); + + Tagged result = *slot_at(T::kReturnValueIndex); + DCHECK(Is(result)); + return Cast(result); +} + +PropertyCallbackArguments::PropertyCallbackArguments(Isolate* isolate, + Tagged receiver, + Tagged holder) + : Relocatable(isolate) +#ifdef DEBUG + , + is_setter_definer_deleter_(false), + javascript_execution_counter_(isolate->javascript_execution_counter()) +#endif // DEBUG +{ + Initialize(isolate, receiver, holder); +} + +PropertyCallbackArguments::PropertyCallbackArguments( + Isolate* isolate, Tagged receiver, Tagged holder, + Maybe should_throw) + : Relocatable(isolate) +#ifdef DEBUG + , + is_setter_definer_deleter_(true), + javascript_execution_counter_(isolate->javascript_execution_counter()) +#endif // DEBUG +{ + Initialize(isolate, receiver, holder); + + int value = Internals::kInferShouldThrowMode; + if (should_throw.IsJust()) { + value = should_throw.FromJust(); + } + slot_at(T::kShouldThrowOnErrorIndex).store(Smi::FromInt(value)); +} + +void PropertyCallbackArguments::Initialize(Isolate* isolate, + Tagged self, + Tagged holder) { + if (DEBUG_BOOL) { + // Zap these fields to ensure that they are initialized by a subsequent + // CallXXX(..). + values_[T::kFrameSPIndex] = kZapValue; + values_[T::kFrameConstantPoolIndex] = kZapValue; + values_[T::kFrameTypeIndex] = kZapValue; + values_[T::kFrameFPIndex] = kZapValue; + values_[T::kFramePCIndex] = kZapValue; + + values_[T::kPropertyKeyIndex] = kZapValue; + values_[T::kReturnValueIndex] = kZapValue; + values_[T::kCallbackInfoIndex] = kZapValue; + // This field is used only for setter/definer/deleter callbacks. + values_[T::kShouldThrowOnErrorIndex] = kZapValue; + } + values_[T::kIsolateIndex] = reinterpret_cast
(isolate); + + static_assert(T::kHolderIndex == T::kUnusedIndex || + T::kHolderIndex == (T::kUnusedIndex + 1)); + if (T::kHolderIndex != T::kUnusedIndex) { + // If there's an unused slot, initialize it to zero to let GC safely + // visit it. + values_[T::kUnusedIndex] = 0; + } + values_[T::kHolderIndex] = holder.ptr(); + DCHECK(!IsJSGlobalObject(*holder)); + values_[T::kThisIndex] = self.ptr(); + + // Make sure the Isolate slot is safe to visit by GC (Isolate pointer + // is guaranteed to be page aligned). + DCHECK(HAS_SMI_TAG(values_[T::kIsolateIndex])); } -PropertyCallbackArguments::~PropertyCallbackArguments(){ +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"); -// } + // TODO(chromium:1310062): enable this check. + // if (javascript_execution_counter_) { + // CHECK_WITH_MSG(javascript_execution_counter_ == + // isolate()->javascript_execution_counter(), + // "Unexpected side effect detected"); + // } + values_[T::kReturnValueIndex] = kZapValue; #endif // DEBUG } Maybe PropertyCallbackArguments::GetBooleanReturnValue( - v8::Intercepted intercepted, const char* callback_kind_for_error_message, - bool ignore_return_value) { - Isolate* isolate = this->isolate(); + Isolate* isolate, v8::Intercepted intercepted, + const char* callback_kind_for_error_message, bool ignore_return_value) { if (isolate->has_exception()) { // TODO(ishell, 328490288): fix Node.js which has Setter/Definer // interceptor callbacks not returning v8::Intercepted::kYes on exceptions. @@ -131,16 +289,7 @@ Maybe PropertyCallbackArguments::GetBooleanReturnValue( if (ignore_return_value) return Just(InterceptorResult::kTrue); - bool result = IsTrue(*GetReturnValue(isolate), isolate); - - // TODO(ishell, 348688196): ensure callbacks comply with this and - // enable the check. - if ((false) && DEBUG_BOOL && !result && ShouldThrowOnError()) { - FATAL( - "Check failed: %s interceptor callback hasn't thrown an " - "exception on failure as requested.", - callback_kind_for_error_message); - } + bool result = IsTrue(*GetReturnValue(), isolate); return Just(result ? InterceptorResult::kTrue : InterceptorResult::kFalse); } @@ -149,19 +298,22 @@ Maybe PropertyCallbackArguments::GetBooleanReturnValue( DirectHandle PropertyCallbackArguments::CallNamedEnumerator( - DirectHandle interceptor) { + Isolate* isolate, DirectHandle interceptor) { + DCHECK(!is_setter_definer_deleter_); DCHECK(interceptor->is_named()); - RCS_SCOPE(isolate(), RuntimeCallCounterId::kNamedEnumeratorCallback); - return CallPropertyEnumerator(interceptor); + RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedEnumeratorCallback); + return CallPropertyEnumerator(isolate, interceptor); } // TODO(ishell): return std::optional. DirectHandle PropertyCallbackArguments::CallNamedQuery( - DirectHandle interceptor, DirectHandle name) { + Isolate* isolate, DirectHandle interceptor, + DirectHandle name) { + DCHECK(!is_setter_definer_deleter_); DCHECK_NAME_COMPATIBLE(interceptor, name); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedQueryCallback); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(Smi::FromInt(v8::None)); NamedPropertyQueryCallback f = reinterpret_cast( interceptor->named_query(isolate)); @@ -169,15 +321,17 @@ DirectHandle PropertyCallbackArguments::CallNamedQuery( ExceptionContext::kNamedQuery); v8::Intercepted intercepted = f(v8::Utils::ToLocal(name), callback_info); if (intercepted == v8::Intercepted::kNo) return {}; - return GetReturnValue(isolate); + return GetReturnValue(); } DirectHandle PropertyCallbackArguments::CallNamedGetter( - DirectHandle interceptor, DirectHandle name) { + Isolate* isolate, DirectHandle interceptor, + DirectHandle name) { + DCHECK(!is_setter_definer_deleter_); DCHECK_NAME_COMPATIBLE(interceptor, name); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedGetterCallback); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value()); NamedPropertyGetterCallback f = reinterpret_cast( interceptor->named_getter(isolate)); @@ -185,15 +339,17 @@ DirectHandle PropertyCallbackArguments::CallNamedGetter( ExceptionContext::kNamedGetter); v8::Intercepted intercepted = f(v8::Utils::ToLocal(name), callback_info); if (intercepted == v8::Intercepted::kNo) return {}; - return GetReturnValue(isolate); + return GetReturnValue(); } Handle PropertyCallbackArguments::CallNamedDescriptor( - DirectHandle interceptor, DirectHandle name) { + Isolate* isolate, DirectHandle interceptor, + DirectHandle name) { + DCHECK(!is_setter_definer_deleter_); DCHECK_NAME_COMPATIBLE(interceptor, name); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedDescriptorCallback); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value()); NamedPropertyDescriptorCallback f = reinterpret_cast( @@ -202,16 +358,17 @@ Handle PropertyCallbackArguments::CallNamedDescriptor( ExceptionContext::kNamedDescriptor); v8::Intercepted intercepted = f(v8::Utils::ToLocal(name), callback_info); if (intercepted == v8::Intercepted::kNo) return {}; - return GetReturnValue(isolate); + return GetReturnValue(); } v8::Intercepted PropertyCallbackArguments::CallNamedSetter( - DirectHandle interceptor, DirectHandle name, - DirectHandle value) { + Isolate* isolate, DirectHandle interceptor, + DirectHandle name, DirectHandle value) { + DCHECK(is_setter_definer_deleter_); DCHECK_NAME_COMPATIBLE(interceptor, name); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedSetterCallback); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value()); NamedPropertySetterCallback f = reinterpret_cast( interceptor->named_setter(isolate)); @@ -224,12 +381,13 @@ v8::Intercepted PropertyCallbackArguments::CallNamedSetter( } v8::Intercepted PropertyCallbackArguments::CallNamedDefiner( - DirectHandle interceptor, DirectHandle name, - const v8::PropertyDescriptor& desc) { + Isolate* isolate, DirectHandle interceptor, + DirectHandle name, const v8::PropertyDescriptor& desc) { + DCHECK(is_setter_definer_deleter_); DCHECK_NAME_COMPATIBLE(interceptor, name); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedDefinerCallback); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value()); NamedPropertyDefinerCallback f = reinterpret_cast( @@ -243,11 +401,13 @@ v8::Intercepted PropertyCallbackArguments::CallNamedDefiner( } v8::Intercepted PropertyCallbackArguments::CallNamedDeleter( - DirectHandle interceptor, DirectHandle name) { + Isolate* isolate, DirectHandle interceptor, + DirectHandle name) { + DCHECK(is_setter_definer_deleter_); DCHECK_NAME_COMPATIBLE(interceptor, name); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedDeleterCallback); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value()); NamedPropertyDeleterCallback f = reinterpret_cast( @@ -264,20 +424,22 @@ v8::Intercepted PropertyCallbackArguments::CallNamedDeleter( DirectHandle PropertyCallbackArguments::CallIndexedEnumerator( - DirectHandle interceptor) { + Isolate* isolate, DirectHandle interceptor) { + DCHECK(!is_setter_definer_deleter_); DCHECK(!interceptor->is_named()); - RCS_SCOPE(isolate(), RuntimeCallCounterId::kIndexedEnumeratorCallback); - return CallPropertyEnumerator(interceptor); + RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedEnumeratorCallback); + return CallPropertyEnumerator(isolate, interceptor); } // TODO(ishell): return std::optional. DirectHandle PropertyCallbackArguments::CallIndexedQuery( - DirectHandle interceptor, uint32_t index) { + Isolate* isolate, DirectHandle interceptor, + uint32_t index) { + DCHECK(!is_setter_definer_deleter_); DCHECK(!interceptor->is_named()); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedQueryCallback); - index_ = index; - slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker + set_property_key(index); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(Smi::FromInt(v8::None)); IndexedPropertyQueryCallbackV2 f = reinterpret_cast( @@ -286,16 +448,17 @@ DirectHandle PropertyCallbackArguments::CallIndexedQuery( ExceptionContext::kIndexedQuery); v8::Intercepted intercepted = f(index, callback_info); if (intercepted == v8::Intercepted::kNo) return {}; - return GetReturnValue(isolate); + return GetReturnValue(); } DirectHandle PropertyCallbackArguments::CallIndexedGetter( - DirectHandle interceptor, uint32_t index) { + Isolate* isolate, DirectHandle interceptor, + uint32_t index) { + DCHECK(!is_setter_definer_deleter_); DCHECK(!interceptor->is_named()); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kNamedGetterCallback); - index_ = index; - slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker + set_property_key(index); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value()); IndexedPropertyGetterCallbackV2 f = reinterpret_cast( @@ -304,16 +467,17 @@ DirectHandle PropertyCallbackArguments::CallIndexedGetter( ExceptionContext::kIndexedGetter); v8::Intercepted intercepted = f(index, callback_info); if (intercepted == v8::Intercepted::kNo) return {}; - return GetReturnValue(isolate); + return GetReturnValue(); } Handle PropertyCallbackArguments::CallIndexedDescriptor( - DirectHandle interceptor, uint32_t index) { + Isolate* isolate, DirectHandle interceptor, + uint32_t index) { + DCHECK(!is_setter_definer_deleter_); DCHECK(!interceptor->is_named()); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedDescriptorCallback); - index_ = index; - slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker + set_property_key(index); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value()); IndexedPropertyDescriptorCallbackV2 f = reinterpret_cast( @@ -322,17 +486,17 @@ Handle PropertyCallbackArguments::CallIndexedDescriptor( ExceptionContext::kIndexedDescriptor); v8::Intercepted intercepted = f(index, callback_info); if (intercepted == v8::Intercepted::kNo) return {}; - return GetReturnValue(isolate); + return GetReturnValue(); } v8::Intercepted PropertyCallbackArguments::CallIndexedSetter( - DirectHandle interceptor, uint32_t index, + Isolate* isolate, DirectHandle interceptor, uint32_t index, DirectHandle value) { + DCHECK(is_setter_definer_deleter_); DCHECK(!interceptor->is_named()); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedSetterCallback); - index_ = index; - slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker + set_property_key(index); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value()); IndexedPropertySetterCallbackV2 f = reinterpret_cast( @@ -346,13 +510,13 @@ v8::Intercepted PropertyCallbackArguments::CallIndexedSetter( } v8::Intercepted PropertyCallbackArguments::CallIndexedDefiner( - DirectHandle interceptor, uint32_t index, + Isolate* isolate, DirectHandle interceptor, uint32_t index, const v8::PropertyDescriptor& desc) { + DCHECK(is_setter_definer_deleter_); DCHECK(!interceptor->is_named()); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedDefinerCallback); - index_ = index; - slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker + set_property_key(index); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value()); IndexedPropertyDefinerCallbackV2 f = reinterpret_cast( @@ -365,12 +529,13 @@ v8::Intercepted PropertyCallbackArguments::CallIndexedDefiner( } v8::Intercepted PropertyCallbackArguments::CallIndexedDeleter( - DirectHandle interceptor, uint32_t index) { + Isolate* isolate, DirectHandle interceptor, + uint32_t index) { + DCHECK(is_setter_definer_deleter_); DCHECK(!interceptor->is_named()); - Isolate* isolate = this->isolate(); RCS_SCOPE(isolate, RuntimeCallCounterId::kIndexedDeleterCallback); - index_ = index; - slot_at(kPropertyKeyIndex).store(Smi::zero()); // indexed callback marker + set_property_key(index); + slot_at(kCallbackInfoIndex).store(*interceptor); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value()); IndexedPropertyDeleterCallbackV2 f = reinterpret_cast( @@ -383,12 +548,14 @@ v8::Intercepted PropertyCallbackArguments::CallIndexedDeleter( DirectHandle PropertyCallbackArguments::CallPropertyEnumerator( - DirectHandle interceptor) { + Isolate* isolate, DirectHandle interceptor) { // Named and indexed enumerator callbacks have same signatures. static_assert(std::is_same_v); - Isolate* isolate = this->isolate(); - slot_at(kPropertyKeyIndex).store(Smi::zero()); // not relevant + DCHECK(!is_setter_definer_deleter_); + // The actual property key is not relevant for this callback. + set_property_key(0); + slot_at(kCallbackInfoIndex).store(*interceptor); // Enumerator callback's return value is initialized with undefined even // though it's supposed to return v8::Array. slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value()); @@ -405,7 +572,7 @@ PropertyCallbackArguments::CallPropertyEnumerator( PREPARE_CALLBACK_INFO_INTERCEPTOR(isolate, f, v8::Array, interceptor, ExceptionContext::kNamedEnumerator); f(callback_info); - DirectHandle result = GetReturnValue(isolate); + DirectHandle result = GetReturnValue(); DCHECK(IsUndefined(*result) || IsJSObject(*result)); return Cast(result); } @@ -414,34 +581,37 @@ PropertyCallbackArguments::CallPropertyEnumerator( // Accessors DirectHandle PropertyCallbackArguments::CallAccessorGetter( - DirectHandle info, DirectHandle name) { - Isolate* isolate = this->isolate(); + Isolate* isolate, DirectHandle accessor_info, + DirectHandle name) { + DCHECK(!is_setter_definer_deleter_); RCS_SCOPE(isolate, RuntimeCallCounterId::kAccessorGetterCallback); // Unlike interceptor callbacks we know that the property exists, so // the callback is allowed to have side effects. AcceptSideEffects(); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*accessor_info); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value()); - AccessorNameGetterCallback f = - reinterpret_cast(info->getter(isolate)); - PREPARE_CALLBACK_INFO_ACCESSOR( - isolate, f, v8::Value, info, direct_handle(receiver(), isolate), - ACCESSOR_GETTER, ExceptionContext::kAttributeGet); + AccessorNameGetterCallback f = reinterpret_cast( + accessor_info->getter(isolate)); + PREPARE_CALLBACK_INFO_ACCESSOR(isolate, f, v8::Value, accessor_info, + receiver(), ACCESSOR_GETTER, + ExceptionContext::kAttributeGet); f(v8::Utils::ToLocal(name), callback_info); - return GetReturnValue(isolate); + return GetReturnValue(); } bool PropertyCallbackArguments::CallAccessorSetter( - DirectHandle accessor_info, DirectHandle name, - DirectHandle value) { - Isolate* isolate = this->isolate(); + Isolate* isolate, DirectHandle accessor_info, + DirectHandle name, DirectHandle value) { + DCHECK(is_setter_definer_deleter_); RCS_SCOPE(isolate, RuntimeCallCounterId::kAccessorSetterCallback); // Unlike interceptor callbacks we know that the property exists, so // the callback is allowed to have side effects. AcceptSideEffects(); - slot_at(kPropertyKeyIndex).store(*name); + set_property_key(*name); + slot_at(kCallbackInfoIndex).store(*accessor_info); slot_at(kReturnValueIndex).store(ReadOnlyRoots(isolate).true_value()); // The actual type of setter callback is either // v8::AccessorNameSetterCallback or @@ -454,9 +624,9 @@ bool PropertyCallbackArguments::CallAccessorSetter( // the result of [[Set]] operation according to JavaScript semantics. AccessorNameSetterCallback f = reinterpret_cast( accessor_info->setter(isolate)); - PREPARE_CALLBACK_INFO_ACCESSOR( - isolate, f, void, accessor_info, direct_handle(receiver(), isolate), - ACCESSOR_SETTER, ExceptionContext::kAttributeSet); + PREPARE_CALLBACK_INFO_ACCESSOR(isolate, f, void, accessor_info, receiver(), + ACCESSOR_SETTER, + ExceptionContext::kAttributeSet); f(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), callback_info); // Historically, in case of v8::AccessorNameSetterCallback it wasn't allowed // to set the result and not setting the result was treated as successful @@ -470,7 +640,7 @@ bool PropertyCallbackArguments::CallAccessorSetter( // v8::AccessorNameSetterCallback or AccessorNameBooleanSetterCallback // the result is guaranteed to be v8::Boolean value indicating success or // failure. - DirectHandle result = GetReturnValue(isolate); + DirectHandle result = GetReturnValue(); return IsTrue(*result, isolate); } diff --git a/deps/v8/src/api/api-arguments.cc b/deps/v8/src/api/api-arguments.cc index e827f4d65b038c..f14e5853f8a9e0 100644 --- a/deps/v8/src/api/api-arguments.cc +++ b/deps/v8/src/api/api-arguments.cc @@ -9,49 +9,29 @@ namespace v8 { namespace internal { -PropertyCallbackArguments::PropertyCallbackArguments( - Isolate* isolate, Tagged data, Tagged self, - Tagged holder, Maybe should_throw) - : Super(isolate) -#ifdef DEBUG - , - javascript_execution_counter_(isolate->javascript_execution_counter()) -#endif // DEBUG -{ - if (DEBUG_BOOL) { - // Zap these fields to ensure that they are initialized by a subsequent - // CallXXX(..). - Tagged zap_value(kZapValue); - slot_at(T::kPropertyKeyIndex).store(zap_value); - slot_at(T::kReturnValueIndex).store(zap_value); - } - slot_at(T::kThisIndex).store(self); - slot_at(T::kHolderIndex).store(holder); - slot_at(T::kDataIndex).store(data); - slot_at(T::kIsolateIndex) - .store(Tagged(reinterpret_cast
(isolate))); - int value = Internals::kInferShouldThrowMode; - if (should_throw.IsJust()) { - value = should_throw.FromJust(); - } - slot_at(T::kShouldThrowOnErrorIndex).store(Smi::FromInt(value)); - slot_at(T::kHolderV2Index).store(Smi::zero()); - DCHECK(IsHeapObject(*slot_at(T::kHolderIndex))); - DCHECK(IsSmi(*slot_at(T::kIsolateIndex))); +void FunctionCallbackArguments::IterateInstance(RootVisitor* v) { + // Visit newTargetSlot which is located in the frame. + v->VisitRootPointer(Root::kRelocatable, nullptr, slot_at(T::kNewTargetIndex)); + + // Visit all slots above "pc" in this artificial Api callback frame object. + v->VisitRootPointers(Root::kRelocatable, nullptr, + slot_at(T::kFirstApiArgumentIndex), + FullObjectSlot(values_.end())); } -FunctionCallbackArguments::FunctionCallbackArguments( - Isolate* isolate, Tagged target, - Tagged new_target, Address* argv, int argc) - : Super(isolate), argv_(argv), argc_(argc) { - slot_at(T::kTargetIndex).store(target); - slot_at(T::kUnusedIndex).store(ReadOnlyRoots(isolate).undefined_value()); - slot_at(T::kNewTargetIndex).store(new_target); - slot_at(T::kIsolateIndex) - .store(Tagged(reinterpret_cast
(isolate))); - slot_at(T::kReturnValueIndex).store(ReadOnlyRoots(isolate).undefined_value()); - slot_at(T::kContextIndex).store(isolate->context()); - DCHECK(IsSmi(*slot_at(T::kIsolateIndex))); +void PropertyCallbackArguments::IterateInstance(RootVisitor* v) { + // Visit property key slot for named case (for indexed case it contains + // raw uint32_t value). + if (is_named()) { + v->VisitRootPointer(Root::kRelocatable, nullptr, + slot_at(T::kPropertyKeyIndex)); + } + // It's not necessary to visit the optional part because it doesn't contain + // tagged values (the kValueIndex slot is used as a handle storage only + // by CallApiSetter builtin). + v->VisitRootPointers(Root::kRelocatable, nullptr, + slot_at(T::kFirstApiArgumentIndex), + slot_at(kMandatoryArgsLength)); } } // namespace internal diff --git a/deps/v8/src/api/api-arguments.h b/deps/v8/src/api/api-arguments.h index 26a42125d7027d..8b6dcd390c66c5 100644 --- a/deps/v8/src/api/api-arguments.h +++ b/deps/v8/src/api/api-arguments.h @@ -6,6 +6,7 @@ #define V8_API_API_ARGUMENTS_H_ #include "include/v8-template.h" +#include "src/base/small-vector.h" #include "src/builtins/builtins-utils.h" #include "src/execution/isolate.h" #include "src/objects/slots.h" @@ -14,51 +15,6 @@ namespace v8 { namespace internal { -// Custom arguments replicate a small segment of stack that can be -// accessed through an Arguments object the same way the actual stack -// can. -class CustomArgumentsBase : public Relocatable { - protected: - explicit inline CustomArgumentsBase(Isolate* isolate); -}; - -template -class CustomArguments : public CustomArgumentsBase { - public: - static constexpr int kReturnValueIndex = T::kReturnValueIndex; - static_assert(T::kSize == sizeof(T)); - - ~CustomArguments() override; - - inline void IterateInstance(RootVisitor* v) override { - v->VisitRootPointers(Root::kRelocatable, nullptr, slot_at(0), - slot_at(T::kArgsLength)); - } - - protected: - explicit inline CustomArguments(Isolate* isolate) - : CustomArgumentsBase(isolate) {} - - template - Handle GetReturnValue(Isolate* isolate) const; - - inline Isolate* isolate() const { - return reinterpret_cast((*slot_at(T::kIsolateIndex)).ptr()); - } - - inline FullObjectSlot slot_at(int index) const { - // This allows index == T::kArgsLength so "one past the end" slots - // can be retrieved for iterating purposes. - DCHECK_LE(static_cast(index), - static_cast(T::kArgsLength)); - return FullObjectSlot(values_ + index); - } - - Address values_[T::kArgsLength]; -}; - -// Note: Calling args.Call() sets the return value on args. For multiple -// Call()'s, a new args should be used every time. // 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 @@ -67,29 +23,47 @@ class CustomArguments : public CustomArgumentsBase { // 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 > { +class PropertyCallbackArguments final : public Relocatable { public: using T = PropertyCallbackInfo; using Super = CustomArguments; - static constexpr int kArgsLength = T::kArgsLength; + static constexpr int kMandatoryArgsLength = T::kMandatoryArgsLength; + static constexpr int kFullArgsLength = T::kFullArgsLength; + static constexpr int kMandatoryApiArgsLength = T::kMandatoryApiArgsLength; + static constexpr int kFullApiArgsLength = T::kFullApiArgsLength; + + static constexpr int kGetterApiArgsLength = T::kMandatoryApiArgsLength; + static constexpr int kSetterApiArgsLength = T::kFullApiArgsLength; + + static constexpr int kFrameTypeIndex = T::kFrameTypeIndex; static constexpr int kThisIndex = T::kThisIndex; - static constexpr int kDataIndex = T::kDataIndex; - static constexpr int kHolderV2Index = T::kHolderV2Index; + static constexpr int kUnusedIndex = T::kUnusedIndex; + static constexpr int kCallbackInfoIndex = T::kCallbackInfoIndex; static constexpr int kHolderIndex = T::kHolderIndex; static constexpr int kIsolateIndex = T::kIsolateIndex; + static constexpr int kReturnValueIndex = T::kReturnValueIndex; static constexpr int kShouldThrowOnErrorIndex = T::kShouldThrowOnErrorIndex; static constexpr int kPropertyKeyIndex = T::kPropertyKeyIndex; + static constexpr int kValueIndex = T::kValueIndex; - // This constructor leaves kPropertyKeyIndex and kReturnValueIndex slots - // uninitialized in order to let them be initialized by the subsequent - // CallXXX(..) and avoid double initialization. As a consequence, there - // must be no GC call between this constructor and CallXXX(..). - // In debug mode these slots are zapped, so GC should be able to detect - // the misuse of this object. - PropertyCallbackArguments(Isolate* isolate, Tagged data, - Tagged self, Tagged holder, - Maybe should_throw); + // Helper for converting Api arguments indices to [0..kFullApiArgsLength) + // value. + static constexpr uint32_t ApiArgIndex(uint32_t index) { + DCHECK_GE(index, T::kFirstApiArgumentIndex); + return index - T::kFirstApiArgumentIndex; + } + + // This constructor leaves kPropertyKeyIndex, kReturnValueIndex and + // kCallbackInfoIndex slots uninitialized in order to let them be + // initialized by the subsequent CallXXX(..) and avoid double initialization. + // As a consequence, there must be no GC call between this constructor and + // CallXXX(..). In debug mode these slots are zapped, so GC should be able + // to detect misuse of this object. + inline PropertyCallbackArguments(Isolate* isolate, Tagged receiver, + Tagged holder); + inline PropertyCallbackArguments(Isolate* isolate, Tagged receiver, + Tagged holder, + Maybe should_throw); inline ~PropertyCallbackArguments(); // Don't copy PropertyCallbackArguments, because they would both have the @@ -104,11 +78,13 @@ class PropertyCallbackArguments final // Returns the result of [[Get]] operation or throws an exception. // In case of exception empty handle is returned. // TODO(ishell, 328490288): stop returning empty handles. - inline DirectHandle CallAccessorGetter(DirectHandle info, + inline DirectHandle CallAccessorGetter(Isolate* isolate, + DirectHandle info, DirectHandle name); // Returns the result of [[Set]] operation or throws an exception. V8_WARN_UNUSED_RESULT - inline bool CallAccessorSetter(DirectHandle info, + inline bool CallAccessorSetter(Isolate* isolate, + DirectHandle info, DirectHandle name, DirectHandle value); @@ -118,30 +94,34 @@ class PropertyCallbackArguments final // Empty handle means that the request was not intercepted. // Pending exception handling should be done by the caller. inline DirectHandle CallNamedQuery( - DirectHandle interceptor, DirectHandle name); + Isolate* isolate, DirectHandle interceptor, + DirectHandle name); inline DirectHandle CallNamedGetter( - DirectHandle interceptor, DirectHandle name); + Isolate* isolate, DirectHandle interceptor, + DirectHandle name); // Calls Setter/Definer/Deleter callback and returns whether the request // was intercepted. // Pending exception handling and interpretation of the result should be // done by the caller using GetBooleanReturnValue(..). inline v8::Intercepted CallNamedSetter( - DirectHandle interceptor, DirectHandle name, - DirectHandle value); + Isolate* isolate, DirectHandle interceptor, + DirectHandle name, DirectHandle value); inline v8::Intercepted CallNamedDefiner( - DirectHandle interceptor, DirectHandle name, - const v8::PropertyDescriptor& desc); + Isolate* isolate, DirectHandle interceptor, + DirectHandle name, const v8::PropertyDescriptor& desc); inline v8::Intercepted CallNamedDeleter( - DirectHandle interceptor, DirectHandle name); + Isolate* isolate, DirectHandle interceptor, + DirectHandle name); // Empty handle means that the request was not intercepted. // Pending exception handling should be done by the caller. inline Handle CallNamedDescriptor( - DirectHandle interceptor, DirectHandle name); + Isolate* isolate, DirectHandle interceptor, + DirectHandle name); // Returns JSArray-like object with property names or undefined. inline DirectHandle CallNamedEnumerator( - DirectHandle interceptor); + Isolate* isolate, DirectHandle interceptor); // ------------------------------------------------------------------------- // Indexed Interceptor Callbacks @@ -149,30 +129,34 @@ class PropertyCallbackArguments final // Empty handle means that the request was not intercepted. // Pending exception handling should be done by the caller. inline DirectHandle CallIndexedQuery( - DirectHandle interceptor, uint32_t index); + Isolate* isolate, DirectHandle interceptor, + uint32_t index); inline DirectHandle CallIndexedGetter( - DirectHandle interceptor, uint32_t index); + Isolate* isolate, DirectHandle interceptor, + uint32_t index); // Calls Setter/Definer/Deleter callback and returns whether the request // was intercepted. // Pending exception handling and interpretation of the result should be // done by the caller using GetBooleanReturnValue(..). inline v8::Intercepted CallIndexedSetter( - DirectHandle interceptor, uint32_t index, - DirectHandle value); + Isolate* isolate, DirectHandle interceptor, + uint32_t index, DirectHandle value); inline v8::Intercepted CallIndexedDefiner( - DirectHandle interceptor, uint32_t index, - const v8::PropertyDescriptor& desc); + Isolate* isolate, DirectHandle interceptor, + uint32_t index, const v8::PropertyDescriptor& desc); inline v8::Intercepted CallIndexedDeleter( - DirectHandle interceptor, uint32_t index); + Isolate* isolate, DirectHandle interceptor, + uint32_t index); // Empty handle means that the request was not intercepted. // Pending exception handling should be done by the caller. inline Handle CallIndexedDescriptor( - DirectHandle interceptor, uint32_t index); + Isolate* isolate, DirectHandle interceptor, + uint32_t index); // Returns JSArray-like object with property names or undefined. inline DirectHandle CallIndexedEnumerator( - DirectHandle interceptor); + Isolate* isolate, DirectHandle interceptor); // Accept potential JavaScript side effects that might occur during life // time of this object. @@ -188,7 +172,8 @@ class PropertyCallbackArguments final // the Setter/Definer operation is ignored and thus we don't need to process // the actual return value. inline Maybe GetBooleanReturnValue( - v8::Intercepted intercepted, const char* callback_kind_for_error_message, + Isolate* isolate, v8::Intercepted intercepted, + const char* callback_kind_for_error_message, bool ignore_return_value = false); // TODO(ishell): cleanup this hack by embedding the PropertyCallbackInfo @@ -204,106 +189,166 @@ class PropertyCallbackArguments final return GetPropertyCallbackInfo().ShouldThrowOnError(); } - // Unofficial way of getting property key from v8::PropertyCallbackInfo. + // Returns AccessorInfo stored in v8::PropertyCallbackInfo. + template + static DirectHandle GetAccessorInfo( + const PropertyCallbackInfo& info) { + return Cast( + DirectHandle::FromSlot(&info.args_[kCallbackInfoIndex])); + } + + // Returns whether given v8::PropertyCallbackInfo object is named/indexed. template - static Tagged GetPropertyKey(const PropertyCallbackInfo& info) { - return Tagged(info.args_[kPropertyKeyIndex]); + static bool IsNamed(const PropertyCallbackInfo& info) { + return info.IsNamed(); } + + // Returns property name stored in v8::PropertyCallbackInfo (for named + // accessors/interceptors). template - static Handle GetPropertyKeyHandle( + static DirectHandle GetPropertyName( const PropertyCallbackInfo& info) { - return Handle(&info.args_[kPropertyKeyIndex]); + DCHECK(info.IsNamed()); + return Cast( + DirectHandle::FromSlot(&info.args_[kPropertyKeyIndex])); } - // Returns index value passed to CallIndexedXXX(). This works as long as - // all the calls to indexed interceptor callbacks are done via - // PropertyCallbackArguments. + // Returns property index stored in v8::PropertyCallbackInfo (for indexed + // interceptors). template static uint32_t GetPropertyIndex(const PropertyCallbackInfo& info) { - // Currently all indexed interceptor callbacks are called via - // PropertyCallbackArguments, so it's guaranteed that - // v8::PropertyCallbackInfo::args_ array IS the - // PropertyCallbackArguments::values_ array. As a result we can restore - // pointer to PropertyCallbackArguments object from the former. - Address ptr = reinterpret_cast
(&info.args_) - - offsetof(PropertyCallbackArguments, values_); - auto pca = reinterpret_cast(ptr); - return pca->index_; + DCHECK(!info.IsNamed()); + return static_cast(info.args_[kPropertyKeyIndex]); } + // Returns true if it's an arguments object for named callback, otherwise + // it's one for an indexed callback. + inline bool is_named() const; + + // Set property key and a respective frame type (named vs. indexed). + inline void set_property_key(Tagged name); + inline void set_property_key(uint32_t index); + + inline DirectHandle holder() const; + private: + inline void Initialize(Isolate* isolate, Tagged self, + Tagged holder); // Returns JSArray-like object with property names or undefined. inline DirectHandle CallPropertyEnumerator( - DirectHandle interceptor); + Isolate* isolate, DirectHandle interceptor); + + inline DirectHandle receiver() const; - inline Tagged holder() const; - inline Tagged receiver() const; + void IterateInstance(RootVisitor* v) override; - // This field is used for propagating index value from CallIndexedXXX() - // to ExceptionPropagationCallback. - uint32_t index_ = kMaxUInt32; + template + Handle GetReturnValue() const; + + inline FullObjectSlot slot_at(int index) const { + // This allows index == kFullArgsLength so "one past the end" slots + // can be retrieved for iterating purposes. + DCHECK_LE(static_cast(index), + static_cast(kFullArgsLength)); + return FullObjectSlot(values_ + index); + } #ifdef DEBUG + // Used for checking that the way this object was constructed matches the + // following CallXxx(..). + const bool is_setter_definer_deleter_; + // This stores current value of Isolate::javascript_execution_counter(). // It's used for detecting whether JavaScript code was executed between // PropertyCallbackArguments's constructor and destructor. - uint32_t javascript_execution_counter_; + uint32_t javascript_execution_counter_ = 0; #endif // DEBUG + + Address values_[kFullArgsLength]; }; -class FunctionCallbackArguments - : public CustomArguments > { +class FunctionCallbackArguments : public Relocatable { public: using T = FunctionCallbackInfo; using Super = CustomArguments; static constexpr int kArgsLength = T::kArgsLength; - static constexpr int kArgsLengthWithReceiver = T::kArgsLengthWithReceiver; - static constexpr int kUnusedIndex = T::kUnusedIndex; + // Frame arguments block, the values are located on stack in the frame. + static constexpr int kArgcIndex = T::kArgcIndex; + static constexpr int kNewTargetIndex = T::kNewTargetIndex; + static constexpr int kFrameSPIndex = T::kFrameSPIndex; + static constexpr int kFrameTypeIndex = T::kFrameTypeIndex; + + // Api arguments block, the values are located on stack right above PC. static constexpr int kIsolateIndex = T::kIsolateIndex; + static constexpr int kReturnValueIndex = T::kReturnValueIndex; static constexpr int kContextIndex = T::kContextIndex; static constexpr int kTargetIndex = T::kTargetIndex; - static constexpr int kNewTargetIndex = T::kNewTargetIndex; + static constexpr int kApiArgsLength = T::kApiArgsLength; - static_assert(T::kThisValuesIndex == BuiltinArguments::kReceiverArgsIndex); - - static constexpr int kSize = T::kSize; - static constexpr int kImplicitArgsOffset = T::kImplicitArgsOffset; - static constexpr int kValuesOffset = T::kValuesOffset; - static constexpr int kLengthOffset = T::kLengthOffset; - - // Make sure all FunctionCallbackInfo constants are in sync. - static_assert(T::kSize == sizeof(T)); - static_assert(T::kImplicitArgsOffset == offsetof(T, implicit_args_)); - static_assert(T::kValuesOffset == offsetof(T, values_)); - static_assert(T::kLengthOffset == offsetof(T, length_)); - - FunctionCallbackArguments(Isolate* isolate, - Tagged target, - Tagged new_target, Address* argv, - int argc); - - /* - * The following Call function wraps the calling of all callbacks to handle - * calling either the old or the new style callbacks depending on which one - * has been registered. - * For old callbacks which return an empty handle, the ReturnValue is checked - * and used if it's been set to anything inside the callback. - * New style callbacks always use the return value. - */ - inline DirectHandle CallOrConstruct( - Tagged function, bool is_construct); + // JS arguments block, follows Api arguments. + static constexpr int kReceiverIndex = T::kReceiverIndex; + static constexpr int kFirstJSArgumentIndex = T::kFirstJSArgumentIndex; + + // Helper for converting Api arguments indices to [0..kApiArgsLength) value. + static constexpr uint32_t ApiArgIndex(uint32_t index) { + DCHECK_GE(index, T::kFirstApiArgumentIndex); + return index - T::kFirstApiArgumentIndex; + } + + // Arguments for [[Call]] operation. + template + inline FunctionCallbackArguments(Isolate* isolate, + Tagged target, + Tagged receiver, + const base::Vector args); + // Arguments for [[Construct]] operation. + template + inline FunctionCallbackArguments(Isolate* isolate, + Tagged target, + Tagged new_target, + Tagged receiver, + const base::Vector args); + inline ~FunctionCallbackArguments(); + + // Performs [[Call]] of [[Construct]] operation for a given function + // and new_target. + // Exception is supposed to be checked by the caller. + // It explicitly returns raw value in order to enforce the caller to create + // a handle if necessary. + inline Tagged CallOrConstruct(Isolate* isolate, + Tagged function, + bool is_construct); // Unofficial way of getting target FunctionTemplateInfo from // v8::FunctionCallbackInfo. template static Tagged GetTarget(const FunctionCallbackInfo& info) { - return Tagged(info.implicit_args_[kTargetIndex]); + return Tagged(info.values_[kTargetIndex]); } private: - Address* argv_; - int const argc_; + template + requires(std::is_same_v> || + std::is_same_v) + inline void Initialize(Isolate* isolate, Tagged target, + Tagged new_target, Tagged receiver, + const base::Vector args); + + inline FullObjectSlot slot_at(uint32_t index) const { + // Shift index to accommodate for unconditionally allocated "optional" part. + index += T::kOptionalArgsLength; + // This allows index == values_.size() so "one past the end" slots + // can be retrieved for iterating purposes. + DCHECK_LE(index, values_.size()); + // Don't use operator[] because it doesn't allow one past end index. + return FullObjectSlot(&values_.data()[index]); + } + + void IterateInstance(RootVisitor* v) override; + + // This default size is enough for passing up to 4 JS arguments. + base::SmallVector values_; }; static_assert(BuiltinArguments::kNumExtraArgs == diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index 5a879e9ff5d9e8..0b3ea819fb227e 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include // For move #include @@ -34,6 +35,7 @@ #include "src/api/api-arguments.h" #include "src/api/api-inl.h" #include "src/api/api-natives.h" +#include "src/base/bit-field.h" #include "src/base/hashing.h" #include "src/base/logging.h" #include "src/base/numerics/safe_conversions.h" @@ -159,6 +161,8 @@ #include "src/objects/intl-objects.h" #endif // V8_INTL_SUPPORT +#include "src/strings/string-hasher-inl.h" + #if V8_OS_LINUX || V8_OS_DARWIN || V8_OS_FREEBSD #include #include @@ -183,6 +187,11 @@ #include "src/diagnostics/etw-jit-win.h" #endif // V8_ENABLE_ETW_STACK_WALKING +#if defined(V8_ENABLE_SANDBOX) && defined(V8_ENABLE_MEMORY_CORRUPTION_API) +#include "src/strings/owning-external-string-resource.h" +#endif // defined(V8_ENABLE_SANDBOX) && + // defined(V8_ENABLE_MEMORY_CORRUPTION_API) + namespace v8 { i::ExternalPointerTag ToExternalPointerTag(v8::EmbedderDataTypeTag api_tag) { @@ -246,6 +255,10 @@ void i::V8::FatalProcessOutOfMemory(i::Isolate* i_isolate, const char* location, if (i_isolate->heap()->HasBeenSetUp()) { i_isolate->heap()->RecordStats(&heap_stats); + i_isolate->heap()->ReportStatsAsCrashKeys(heap_stats); + + i_isolate->ReportStackAsCrashKey(); + if (!v8_flags.correctness_fuzzer_suppressions) { char* first_newline = strchr(heap_stats.last_few_messages, '\n'); if (first_newline == nullptr || first_newline[1] == '\0') @@ -474,19 +487,39 @@ void RegisteredExtension::UnregisterAll() { } namespace { + +#if defined(V8_ENABLE_SANDBOX) && defined(V8_ENABLE_MEMORY_CORRUPTION_API) + +// An implementation that holds all extension resources as copies in the +// ExternalStringsCage; for use in testing/fuzzing memory_corruption_api enabled +// builds to avoid filing issues for OOB reads due to corruptions of lengths +// stored on heap. +class ExtensionResource : public i::OwningExternalOneByteStringResource { + public: + using i::OwningExternalOneByteStringResource:: + OwningExternalOneByteStringResource; + void Dispose() override { + // Don't delete here - our lifetime is managed by the Extension object. + } +}; + +#else // defined(V8_ENABLE_SANDBOX) && defined(V8_ENABLE_MEMORY_CORRUPTION_API) + +// An implementation that simply wraps the specified view. class ExtensionResource : public String::ExternalOneByteStringResource { public: - ExtensionResource() : data_(nullptr), length_(0) {} - ExtensionResource(const char* data, size_t length) - : data_(data), length_(length) {} - const char* data() const override { return data_; } - size_t length() const override { return length_; } + explicit ExtensionResource(std::string_view string) : string_(string) {} + const char* data() const override { return string_.data(); } + size_t length() const override { return string_.length(); } void Dispose() override {} private: - const char* data_; - size_t length_; + const std::string_view string_; }; + +#endif // defined(V8_ENABLE_SANDBOX) && + // defined(V8_ENABLE_MEMORY_CORRUPTION_API) + } // anonymous namespace void RegisterExtension(std::unique_ptr extension) { @@ -496,14 +529,16 @@ void RegisterExtension(std::unique_ptr extension) { Extension::Extension(const char* name, const char* source, int dep_count, const char** deps, int source_length) : name_(name), - source_length_(source_length >= 0 - ? source_length - : (source ? static_cast(strlen(source)) : 0)), dep_count_(dep_count), deps_(deps), auto_enable_(false) { - source_ = new ExtensionResource(source, source_length_); - CHECK(source != nullptr || source_length_ == 0); + CHECK_IMPLIES(source == nullptr, source_length <= 0); + std::string_view source_view; + if (source) { + source_view = source_length >= 0 ? std::string_view(source, source_length) + : std::string_view(source); + } + source_ = new ExtensionResource(source_view); } void ResourceConstraints::ConfigureDefaultsFromHeapSize( @@ -538,8 +573,8 @@ void ResourceConstraints::ConfigureDefaults(uint64_t physical_memory, size_t old_generation = i::Heap::OldGenerationSizeFromPhysicalMemory(physical_memory); - size_t young_generation = i::Heap::YoungGenerationSizeFromOldGenerationSize( - physical_memory, old_generation); + size_t young_generation = + i::Heap::YoungGenerationSizeFromPhysicalMemory(physical_memory); set_max_young_generation_size_in_bytes(young_generation); set_max_old_generation_size_in_bytes(old_generation); @@ -823,7 +858,7 @@ bool Data::IsValue() const { i::Tagged heap_object = i::Cast(self); DCHECK(!IsTheHole(heap_object)); if (i::IsSymbol(heap_object)) { - return !i::Cast(heap_object)->is_private(); + return !i::Cast(heap_object)->is_any_private(); } return IsPrimitiveHeapObject(heap_object) || IsJSReceiver(heap_object); } @@ -961,6 +996,27 @@ void Context::SetEmbedderData(int index, v8::Local value) { *Utils::OpenDirectHandle(*GetEmbedderData(index))); } +v8::Local Context::SlowGetEmbedderDataV2(int index) { + const char* location = "v8::Context::GetEmbedderDataV2()"; + i::DirectHandle data = + EmbedderDataFor(this, index, false, location); + if (data.is_null()) return {}; + i::Isolate* i_isolate = i::Isolate::Current(); + return Utils::ToLocal(i::direct_handle( + i::EmbedderDataSlot(*data, index).load_tagged(), i_isolate)); +} + +void Context::SetEmbedderDataV2(int index, v8::Local value) { + const char* location = "v8::Context::SetEmbedderDataV2()"; + i::DirectHandle data = + EmbedderDataFor(this, index, true, location); + if (data.is_null()) return; + auto val = Utils::OpenDirectHandle(*value); + i::EmbedderDataSlot::store_tagged(*data, index, *val); + DCHECK_EQ(*Utils::OpenDirectHandle(*value), + *Utils::OpenDirectHandle(*GetEmbedderDataV2(index))); +} + void* Context::SlowGetAlignedPointerFromEmbedderData(int index, EmbedderDataTypeTag tag) { const char* location = "v8::Context::GetAlignedPointerFromEmbedderData()"; @@ -1096,7 +1152,7 @@ static void EnsureNotPublished(i::DirectHandle info, } i::DirectHandle FunctionTemplateNew( - i::Isolate* i_isolate, FunctionCallback callback, v8::Local data, + i::Isolate* i_isolate, FunctionCallback callback, v8::Local data, v8::Local signature, int length, ConstructorBehavior behavior, bool do_not_cache, v8::Local cached_property_name = v8::Local(), @@ -1258,7 +1314,7 @@ Local Signature::New(Isolate* v8_isolate, } while (false) void FunctionTemplate::SetCallHandler( - FunctionCallback callback, v8::Local data, + FunctionCallback callback, v8::Local data, SideEffectType side_effect_type, const MemorySpan& c_function_overloads) { auto info = Utils::OpenDirectHandle(this); @@ -2096,10 +2152,13 @@ int FixedArray::Length() const { return Utils::OpenDirectHandle(this)->length(); } -Local FixedArray::Get(Local context, int i) const { +Local FixedArray::Get(int i) const { auto self = Utils::OpenDirectHandle(this); auto i_isolate = i::Isolate::Current(); - CHECK_LT(i, self->length()); +#if V8_ENABLE_CHECKS + Utils::ApiCheck(i < self->length(), "v8::FixedArray::Get", + "index out of bounds"); +#endif return ToApiHandle(i::direct_handle(self->get(i), i_isolate)); } @@ -2125,6 +2184,24 @@ Local ModuleRequest::GetImportAttributes() const { i::direct_handle(self->import_attributes(), i_isolate)); } +Local Module::GetResourceName() const { + auto self = Utils::OpenDirectHandle(this); + i::Isolate* i_isolate = i::Isolate::Current(); + i::DisallowGarbageCollection no_gc; + + i::DirectHandle synthetic_module; + if (i::TryCast(self, &synthetic_module)) { + return ToApiHandle( + i::direct_handle(synthetic_module->name(), i_isolate)); + } + + i::DirectHandle sfi( + i::Cast(self)->GetSharedFunctionInfo(), i_isolate); + CHECK(IsScript(sfi->script())); + return ToApiHandle( + i::direct_handle(i::Cast(sfi->script())->name(), i_isolate)); +} + Module::Status Module::GetStatus() const { auto self = Utils::OpenDirectHandle(this); switch (self->status()) { @@ -2777,13 +2854,20 @@ MaybeLocal