From 1be57c2037057ee7baa5ac66fabfc7921b4174de Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Fri, 15 Aug 2025 10:45:30 +0100 Subject: [PATCH] src: iterate metadata version entries with std::array PR-URL: https://github.com/nodejs/node/pull/57866 Refs: https://github.com/nodejs/diagnostics/issues/654 Refs: https://github.com/google/perfetto/blob/9ddf987d48cdfd9129987a3af1e85052c377756f/include/perfetto/tracing/traced_value.h#L46 Reviewed-By: James M Snell Reviewed-By: Joyee Cheung --- src/node_metadata.cc | 22 ++++++++++++++++++++++ src/node_metadata.h | 10 ++++++++++ src/node_process_object.cc | 19 +------------------ src/node_report.cc | 19 +------------------ src/tracing/traced_value.cc | 10 +++------- 5 files changed, 37 insertions(+), 43 deletions(-) diff --git a/src/node_metadata.cc b/src/node_metadata.cc index 87aa96cfdc..6544999b84 100644 --- a/src/node_metadata.cc +++ b/src/node_metadata.cc @@ -161,6 +161,28 @@ Metadata::Versions::Versions() { nbytes = NBYTES_VERSION; } +std::array, + NODE_VERSIONS_KEY_COUNT> +Metadata::Versions::pairs() const { + std::array, + NODE_VERSIONS_KEY_COUNT> + versions_array; + auto slot = versions_array.begin(); + +#define V(key) \ + do { \ + *slot++ = std::pair( \ + #key, per_process::metadata.versions.key); \ + } while (0); + NODE_VERSIONS_KEYS(V) +#undef V + + std::ranges::sort(versions_array, + [](auto& a, auto& b) { return a.first < b.first; }); + + return versions_array; +} + Metadata::Release::Release() : name(NODE_RELEASE) { #if NODE_VERSION_IS_LTS lts = NODE_VERSION_LTS_CODENAME; diff --git a/src/node_metadata.h b/src/node_metadata.h index 7b2072ad39..d9c533f100 100644 --- a/src/node_metadata.h +++ b/src/node_metadata.h @@ -3,7 +3,9 @@ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS +#include #include +#include #include "node_version.h" #if HAVE_OPENSSL @@ -98,6 +100,10 @@ namespace node { NODE_VERSIONS_KEY_QUIC(V) \ NODE_VERSIONS_KEY_SQLITE(V) +#define V(key) +1 +constexpr int NODE_VERSIONS_KEY_COUNT = NODE_VERSIONS_KEYS(V); +#undef V + class Metadata { public: Metadata(); @@ -118,6 +124,10 @@ class Metadata { #define V(key) std::string key; NODE_VERSIONS_KEYS(V) #undef V + + std::array, + NODE_VERSIONS_KEY_COUNT> + pairs() const; }; struct Release { diff --git a/src/node_process_object.cc b/src/node_process_object.cc index 5138ef7d61..5f5af63486 100644 --- a/src/node_process_object.cc +++ b/src/node_process_object.cc @@ -83,24 +83,7 @@ static void SetVersions(Isolate* isolate, Local versions) { READONLY_STRING_PROPERTY( versions, "node", per_process::metadata.versions.node); -#define V(key) +1 - std::pair - versions_array[NODE_VERSIONS_KEYS(V)]; -#undef V - auto* slot = &versions_array[0]; - -#define V(key) \ - do { \ - *slot++ = std::pair( \ - #key, per_process::metadata.versions.key); \ - } while (0); - NODE_VERSIONS_KEYS(V) -#undef V - - std::ranges::sort(versions_array, - [](auto& a, auto& b) { return a.first < b.first; }); - - for (const auto& version : versions_array) { + for (const auto& version : per_process::metadata.versions.pairs()) { versions ->DefineOwnProperty(context, OneByteString(isolate, version.first), diff --git a/src/node_report.cc b/src/node_report.cc index 1b5fd64726..ff69d3b44b 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -797,24 +797,7 @@ static void PrintComponentVersions(JSONWriter* writer) { writer->json_objectstart("componentVersions"); -#define V(key) +1 - std::pair - versions_array[NODE_VERSIONS_KEYS(V)]; -#undef V - auto* slot = &versions_array[0]; - -#define V(key) \ - do { \ - *slot++ = std::pair( \ - #key, per_process::metadata.versions.key); \ - } while (0); - NODE_VERSIONS_KEYS(V) -#undef V - - std::ranges::sort(versions_array, - [](auto& a, auto& b) { return a.first < b.first; }); - - for (const auto& version : versions_array) { + for (const auto& version : per_process::metadata.versions.pairs()) { writer->json_keyvalue(version.first, version.second); } diff --git a/src/tracing/traced_value.cc b/src/tracing/traced_value.cc index ddcd855995..46c15ae8f1 100644 --- a/src/tracing/traced_value.cc +++ b/src/tracing/traced_value.cc @@ -239,13 +239,9 @@ std::unique_ptr AsyncWrapArgs::Cast() const { std::unique_ptr ProcessMeta::Cast() const { auto trace_process = tracing::TracedValue::Create(); trace_process->BeginDictionary("versions"); - -#define V(key) \ - trace_process->SetString(#key, per_process::metadata.versions.key.c_str()); - - NODE_VERSIONS_KEYS(V) -#undef V - + for (const auto& version : per_process::metadata.versions.pairs()) { + trace_process->SetString(version.first.data(), version.second.data()); + } trace_process->EndDictionary(); trace_process->SetString("arch", per_process::metadata.arch.c_str());