[runtime] Split NumberToString cache to caches for Smis and doubles

This is a preliminary step before making it possible to store raw
doubles in the latter cache. Currently the keys in the latter cache
are HeapNumber objects.

This split also makes it possible to
 - avoid eviction of Smi entries by double entries (the former seem to
   be more important for performance),
 - avoid additional checks for distinguishing Smi keys from double
   keys,
 - configure cache size growing strategy independently,
 - configure tweak cache clearing logic based on "keys".

As a side effect this CL increases the overall number of entries in
combined number-to-string cache by 1.5.

Drive-by:
 - add collection of number to string cache usage statistics
   behind --trace-number-string-cache flag (requires gn argument
   `v8_enable_snapshot_native_code_counters = true` to enable counters
   machinery in builtins),
 - add flags for configuring full number to string cache sizes.

This CL changes heap layout and may regress some benchmarks, however
the follow up CLs should recover potential regressions.

Bug: 409808503
Change-Id: Ie33c6847c2608af5e359830ac4bbcc7017791bd1
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6512976
Reviewed-by: Dominik Inführ <dinfuehr@chromium.org>
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: Patrick Thier <pthier@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Auto-Submit: Igor Sheludko <ishell@chromium.org>
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/main@{#100146}
31 files changed
tree: 2ed55bad436e68d25826b453182fd1d349841c3b
  1. .github/
  2. bazel/
  3. build_overrides/
  4. custom_deps/
  5. docs/
  6. gni/
  7. include/
  8. infra/
  9. samples/
  10. src/
  11. test/
  12. testing/
  13. third_party/
  14. tools/
  15. .bazelrc
  16. .clang-format
  17. .clang-tidy
  18. .editorconfig
  19. .flake8
  20. .git-blame-ignore-revs
  21. .gitattributes
  22. .gitignore
  23. .gn
  24. .mailmap
  25. .style.yapf
  26. .vpython3
  27. .ycm_extra_conf.py
  28. AUTHORS
  29. BUILD.bazel
  30. BUILD.gn
  31. CODE_OF_CONDUCT.md
  32. codereview.settings
  33. COMMON_OWNERS
  34. DEPS
  35. DIR_METADATA
  36. ENG_REVIEW_OWNERS
  37. INFRA_OWNERS
  38. INTL_OWNERS
  39. LICENSE
  40. LICENSE.fdlibm
  41. LICENSE.strongtalk
  42. LICENSE.v8
  43. LOONG_OWNERS
  44. MIPS_OWNERS
  45. MODULE.bazel
  46. OWNERS
  47. PPC_OWNERS
  48. PRESUBMIT.py
  49. pyrightconfig.json
  50. README.md
  51. RISCV_OWNERS
  52. S390_OWNERS
  53. WATCHLISTS
README.md

V8 JavaScript Engine

V8 is Google's open source JavaScript engine.

V8 implements ECMAScript as specified in ECMA-262.

V8 is written in C++ and is used in Google Chrome, the open source browser from Google.

V8 can run standalone, or can be embedded into any C++ application.

V8 Project page: https://v8.dev/docs

Getting the Code

Checkout depot tools, and run

    fetch v8

This will checkout V8 into the directory v8 and fetch all of its dependencies. To stay up to date, run

    git pull origin
    gclient sync

For fetching all branches, add the following into your remote configuration in .git/config:

    fetch = +refs/branch-heads/*:refs/remotes/branch-heads/*
    fetch = +refs/tags/*:refs/tags/*

Contributing

Please follow the instructions mentioned at v8.dev/docs/contribute.