@@ -8711,6 +8711,33 @@ Perl_sv_streq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
87118711 return sv_eq_flags(sv1, sv2, 0);
87128712}
87138713
8714+ PERL_STATIC_INLINE bool
8715+ S_sv_numcmp_common(pTHX_ SV **sv1, SV **sv2, const U32 flags,
8716+ int method, bool *result) {
8717+ if(flags & SV_GMAGIC) {
8718+ if(*sv1)
8719+ SvGETMAGIC(*sv1);
8720+ if(*sv2)
8721+ SvGETMAGIC(*sv2);
8722+ }
8723+
8724+ /* Treat NULL as undef */
8725+ if(!*sv1)
8726+ *sv1 = &PL_sv_undef;
8727+ if(!*sv2)
8728+ *sv2 = &PL_sv_undef;
8729+
8730+ SV *sv_result;
8731+ if(!(flags & SV_SKIP_OVERLOAD) &&
8732+ (SvAMAGIC(*sv1) || SvAMAGIC(*sv2)) &&
8733+ (sv_result = amagic_call(*sv1, *sv2, method, 0))) {
8734+ *result = SvTRUE(sv_result);
8735+ return true;
8736+ }
8737+
8738+ return false;
8739+ }
8740+
87148741/*
87158742
87168743=for apidoc sv_numeq
@@ -8742,25 +8769,9 @@ Perl_sv_numeq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
87428769{
87438770 PERL_ARGS_ASSERT_SV_NUMEQ_FLAGS;
87448771
8745- if(flags & SV_GMAGIC) {
8746- if(sv1)
8747- SvGETMAGIC(sv1);
8748- if(sv2)
8749- SvGETMAGIC(sv2);
8750- }
8751-
8752- /* Treat NULL as undef */
8753- if(!sv1)
8754- sv1 = &PL_sv_undef;
8755- if(!sv2)
8756- sv2 = &PL_sv_undef;
8757-
8758- if(!(flags & SV_SKIP_OVERLOAD) &&
8759- (SvAMAGIC(sv1) || SvAMAGIC(sv2))) {
8760- SV *ret = amagic_call(sv1, sv2, eq_amg, 0);
8761- if(ret)
8762- return SvTRUE(ret);
8763- }
8772+ bool result;
8773+ if (UNLIKELY(sv_numcmp_common(&sv1, &sv2, flags, eq_amg, &result)))
8774+ return result;
87648775
87658776 return do_ncmp(sv1, sv2) == 0;
87668777}
@@ -8796,25 +8807,10 @@ Perl_sv_numne_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
87968807{
87978808 PERL_ARGS_ASSERT_SV_NUMNE_FLAGS;
87988809
8799- if(flags & SV_GMAGIC) {
8800- if(sv1)
8801- SvGETMAGIC(sv1);
8802- if(sv2)
8803- SvGETMAGIC(sv2);
8804- }
8805-
8806- /* Treat NULL as undef */
8807- if(!sv1)
8808- sv1 = &PL_sv_undef;
8809- if(!sv2)
8810- sv2 = &PL_sv_undef;
88118810
8812- if(!(flags & SV_SKIP_OVERLOAD) &&
8813- (SvAMAGIC(sv1) || SvAMAGIC(sv2))) {
8814- SV *ret = amagic_call(sv1, sv2, ne_amg, 0);
8815- if(ret)
8816- return SvTRUE(ret);
8817- }
8811+ bool result;
8812+ if (UNLIKELY(sv_numcmp_common(&sv1, &sv2, flags, ne_amg, &result)))
8813+ return result;
88188814
88198815 return do_ncmp(sv1, sv2) != 0;
88208816}
0 commit comments