Skip to content

Commit 4e02f23

Browse files
jasnellRafaelGSS
authored andcommitted
src: use macros to reduce code duplication is cares_wrap
PR-URL: #57937 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
1 parent f36d300 commit 4e02f23

File tree

3 files changed

+48
-152
lines changed

3 files changed

+48
-152
lines changed

src/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ void Initialize(Local<Object> target,
474474
SetProtoMethod(isolate, channel_wrap, "queryA", Query<QueryAWrap>);
475475
// ...
476476
SetProtoMethod(isolate, channel_wrap, "querySoa", Query<QuerySoaWrap>);
477-
SetProtoMethod(isolate, channel_wrap, "getHostByAddr", Query<GetHostByAddrWrap>);
477+
SetProtoMethod(isolate, channel_wrap, "getHostByAddr", Query<QueryReverseWrap>);
478478

479479
SetProtoMethodNoSideEffect(isolate, channel_wrap, "getServers", GetServers);
480480

src/cares_wrap.cc

Lines changed: 15 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,7 +1612,7 @@ Maybe<int> SoaTraits::Parse(QuerySoaWrap* wrap,
16121612
return Just<int>(ARES_SUCCESS);
16131613
}
16141614

1615-
int ReverseTraits::Send(GetHostByAddrWrap* wrap, const char* name) {
1615+
int ReverseTraits::Send(QueryReverseWrap* wrap, const char* name) {
16161616
int length, family;
16171617
char address_buffer[sizeof(struct in6_addr)];
16181618

@@ -1631,17 +1631,16 @@ int ReverseTraits::Send(GetHostByAddrWrap* wrap, const char* name) {
16311631
"name", TRACE_STR_COPY(name),
16321632
"family", family == AF_INET ? "ipv4" : "ipv6");
16331633

1634-
ares_gethostbyaddr(
1635-
wrap->channel()->cares_channel(),
1636-
address_buffer,
1637-
length,
1638-
family,
1639-
GetHostByAddrWrap::Callback,
1640-
wrap->MakeCallbackPointer());
1634+
ares_gethostbyaddr(wrap->channel()->cares_channel(),
1635+
address_buffer,
1636+
length,
1637+
family,
1638+
QueryReverseWrap::Callback,
1639+
wrap->MakeCallbackPointer());
16411640
return ARES_SUCCESS;
16421641
}
16431642

1644-
Maybe<int> ReverseTraits::Parse(GetHostByAddrWrap* wrap,
1643+
Maybe<int> ReverseTraits::Parse(QueryReverseWrap* wrap,
16451644
const std::unique_ptr<ResponseData>& response) {
16461645
if (!response->is_host) [[unlikely]] {
16471646
return Just<int>(ARES_EBADRESP);
@@ -2220,21 +2219,10 @@ void Initialize(Local<Object> target,
22202219
ChannelWrap::kInternalFieldCount);
22212220
channel_wrap->Inherit(AsyncWrap::GetConstructorTemplate(env));
22222221

2223-
SetProtoMethod(isolate, channel_wrap, "queryAny", Query<QueryAnyWrap>);
2224-
SetProtoMethod(isolate, channel_wrap, "queryA", Query<QueryAWrap>);
2225-
SetProtoMethod(isolate, channel_wrap, "queryAaaa", Query<QueryAaaaWrap>);
2226-
SetProtoMethod(isolate, channel_wrap, "queryCaa", Query<QueryCaaWrap>);
2227-
SetProtoMethod(isolate, channel_wrap, "queryCname", Query<QueryCnameWrap>);
2228-
SetProtoMethod(isolate, channel_wrap, "queryMx", Query<QueryMxWrap>);
2229-
SetProtoMethod(isolate, channel_wrap, "queryNs", Query<QueryNsWrap>);
2230-
SetProtoMethod(isolate, channel_wrap, "queryTlsa", Query<QueryTlsaWrap>);
2231-
SetProtoMethod(isolate, channel_wrap, "queryTxt", Query<QueryTxtWrap>);
2232-
SetProtoMethod(isolate, channel_wrap, "querySrv", Query<QuerySrvWrap>);
2233-
SetProtoMethod(isolate, channel_wrap, "queryPtr", Query<QueryPtrWrap>);
2234-
SetProtoMethod(isolate, channel_wrap, "queryNaptr", Query<QueryNaptrWrap>);
2235-
SetProtoMethod(isolate, channel_wrap, "querySoa", Query<QuerySoaWrap>);
2236-
SetProtoMethod(
2237-
isolate, channel_wrap, "getHostByAddr", Query<GetHostByAddrWrap>);
2222+
#define V(Name, _, JS) \
2223+
SetProtoMethod(isolate, channel_wrap, #JS, Query<Query##Name##Wrap>);
2224+
QUERY_TYPES(V)
2225+
#undef V
22382226

22392227
SetProtoMethodNoSideEffect(isolate, channel_wrap, "getServers", GetServers);
22402228
SetProtoMethod(isolate, channel_wrap, "setServers", SetServers);
@@ -2252,20 +2240,9 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
22522240
registry->Register(StrError);
22532241
registry->Register(ChannelWrap::New);
22542242

2255-
registry->Register(Query<QueryAnyWrap>);
2256-
registry->Register(Query<QueryAWrap>);
2257-
registry->Register(Query<QueryAaaaWrap>);
2258-
registry->Register(Query<QueryCaaWrap>);
2259-
registry->Register(Query<QueryCnameWrap>);
2260-
registry->Register(Query<QueryMxWrap>);
2261-
registry->Register(Query<QueryNsWrap>);
2262-
registry->Register(Query<QueryTlsaWrap>);
2263-
registry->Register(Query<QueryTxtWrap>);
2264-
registry->Register(Query<QuerySrvWrap>);
2265-
registry->Register(Query<QueryPtrWrap>);
2266-
registry->Register(Query<QueryNaptrWrap>);
2267-
registry->Register(Query<QuerySoaWrap>);
2268-
registry->Register(Query<GetHostByAddrWrap>);
2243+
#define V(Name, _, __) registry->Register(Query<Query##Name##Wrap>);
2244+
QUERY_TYPES(V)
2245+
#undef V
22692246

22702247
registry->Register(GetServers);
22712248
registry->Register(SetServers);

src/cares_wrap.h

Lines changed: 32 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -406,119 +406,38 @@ class QueryWrap final : public AsyncWrap {
406406
QueryWrap<Traits>** callback_ptr_ = nullptr;
407407
};
408408

409-
struct AnyTraits final {
410-
static constexpr const char* name = "resolveAny";
411-
static int Send(QueryWrap<AnyTraits>* wrap, const char* name);
412-
static v8::Maybe<int> Parse(QueryWrap<AnyTraits>* wrap,
413-
const std::unique_ptr<ResponseData>& response);
414-
};
415-
416-
struct ATraits final {
417-
static constexpr const char* name = "resolve4";
418-
static int Send(QueryWrap<ATraits>* wrap, const char* name);
419-
static v8::Maybe<int> Parse(QueryWrap<ATraits>* wrap,
420-
const std::unique_ptr<ResponseData>& response);
421-
};
422-
423-
struct AaaaTraits final {
424-
static constexpr const char* name = "resolve6";
425-
static int Send(QueryWrap<AaaaTraits>* wrap, const char* name);
426-
static v8::Maybe<int> Parse(QueryWrap<AaaaTraits>* wrap,
427-
const std::unique_ptr<ResponseData>& response);
428-
};
429-
430-
struct CaaTraits final {
431-
static constexpr const char* name = "resolveCaa";
432-
static int Send(QueryWrap<CaaTraits>* wrap, const char* name);
433-
static v8::Maybe<int> Parse(QueryWrap<CaaTraits>* wrap,
434-
const std::unique_ptr<ResponseData>& response);
435-
};
436-
437-
struct CnameTraits final {
438-
static constexpr const char* name = "resolveCname";
439-
static int Send(QueryWrap<CnameTraits>* wrap, const char* name);
440-
static v8::Maybe<int> Parse(QueryWrap<CnameTraits>* wrap,
441-
const std::unique_ptr<ResponseData>& response);
442-
};
443-
444-
struct MxTraits final {
445-
static constexpr const char* name = "resolveMx";
446-
static int Send(QueryWrap<MxTraits>* wrap, const char* name);
447-
static v8::Maybe<int> Parse(QueryWrap<MxTraits>* wrap,
448-
const std::unique_ptr<ResponseData>& response);
449-
};
450-
451-
struct NsTraits final {
452-
static constexpr const char* name = "resolveNs";
453-
static int Send(QueryWrap<NsTraits>* wrap, const char* name);
454-
static v8::Maybe<int> Parse(QueryWrap<NsTraits>* wrap,
455-
const std::unique_ptr<ResponseData>& response);
456-
};
457-
458-
struct TlsaTraits final {
459-
static constexpr const char* name = "resolveTlsa";
460-
static int Send(QueryWrap<TlsaTraits>* wrap, const char* name);
461-
static v8::Maybe<int> Parse(QueryWrap<TlsaTraits>* wrap,
462-
const std::unique_ptr<ResponseData>& response);
463-
};
464-
465-
struct TxtTraits final {
466-
static constexpr const char* name = "resolveTxt";
467-
static int Send(QueryWrap<TxtTraits>* wrap, const char* name);
468-
static v8::Maybe<int> Parse(QueryWrap<TxtTraits>* wrap,
469-
const std::unique_ptr<ResponseData>& response);
470-
};
471-
472-
struct SrvTraits final {
473-
static constexpr const char* name = "resolveSrv";
474-
static int Send(QueryWrap<SrvTraits>* wrap, const char* name);
475-
static v8::Maybe<int> Parse(QueryWrap<SrvTraits>* wrap,
476-
const std::unique_ptr<ResponseData>& response);
477-
};
478-
479-
struct PtrTraits final {
480-
static constexpr const char* name = "resolvePtr";
481-
static int Send(QueryWrap<PtrTraits>* wrap, const char* name);
482-
static v8::Maybe<int> Parse(QueryWrap<PtrTraits>* wrap,
483-
const std::unique_ptr<ResponseData>& response);
484-
};
485-
486-
struct NaptrTraits final {
487-
static constexpr const char* name = "resolveNaptr";
488-
static int Send(QueryWrap<NaptrTraits>* wrap, const char* name);
489-
static v8::Maybe<int> Parse(QueryWrap<NaptrTraits>* wrap,
490-
const std::unique_ptr<ResponseData>& response);
491-
};
492-
493-
struct SoaTraits final {
494-
static constexpr const char* name = "resolveSoa";
495-
static int Send(QueryWrap<SoaTraits>* wrap, const char* name);
496-
static v8::Maybe<int> Parse(QueryWrap<SoaTraits>* wrap,
497-
const std::unique_ptr<ResponseData>& response);
498-
};
499-
500-
struct ReverseTraits final {
501-
static constexpr const char* name = "reverse";
502-
static int Send(QueryWrap<ReverseTraits>* wrap, const char* name);
503-
static v8::Maybe<int> Parse(QueryWrap<ReverseTraits>* wrap,
504-
const std::unique_ptr<ResponseData>& response);
505-
};
506-
507-
using QueryAnyWrap = QueryWrap<AnyTraits>;
508-
using QueryAWrap = QueryWrap<ATraits>;
509-
using QueryAaaaWrap = QueryWrap<AaaaTraits>;
510-
using QueryCaaWrap = QueryWrap<CaaTraits>;
511-
using QueryCnameWrap = QueryWrap<CnameTraits>;
512-
using QueryMxWrap = QueryWrap<MxTraits>;
513-
using QueryNsWrap = QueryWrap<NsTraits>;
514-
using QueryTlsaWrap = QueryWrap<TlsaTraits>;
515-
using QueryTxtWrap = QueryWrap<TxtTraits>;
516-
using QuerySrvWrap = QueryWrap<SrvTraits>;
517-
using QueryPtrWrap = QueryWrap<PtrTraits>;
518-
using QueryNaptrWrap = QueryWrap<NaptrTraits>;
519-
using QuerySoaWrap = QueryWrap<SoaTraits>;
520-
using GetHostByAddrWrap = QueryWrap<ReverseTraits>;
521-
409+
#define QUERY_TYPES(V) \
410+
V(Reverse, reverse, getHostByAddr) \
411+
V(A, resolve4, queryA) \
412+
V(Any, resolveAny, queryAny) \
413+
V(Aaaa, resolve6, queryAaaa) \
414+
V(Caa, resolveCaa, queryCaa) \
415+
V(Cname, resolveCname, queryCname) \
416+
V(Mx, resolveMx, queryMx) \
417+
V(Naptr, resolveNaptr, queryNaptr) \
418+
V(Ns, resolveNs, queryNs) \
419+
V(Ptr, resolvePtr, queryPtr) \
420+
V(Srv, resolveSrv, querySrv) \
421+
V(Soa, resolveSoa, querySoa) \
422+
V(Tlsa, resolveTlsa, queryTlsa) \
423+
V(Txt, resolveTxt, queryTxt)
424+
425+
// All query type handlers share the same basic structure, so we can simplify
426+
// the code a bit by using a macro to define that structure.
427+
#define TYPE_TRAITS(Name, label) \
428+
struct Name##Traits final { \
429+
static constexpr const char* name = #label; \
430+
static int Send(QueryWrap<Name##Traits>* wrap, const char* name); \
431+
static v8::Maybe<int> Parse( \
432+
QueryWrap<Name##Traits>* wrap, \
433+
const std::unique_ptr<ResponseData>& response); \
434+
}; \
435+
using Query##Name##Wrap = QueryWrap<Name##Traits>;
436+
437+
#define V(NAME, LABEL, _) TYPE_TRAITS(NAME, LABEL)
438+
QUERY_TYPES(V)
439+
#undef V
440+
#undef TYPE_TRAITS
522441
} // namespace cares_wrap
523442
} // namespace node
524443

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy