From 8ab84651811c669a23a4ba05301d84d60290e97b Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 4 Aug 2025 18:08:15 +0200 Subject: [PATCH 1/2] src: remove `std::array` overload of `FIXED_ONE_BYTE_STRING` This overload was only used in one place, in a cold path, and in particular in a place where the compiler would be able to generate the exact same code using just a call to `.size()`. --- src/node_os.cc | 2 +- src/util.h | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/node_os.cc b/src/node_os.cc index f2b449ac0d93f7..c6c6b42028068e 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -260,7 +260,7 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo& args) { result.emplace_back(OneByteString(isolate, ip)); result.emplace_back(OneByteString(isolate, netmask)); result.emplace_back(family); - result.emplace_back(FIXED_ONE_BYTE_STRING(isolate, mac)); + result.emplace_back(OneByteString(isolate, mac.data(), mac.size() - 1)); result.emplace_back( Boolean::New(env->isolate(), interfaces[i].is_internal)); if (interfaces[i].address.address4.sin_family == AF_INET6) { diff --git a/src/util.h b/src/util.h index b6f49bcf8e7eab..7bb01b07f0f655 100644 --- a/src/util.h +++ b/src/util.h @@ -356,14 +356,6 @@ inline v8::Local FIXED_ONE_BYTE_STRING(v8::Isolate* isolate, return OneByteString(isolate, data, N - 1); } -template - requires(N > 0) -inline v8::Local FIXED_ONE_BYTE_STRING( - v8::Isolate* isolate, const std::array& arr) { - CHECK_EQ(arr[N - 1], '\0'); - return OneByteString(isolate, arr.data(), N - 1); -} - // tolower() is locale-sensitive. Use ToLower() instead. inline char ToLower(char c); inline std::string ToLower(const std::string& in); From 8a673d236e783d2150be11b77369a9118050ab53 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 4 Aug 2025 18:58:33 +0200 Subject: [PATCH 2/2] src: create strings in `FIXED_ONE_BYTE_STRING` as internalized These string keys can generally be assumed to be long-lived. --- src/util-inl.h | 31 ++++++++++++++++--------------- src/util.h | 32 ++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/util-inl.h b/src/util-inl.h index fbce06d7cef9c2..b55dc25b98c551 100644 --- a/src/util-inl.h +++ b/src/util-inl.h @@ -160,33 +160,34 @@ constexpr ContainerOfHelper ContainerOf(Inner Outer::*field, inline v8::Local OneByteString(v8::Isolate* isolate, const char* data, - int length) { - return v8::String::NewFromOneByte(isolate, - reinterpret_cast(data), - v8::NewStringType::kNormal, - length).ToLocalChecked(); + int length, + v8::NewStringType type) { + return v8::String::NewFromOneByte( + isolate, reinterpret_cast(data), type, length) + .ToLocalChecked(); } inline v8::Local OneByteString(v8::Isolate* isolate, const signed char* data, - int length) { - return v8::String::NewFromOneByte(isolate, - reinterpret_cast(data), - v8::NewStringType::kNormal, - length).ToLocalChecked(); + int length, + v8::NewStringType type) { + return v8::String::NewFromOneByte( + isolate, reinterpret_cast(data), type, length) + .ToLocalChecked(); } inline v8::Local OneByteString(v8::Isolate* isolate, const unsigned char* data, - int length) { - return v8::String::NewFromOneByte( - isolate, data, v8::NewStringType::kNormal, length) + int length, + v8::NewStringType type) { + return v8::String::NewFromOneByte(isolate, data, type, length) .ToLocalChecked(); } inline v8::Local OneByteString(v8::Isolate* isolate, - std::string_view str) { - return OneByteString(isolate, str.data(), str.size()); + std::string_view str, + v8::NewStringType type) { + return OneByteString(isolate, str.data(), str.size(), type); } char ToLower(char c) { diff --git a/src/util.h b/src/util.h index 7bb01b07f0f655..62ee2fe3207505 100644 --- a/src/util.h +++ b/src/util.h @@ -331,21 +331,29 @@ class KVStore { }; // Convenience wrapper around v8::String::NewFromOneByte(). -inline v8::Local OneByteString(v8::Isolate* isolate, - const char* data, - int length = -1); +inline v8::Local OneByteString( + v8::Isolate* isolate, + const char* data, + int length = -1, + v8::NewStringType type = v8::NewStringType::kNormal); // For the people that compile with -funsigned-char. -inline v8::Local OneByteString(v8::Isolate* isolate, - const signed char* data, - int length = -1); +inline v8::Local OneByteString( + v8::Isolate* isolate, + const signed char* data, + int length = -1, + v8::NewStringType type = v8::NewStringType::kNormal); -inline v8::Local OneByteString(v8::Isolate* isolate, - const unsigned char* data, - int length = -1); +inline v8::Local OneByteString( + v8::Isolate* isolate, + const unsigned char* data, + int length = -1, + v8::NewStringType type = v8::NewStringType::kNormal); -inline v8::Local OneByteString(v8::Isolate* isolate, - std::string_view str); +inline v8::Local OneByteString( + v8::Isolate* isolate, + std::string_view str, + v8::NewStringType type = v8::NewStringType::kNormal); // Used to be a macro, hence the uppercase name. template @@ -353,7 +361,7 @@ template inline v8::Local FIXED_ONE_BYTE_STRING(v8::Isolate* isolate, const char (&data)[N]) { CHECK_EQ(data[N - 1], '\0'); - return OneByteString(isolate, data, N - 1); + return OneByteString(isolate, data, N - 1, v8::NewStringType::kInternalized); } // tolower() is locale-sensitive. Use ToLower() instead.