Skip to content

Commit 3e78222

Browse files
jasnellRafaelGSS
authored andcommitted
src: use macros to reduce code duplication is cares_wrap
PR-URL: #57937 Reviewed-By: Yagiz Nizipli <[email protected]>
1 parent f0905d3 commit 3e78222

File tree

3 files changed

+48
-152
lines changed

3 files changed

+48
-152
lines changed

src/README.md

+1-1
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

+15-38
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

+32-113
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)