From 49bb0ae8c67afa8aa9f1fea6416a52905a22f883 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Sat, 19 Apr 2025 15:41:26 -0700 Subject: [PATCH] src: use macros to reduce code duplication is cares_wrap PR-URL: https://github.com/nodejs/node/pull/57937 Reviewed-By: Yagiz Nizipli --- src/README.md | 2 +- src/cares_wrap.cc | 53 +++++------------ src/cares_wrap.h | 141 ++++++++++------------------------------------ 3 files changed, 46 insertions(+), 150 deletions(-) diff --git a/src/README.md b/src/README.md index 4471dd7721..a97e1b9ba5 100644 --- a/src/README.md +++ b/src/README.md @@ -474,7 +474,7 @@ void Initialize(Local target, SetProtoMethod(isolate, channel_wrap, "queryA", Query); // ... SetProtoMethod(isolate, channel_wrap, "querySoa", Query); - SetProtoMethod(isolate, channel_wrap, "getHostByAddr", Query); + SetProtoMethod(isolate, channel_wrap, "getHostByAddr", Query); SetProtoMethodNoSideEffect(isolate, channel_wrap, "getServers", GetServers); diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 8e1c28a2c8..6290bcd37f 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -1612,7 +1612,7 @@ Maybe SoaTraits::Parse(QuerySoaWrap* wrap, return Just(ARES_SUCCESS); } -int ReverseTraits::Send(GetHostByAddrWrap* wrap, const char* name) { +int ReverseTraits::Send(QueryReverseWrap* wrap, const char* name) { int length, family; char address_buffer[sizeof(struct in6_addr)]; @@ -1631,17 +1631,16 @@ int ReverseTraits::Send(GetHostByAddrWrap* wrap, const char* name) { "name", TRACE_STR_COPY(name), "family", family == AF_INET ? "ipv4" : "ipv6"); - ares_gethostbyaddr( - wrap->channel()->cares_channel(), - address_buffer, - length, - family, - GetHostByAddrWrap::Callback, - wrap->MakeCallbackPointer()); + ares_gethostbyaddr(wrap->channel()->cares_channel(), + address_buffer, + length, + family, + QueryReverseWrap::Callback, + wrap->MakeCallbackPointer()); return ARES_SUCCESS; } -Maybe ReverseTraits::Parse(GetHostByAddrWrap* wrap, +Maybe ReverseTraits::Parse(QueryReverseWrap* wrap, const std::unique_ptr& response) { if (!response->is_host) [[unlikely]] { return Just(ARES_EBADRESP); @@ -2220,21 +2219,10 @@ void Initialize(Local target, ChannelWrap::kInternalFieldCount); channel_wrap->Inherit(AsyncWrap::GetConstructorTemplate(env)); - SetProtoMethod(isolate, channel_wrap, "queryAny", Query); - SetProtoMethod(isolate, channel_wrap, "queryA", Query); - SetProtoMethod(isolate, channel_wrap, "queryAaaa", Query); - SetProtoMethod(isolate, channel_wrap, "queryCaa", Query); - SetProtoMethod(isolate, channel_wrap, "queryCname", Query); - SetProtoMethod(isolate, channel_wrap, "queryMx", Query); - SetProtoMethod(isolate, channel_wrap, "queryNs", Query); - SetProtoMethod(isolate, channel_wrap, "queryTlsa", Query); - SetProtoMethod(isolate, channel_wrap, "queryTxt", Query); - SetProtoMethod(isolate, channel_wrap, "querySrv", Query); - SetProtoMethod(isolate, channel_wrap, "queryPtr", Query); - SetProtoMethod(isolate, channel_wrap, "queryNaptr", Query); - SetProtoMethod(isolate, channel_wrap, "querySoa", Query); - SetProtoMethod( - isolate, channel_wrap, "getHostByAddr", Query); +#define V(Name, _, JS) \ + SetProtoMethod(isolate, channel_wrap, #JS, Query); + QUERY_TYPES(V) +#undef V SetProtoMethodNoSideEffect(isolate, channel_wrap, "getServers", GetServers); SetProtoMethod(isolate, channel_wrap, "setServers", SetServers); @@ -2252,20 +2240,9 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(StrError); registry->Register(ChannelWrap::New); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); - registry->Register(Query); +#define V(Name, _, __) registry->Register(Query); + QUERY_TYPES(V) +#undef V registry->Register(GetServers); registry->Register(SetServers); diff --git a/src/cares_wrap.h b/src/cares_wrap.h index bd6e0fe99c..081c8e0217 100644 --- a/src/cares_wrap.h +++ b/src/cares_wrap.h @@ -406,119 +406,38 @@ class QueryWrap final : public AsyncWrap { QueryWrap** callback_ptr_ = nullptr; }; -struct AnyTraits final { - static constexpr const char* name = "resolveAny"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; +#define QUERY_TYPES(V) \ + V(Reverse, reverse, getHostByAddr) \ + V(A, resolve4, queryA) \ + V(Any, resolveAny, queryAny) \ + V(Aaaa, resolve6, queryAaaa) \ + V(Caa, resolveCaa, queryCaa) \ + V(Cname, resolveCname, queryCname) \ + V(Mx, resolveMx, queryMx) \ + V(Naptr, resolveNaptr, queryNaptr) \ + V(Ns, resolveNs, queryNs) \ + V(Ptr, resolvePtr, queryPtr) \ + V(Srv, resolveSrv, querySrv) \ + V(Soa, resolveSoa, querySoa) \ + V(Tlsa, resolveTlsa, queryTlsa) \ + V(Txt, resolveTxt, queryTxt) -struct ATraits final { - static constexpr const char* name = "resolve4"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct AaaaTraits final { - static constexpr const char* name = "resolve6"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct CaaTraits final { - static constexpr const char* name = "resolveCaa"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct CnameTraits final { - static constexpr const char* name = "resolveCname"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct MxTraits final { - static constexpr const char* name = "resolveMx"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct NsTraits final { - static constexpr const char* name = "resolveNs"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct TlsaTraits final { - static constexpr const char* name = "resolveTlsa"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct TxtTraits final { - static constexpr const char* name = "resolveTxt"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct SrvTraits final { - static constexpr const char* name = "resolveSrv"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct PtrTraits final { - static constexpr const char* name = "resolvePtr"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct NaptrTraits final { - static constexpr const char* name = "resolveNaptr"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct SoaTraits final { - static constexpr const char* name = "resolveSoa"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -struct ReverseTraits final { - static constexpr const char* name = "reverse"; - static int Send(QueryWrap* wrap, const char* name); - static v8::Maybe Parse(QueryWrap* wrap, - const std::unique_ptr& response); -}; - -using QueryAnyWrap = QueryWrap; -using QueryAWrap = QueryWrap; -using QueryAaaaWrap = QueryWrap; -using QueryCaaWrap = QueryWrap; -using QueryCnameWrap = QueryWrap; -using QueryMxWrap = QueryWrap; -using QueryNsWrap = QueryWrap; -using QueryTlsaWrap = QueryWrap; -using QueryTxtWrap = QueryWrap; -using QuerySrvWrap = QueryWrap; -using QueryPtrWrap = QueryWrap; -using QueryNaptrWrap = QueryWrap; -using QuerySoaWrap = QueryWrap; -using GetHostByAddrWrap = QueryWrap; +// All query type handlers share the same basic structure, so we can simplify +// the code a bit by using a macro to define that structure. +#define TYPE_TRAITS(Name, label) \ + struct Name##Traits final { \ + static constexpr const char* name = #label; \ + static int Send(QueryWrap* wrap, const char* name); \ + static v8::Maybe Parse( \ + QueryWrap* wrap, \ + const std::unique_ptr& response); \ + }; \ + using Query##Name##Wrap = QueryWrap; +#define V(NAME, LABEL, _) TYPE_TRAITS(NAME, LABEL) +QUERY_TYPES(V) +#undef V +#undef TYPE_TRAITS } // namespace cares_wrap } // namespace node