diff --git a/common.gypi b/common.gypi index 6677274f3abe80..04147948287a94 100644 --- a/common.gypi +++ b/common.gypi @@ -25,6 +25,10 @@ # Default to -O0 for debug builds. 'v8_optimized_debug%': 0, + # 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.0', + # Enable disassembler for `--print-code` v8 options 'v8_enable_disassembler': 1, diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn index 494ba22f2934d6..7efbe319fd8cca 100644 --- a/deps/v8/BUILD.gn +++ b/deps/v8/BUILD.gn @@ -39,6 +39,9 @@ declare_args() { # Embeds the given script into the snapshot. v8_embed_script = "" + # Allows the embedder to add a custom suffix to the version string. + v8_embedder_string = "" + # Sets -dENABLE_DISASSEMBLER. v8_enable_disassembler = "" @@ -217,6 +220,9 @@ config("features") { defines = [] + if (v8_embedder_string != "") { + defines += [ "V8_EMBEDDER_STRING=\"$v8_embedder_string\"" ] + } if (v8_enable_disassembler) { defines += [ "ENABLE_DISASSEMBLER" ] } diff --git a/deps/v8/gypfiles/features.gypi b/deps/v8/gypfiles/features.gypi index 0eeec2466ebc51..a17dc556e6bc7e 100644 --- a/deps/v8/gypfiles/features.gypi +++ b/deps/v8/gypfiles/features.gypi @@ -29,6 +29,9 @@ { 'variables': { + # Allows the embedder to add a custom suffix to the version string. + 'v8_embedder_string%': '', + 'v8_enable_disassembler%': 0, 'v8_promise_internal_field_count%': 0, @@ -79,6 +82,9 @@ }, 'target_defaults': { 'conditions': [ + ['v8_embedder_string!=""', { + 'defines': ['V8_EMBEDDER_STRING="<(v8_embedder_string)"',], + }], ['v8_enable_disassembler==1', { 'defines': ['ENABLE_DISASSEMBLER',], }], diff --git a/deps/v8/include/v8-version-string.h b/deps/v8/include/v8-version-string.h index 075282de4ca0e2..eab0934804efd4 100644 --- a/deps/v8/include/v8-version-string.h +++ b/deps/v8/include/v8-version-string.h @@ -16,6 +16,10 @@ #define V8_CANDIDATE_STRING "" #endif +#ifndef V8_EMBEDDER_STRING +#define V8_EMBEDDER_STRING "" +#endif + #define V8_SX(x) #x #define V8_S(x) V8_SX(x) @@ -23,7 +27,7 @@ #define V8_VERSION_STRING \ V8_S(V8_MAJOR_VERSION) \ "." V8_S(V8_MINOR_VERSION) "." V8_S(V8_BUILD_NUMBER) "." V8_S( \ - V8_PATCH_LEVEL) V8_CANDIDATE_STRING + V8_PATCH_LEVEL) V8_EMBEDDER_STRING V8_CANDIDATE_STRING #else #define V8_VERSION_STRING \ V8_S(V8_MAJOR_VERSION) \ diff --git a/deps/v8/src/log-utils.cc b/deps/v8/src/log-utils.cc index 7c3de0c6ca5a6a..bc471403d8d5ed 100644 --- a/deps/v8/src/log-utils.cc +++ b/deps/v8/src/log-utils.cc @@ -55,9 +55,16 @@ void Log::Initialize(const char* log_file_name) { if (output_handle_ != nullptr) { Log::MessageBuilder msg(this); - msg.Append("v8-version,%d,%d,%d,%d,%d", Version::GetMajor(), - Version::GetMinor(), Version::GetBuild(), Version::GetPatch(), - Version::IsCandidate()); + if (strlen(Version::GetEmbedder()) == 0) { + msg.Append("v8-version,%d,%d,%d,%d,%d", Version::GetMajor(), + Version::GetMinor(), Version::GetBuild(), + Version::GetPatch(), Version::IsCandidate()); + } else { + msg.Append("v8-version,%d,%d,%d,%d,%s,%d", Version::GetMajor(), + Version::GetMinor(), Version::GetBuild(), + Version::GetPatch(), Version::GetEmbedder(), + Version::IsCandidate()); + } msg.WriteToLogFile(); } } diff --git a/deps/v8/src/version.cc b/deps/v8/src/version.cc index 3252d550354ee8..b050fc9ab5ebd5 100644 --- a/deps/v8/src/version.cc +++ b/deps/v8/src/version.cc @@ -20,6 +20,7 @@ int Version::major_ = V8_MAJOR_VERSION; int Version::minor_ = V8_MINOR_VERSION; int Version::build_ = V8_BUILD_NUMBER; int Version::patch_ = V8_PATCH_LEVEL; +const char* Version::embedder_ = V8_EMBEDDER_STRING; bool Version::candidate_ = (V8_IS_CANDIDATE_VERSION != 0); const char* Version::soname_ = SONAME; const char* Version::version_string_ = V8_VERSION_STRING; @@ -33,12 +34,12 @@ void Version::GetString(Vector str) { const char* is_simulator = ""; #endif // USE_SIMULATOR if (GetPatch() > 0) { - SNPrintF(str, "%d.%d.%d.%d%s%s", - GetMajor(), GetMinor(), GetBuild(), GetPatch(), candidate, - is_simulator); + SNPrintF(str, "%d.%d.%d.%d%s%s%s", + GetMajor(), GetMinor(), GetBuild(), GetPatch(), GetEmbedder(), + candidate, is_simulator); } else { - SNPrintF(str, "%d.%d.%d%s%s", - GetMajor(), GetMinor(), GetBuild(), candidate, + SNPrintF(str, "%d.%d.%d%s%s%s", + GetMajor(), GetMinor(), GetBuild(), GetEmbedder(), candidate, is_simulator); } } @@ -50,11 +51,11 @@ void Version::GetSONAME(Vector str) { // Generate generic SONAME if no specific SONAME is defined. const char* candidate = IsCandidate() ? "-candidate" : ""; if (GetPatch() > 0) { - SNPrintF(str, "libv8-%d.%d.%d.%d%s.so", - GetMajor(), GetMinor(), GetBuild(), GetPatch(), candidate); + SNPrintF(str, "libv8-%d.%d.%d.%d%s%s.so", GetMajor(), GetMinor(), + GetBuild(), GetPatch(), GetEmbedder(), candidate); } else { - SNPrintF(str, "libv8-%d.%d.%d%s.so", - GetMajor(), GetMinor(), GetBuild(), candidate); + SNPrintF(str, "libv8-%d.%d.%d%s%s.so", GetMajor(), GetMinor(), GetBuild(), + GetEmbedder(), candidate); } } else { // Use specific SONAME. diff --git a/deps/v8/src/version.h b/deps/v8/src/version.h index 3395d7f4fe5589..20d9c71fe76661 100644 --- a/deps/v8/src/version.h +++ b/deps/v8/src/version.h @@ -18,6 +18,7 @@ class Version { static int GetMinor() { return minor_; } static int GetBuild() { return build_; } static int GetPatch() { return patch_; } + static const char* GetEmbedder() { return embedder_; } static bool IsCandidate() { return candidate_; } static uint32_t Hash() { return static_cast( @@ -38,13 +39,15 @@ class Version { static int minor_; static int build_; static int patch_; + static const char* embedder_; static bool candidate_; static const char* soname_; static const char* version_string_; // In test-version.cc. friend void SetVersion(int major, int minor, int build, int patch, - bool candidate, const char* soname); + const char* embedder, bool candidate, + const char* soname); }; } // namespace internal diff --git a/deps/v8/test/cctest/test-version.cc b/deps/v8/test/cctest/test-version.cc index 50fca16871a335..a2449d8ce7ab1e 100644 --- a/deps/v8/test/cctest/test-version.cc +++ b/deps/v8/test/cctest/test-version.cc @@ -37,11 +37,12 @@ namespace v8 { namespace internal { void SetVersion(int major, int minor, int build, int patch, - bool candidate, const char* soname) { + const char* embedder, bool candidate, const char* soname) { Version::major_ = major; Version::minor_ = minor; Version::build_ = build; Version::patch_ = patch; + Version::embedder_ = embedder; Version::candidate_ = candidate; Version::soname_ = soname; } @@ -50,15 +51,15 @@ void SetVersion(int major, int minor, int build, int patch, } // namespace v8 -static void CheckVersion(int major, int minor, int build, - int patch, bool candidate, +static void CheckVersion(int major, int minor, int build, int patch, + const char* embedder, bool candidate, const char* expected_version_string, const char* expected_generic_soname) { static v8::internal::EmbeddedVector version_str; static v8::internal::EmbeddedVector soname_str; // Test version without specific SONAME. - SetVersion(major, minor, build, patch, candidate, ""); + SetVersion(major, minor, build, patch, embedder, candidate, ""); Version::GetString(version_str); CHECK_EQ(0, strcmp(expected_version_string, version_str.start())); Version::GetSONAME(soname_str); @@ -66,7 +67,7 @@ static void CheckVersion(int major, int minor, int build, // Test version with specific SONAME. const char* soname = "libv8.so.1"; - SetVersion(major, minor, build, patch, candidate, soname); + SetVersion(major, minor, build, patch, embedder, candidate, soname); Version::GetString(version_str); CHECK_EQ(0, strcmp(expected_version_string, version_str.start())); Version::GetSONAME(soname_str); @@ -88,18 +89,34 @@ TEST(VersionString) { CheckVersion(2, 5, 10, 7, false, "2.5.10.7 SIMULATOR", "libv8-2.5.10.7.so"); CheckVersion(2, 5, 10, 7, true, "2.5.10.7 (candidate) SIMULATOR", "libv8-2.5.10.7-candidate.so"); + CheckVersion(6, 0, 287, 0, "-emb.1", false, "6.0.287-emb.1 SIMULATOR", + "libv8-6.0.287-emb.1.so"); + CheckVersion(6, 0, 287, 0, "-emb.1", true, "6.0.287-emb.1 (candidate) SIMULATOR", + "libv8-6.0.287-emb.1-candidate.so"); + CheckVersion(6, 0, 287, 53, "-emb.1", false, "6.0.287.53-emb.1 SIMULATOR", + "libv8-6.0.287.53-emb.1.so"); + CheckVersion(6, 0, 287, 53, "-emb.1", true, "6.0.287.53-emb.1 (candidate) SIMULATOR", + "libv8-6.0.287.53-emb.1-candidate.so"); #else - CheckVersion(0, 0, 0, 0, false, "0.0.0", "libv8-0.0.0.so"); - CheckVersion(0, 0, 0, 0, true, - "0.0.0 (candidate)", "libv8-0.0.0-candidate.so"); - CheckVersion(1, 0, 0, 0, false, "1.0.0", "libv8-1.0.0.so"); - CheckVersion(1, 0, 0, 0, true, - "1.0.0 (candidate)", "libv8-1.0.0-candidate.so"); - CheckVersion(1, 0, 0, 1, false, "1.0.0.1", "libv8-1.0.0.1.so"); - CheckVersion(1, 0, 0, 1, true, - "1.0.0.1 (candidate)", "libv8-1.0.0.1-candidate.so"); - CheckVersion(2, 5, 10, 7, false, "2.5.10.7", "libv8-2.5.10.7.so"); - CheckVersion(2, 5, 10, 7, true, - "2.5.10.7 (candidate)", "libv8-2.5.10.7-candidate.so"); + CheckVersion(0, 0, 0, 0, "", false, "0.0.0", "libv8-0.0.0.so"); + CheckVersion(0, 0, 0, 0, "", true, "0.0.0 (candidate)", + "libv8-0.0.0-candidate.so"); + CheckVersion(1, 0, 0, 0, "", false, "1.0.0", "libv8-1.0.0.so"); + CheckVersion(1, 0, 0, 0, "", true, "1.0.0 (candidate)", + "libv8-1.0.0-candidate.so"); + CheckVersion(1, 0, 0, 1, "", false, "1.0.0.1", "libv8-1.0.0.1.so"); + CheckVersion(1, 0, 0, 1, "", true, "1.0.0.1 (candidate)", + "libv8-1.0.0.1-candidate.so"); + CheckVersion(2, 5, 10, 7, "", false, "2.5.10.7", "libv8-2.5.10.7.so"); + CheckVersion(2, 5, 10, 7, "", true, "2.5.10.7 (candidate)", + "libv8-2.5.10.7-candidate.so"); + CheckVersion(6, 0, 287, 0, "-emb.1", false, "6.0.287-emb.1", + "libv8-6.0.287-emb.1.so"); + CheckVersion(6, 0, 287, 0, "-emb.1", true, "6.0.287-emb.1 (candidate)", + "libv8-6.0.287-emb.1-candidate.so"); + CheckVersion(6, 0, 287, 53, "-emb.1", false, "6.0.287.53-emb.1", + "libv8-6.0.287.53-emb.1.so"); + CheckVersion(6, 0, 287, 53, "-emb.1", true, "6.0.287.53-emb.1 (candidate)", + "libv8-6.0.287.53-emb.1-candidate.so"); #endif } diff --git a/doc/api/process.md b/doc/api/process.md index 8b8ce0f43dd0d2..ca5f13ed5615c5 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -1790,6 +1790,9 @@ changes: - version: v4.2.0 pr-url: https://github.com/nodejs/node/pull/3102 description: The `icu` property is now supported. + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/15785 + description: The `v8` property now includes a Node.js specific suffix. --> * {Object} @@ -1810,7 +1813,7 @@ Will generate an object similar to: { http_parser: '2.3.0', node: '1.1.1', - v8: '4.1.0.14', + v8: '6.1.534.42-node.0', uv: '1.3.0', zlib: '1.2.8', ares: '1.10.0-DEV', diff --git a/doc/guides/maintaining-V8.md b/doc/guides/maintaining-V8.md index e917ca439c9001..76601ab00ee293 100644 --- a/doc/guides/maintaining-V8.md +++ b/doc/guides/maintaining-V8.md @@ -167,7 +167,8 @@ to be cherry-picked in the Node.js repository and V8-CI must test the change. * For each abandoned V8 branch corresponding to an LTS branch that is affected by the bug: * Open a cherry-pick PR on nodejs/node targeting the appropriate *vY.x-staging* branch (e.g. *v6.x-staging* to fix an issue in V8-5.1). - * Increase the patch level version in v8-version.h. This will not cause any problems with versioning because V8 will not publish other patches for this branch, so Node.js can effectively bump the patch version. + * On Node.js < 9.0.0: Increase the patch level version in v8-version.h. This will not cause any problems with versioning because V8 will not publish other patches for this branch, so Node.js can effectively bump the patch version. + * On Node.js >= 9.0.0: Increase the `v8_embedder_string` number in `common.gypi`. * In some cases the patch may require extra effort to merge in case V8 has changed substantially. For important issues we may be able to lean on the V8 team to get help with reimplementing the patch. * Run the Node.js [V8-CI](https://ci.nodejs.org/job/node-test-commit-v8-linux/) in addition to the [Node.js CI](https://ci.nodejs.org/job/node-test-pull-request/). @@ -264,6 +265,7 @@ above. A better strategy is to 1. Audit the current master branch and look at the patches that have been floated since the last major V8 update. 1. Replace the copy of V8 in Node.js with a fresh checkout of the latest stable V8 branch. Special care must be taken to recursively update the DEPS that V8 has a compile time dependency on (at the moment of this writing, these are only trace_event and gtest_prod.h) +1. Reset the `v8_embedder_string` variable to "-node.0" in `common.gypi`. 1. Refloat (cherry-pick) all the patches from list computed in 1) as necessary. Some of the patches may no longer be necessary. To audit for floating patches: diff --git a/lib/internal/v8_prof_polyfill.js b/lib/internal/v8_prof_polyfill.js index e77f1f76bcb9ee..1c9ba4ebc546fc 100644 --- a/lib/internal/v8_prof_polyfill.js +++ b/lib/internal/v8_prof_polyfill.js @@ -82,14 +82,16 @@ function readline() { } function versionCheck() { - // v8-version looks like "v8-version,$major,$minor,$build,$patch,$candidate" - // whereas process.versions.v8 is either "$major.$minor.$build" or - // "$major.$minor.$build.$patch". + // v8-version looks like + // "v8-version,$major,$minor,$build,$patch[,$embedder],$candidate" + // whereas process.versions.v8 is either "$major.$minor.$build-$embedder" or + // "$major.$minor.$build.$patch-$embedder". var firstLine = readline(); line = firstLine + '\n' + line; firstLine = firstLine.split(','); - const curVer = process.versions.v8.split('.'); - if (firstLine.length !== 6 && firstLine[0] !== 'v8-version') { + const curVer = process.versions.v8.split(/\.-/); + if (firstLine.length !== 6 && firstLine.length !== 7 || + firstLine[0] !== 'v8-version') { console.log('Unable to read v8-version from log file.'); return; } diff --git a/test/parallel/test-process-versions.js b/test/parallel/test-process-versions.js index 65634ece6ce8e7..5644ac4658b534 100644 --- a/test/parallel/test-process-versions.js +++ b/test/parallel/test-process-versions.js @@ -29,7 +29,7 @@ assert(commonTemplate.test(process.versions.node)); assert(commonTemplate.test(process.versions.uv)); assert(commonTemplate.test(process.versions.zlib)); -assert(/^\d+\.\d+\.\d+(?:\.\d+)?(?: \(candidate\))?$/ +assert(/^\d+\.\d+\.\d+(?:\.\d+)?-node\.\d+(?: \(candidate\))?$/ .test(process.versions.v8)); assert(/^\d+$/.test(process.versions.modules));