@@ -8705,6 +8705,33 @@ Perl_sv_streq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
87058705 return sv_eq_flags(sv1, sv2, 0);
87068706}
87078707
8708+ PERL_STATIC_INLINE bool
8709+ S_sv_numcmp_common(pTHX_ SV **sv1, SV **sv2, const U32 flags,
8710+ int method, bool *result) {
8711+ if(flags & SV_GMAGIC) {
8712+ if(*sv1)
8713+ SvGETMAGIC(*sv1);
8714+ if(*sv2)
8715+ SvGETMAGIC(*sv2);
8716+ }
8717+
8718+ /* Treat NULL as undef */
8719+ if(!*sv1)
8720+ *sv1 = &PL_sv_undef;
8721+ if(!*sv2)
8722+ *sv2 = &PL_sv_undef;
8723+
8724+ SV *sv_result;
8725+ if(!(flags & SV_SKIP_OVERLOAD) &&
8726+ (SvAMAGIC(*sv1) || SvAMAGIC(*sv2)) &&
8727+ (sv_result = amagic_call(*sv1, *sv2, method, 0))) {
8728+ *result = SvTRUE(sv_result);
8729+ return true;
8730+ }
8731+
8732+ return false;
8733+ }
8734+
87088735/*
87098736
87108737=for apidoc sv_numeq
@@ -8736,25 +8763,9 @@ Perl_sv_numeq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
87368763{
87378764 PERL_ARGS_ASSERT_SV_NUMEQ_FLAGS;
87388765
8739- if(flags & SV_GMAGIC) {
8740- if(sv1)
8741- SvGETMAGIC(sv1);
8742- if(sv2)
8743- SvGETMAGIC(sv2);
8744- }
8745-
8746- /* Treat NULL as undef */
8747- if(!sv1)
8748- sv1 = &PL_sv_undef;
8749- if(!sv2)
8750- sv2 = &PL_sv_undef;
8751-
8752- if(!(flags & SV_SKIP_OVERLOAD) &&
8753- (SvAMAGIC(sv1) || SvAMAGIC(sv2))) {
8754- SV *ret = amagic_call(sv1, sv2, eq_amg, 0);
8755- if(ret)
8756- return SvTRUE(ret);
8757- }
8766+ bool result;
8767+ if (UNLIKELY(sv_numcmp_common(&sv1, &sv2, flags, eq_amg, &result)))
8768+ return result;
87588769
87598770 return do_ncmp(sv1, sv2) == 0;
87608771}
@@ -8790,25 +8801,10 @@ Perl_sv_numne_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
87908801{
87918802 PERL_ARGS_ASSERT_SV_NUMNE_FLAGS;
87928803
8793- if(flags & SV_GMAGIC) {
8794- if(sv1)
8795- SvGETMAGIC(sv1);
8796- if(sv2)
8797- SvGETMAGIC(sv2);
8798- }
8799-
8800- /* Treat NULL as undef */
8801- if(!sv1)
8802- sv1 = &PL_sv_undef;
8803- if(!sv2)
8804- sv2 = &PL_sv_undef;
88058804
8806- if(!(flags & SV_SKIP_OVERLOAD) &&
8807- (SvAMAGIC(sv1) || SvAMAGIC(sv2))) {
8808- SV *ret = amagic_call(sv1, sv2, ne_amg, 0);
8809- if(ret)
8810- return SvTRUE(ret);
8811- }
8805+ bool result;
8806+ if (UNLIKELY(sv_numcmp_common(&sv1, &sv2, flags, ne_amg, &result)))
8807+ return result;
88128808
88138809 return do_ncmp(sv1, sv2) != 0;
88148810}
0 commit comments