GeezerVison is showing github.com — src: use macros to reduce code duplication is cares_wrap · nodejs/node@4e02f23
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/README.md +1-1Lines changed: 1 addition & 1 deletion - Display the source diff
- Display the rich diff
| Original file line number | Diff line number | Diff line change |
|---|
@@ -474,7 +474,7 @@ void Initialize(Local<Object> target, | 474 | 474 | SetProtoMethod(isolate, channel_wrap, "queryA", Query<QueryAWrap>); | 475 | 475 | // ... | 476 | 476 | SetProtoMethod(isolate, channel_wrap, "querySoa", Query<QuerySoaWrap>); | 477 | | - SetProtoMethod(isolate, channel_wrap, "getHostByAddr", Query<GetHostByAddrWrap>); | | 477 | + SetProtoMethod(isolate, channel_wrap, "getHostByAddr", Query<QueryReverseWrap>); | 478 | 478 |
| 479 | 479 | SetProtoMethodNoSideEffect(isolate, channel_wrap, "getServers", GetServers); | 480 | 480 |
| |
Collapse file Copy file name to clipboardExpand all lines: src/cares_wrap.cc +15-38Lines changed: 15 additions & 38 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -1612,7 +1612,7 @@ Maybe<int> SoaTraits::Parse(QuerySoaWrap* wrap, | 1612 | 1612 | return Just<int>(ARES_SUCCESS); | 1613 | 1613 | } | 1614 | 1614 |
| 1615 | | -int ReverseTraits::Send(GetHostByAddrWrap* wrap, const char* name) { | | 1615 | +int ReverseTraits::Send(QueryReverseWrap* wrap, const char* name) { | 1616 | 1616 | int length, family; | 1617 | 1617 | char address_buffer[sizeof(struct in6_addr)]; | 1618 | 1618 |
| @@ -1631,17 +1631,16 @@ int ReverseTraits::Send(GetHostByAddrWrap* wrap, const char* name) { | 1631 | 1631 | "name", TRACE_STR_COPY(name), | 1632 | 1632 | "family", family == AF_INET ? "ipv4" : "ipv6"); | 1633 | 1633 |
| 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()); | 1641 | 1640 | return ARES_SUCCESS; | 1642 | 1641 | } | 1643 | 1642 |
| 1644 | | -Maybe<int> ReverseTraits::Parse(GetHostByAddrWrap* wrap, | | 1643 | +Maybe<int> ReverseTraits::Parse(QueryReverseWrap* wrap, | 1645 | 1644 | const std::unique_ptr<ResponseData>& response) { | 1646 | 1645 | if (!response->is_host) [[unlikely]] { | 1647 | 1646 | return Just<int>(ARES_EBADRESP); | @@ -2220,21 +2219,10 @@ void Initialize(Local<Object> target, | 2220 | 2219 | ChannelWrap::kInternalFieldCount); | 2221 | 2220 | channel_wrap->Inherit(AsyncWrap::GetConstructorTemplate(env)); | 2222 | 2221 |
| 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 | 2238 | 2226 |
| 2239 | 2227 | SetProtoMethodNoSideEffect(isolate, channel_wrap, "getServers", GetServers); | 2240 | 2228 | SetProtoMethod(isolate, channel_wrap, "setServers", SetServers); | @@ -2252,20 +2240,9 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { | 2252 | 2240 | registry->Register(StrError); | 2253 | 2241 | registry->Register(ChannelWrap::New); | 2254 | 2242 |
| 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 | 2269 | 2246 |
| 2270 | 2247 | registry->Register(GetServers); | 2271 | 2248 | registry->Register(SetServers); | |
Collapse file Copy file name to clipboardExpand all lines: src/cares_wrap.h +32-113Lines changed: 32 additions & 113 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -406,119 +406,38 @@ class QueryWrap final : public AsyncWrap { | 406 | 406 | QueryWrap<Traits>** callback_ptr_ = nullptr; | 407 | 407 | }; | 408 | 408 |
| 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 | 522 | 441 | } // namespace cares_wrap | 523 | 442 | } // namespace node | 524 | 443 |
| |
|