Skip to content

Commit 0b80103

Browse files
committed
sv.c: extract the common parts of sv_numeq_flags and sv_numne_flags
1 parent b7c19c0 commit 0b80103

File tree

7 files changed

+71
-43
lines changed

7 files changed

+71
-43
lines changed

embed.fnc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6060,6 +6060,12 @@ S |const char *|sv_display|NN SV * const sv \
60606060
|NN char *tmpbuf \
60616061
|STRLEN tmpbuf_size
60626062
S |bool |sv_2iuv_common |NN SV * const sv
6063+
S |bool |sv_numcmp_common \
6064+
|NULLOK SV **sv1 \
6065+
|NULLOK SV **sv2 \
6066+
|const U32 flags \
6067+
|int method \
6068+
|NN bool *result
60636069
S |STRLEN |sv_pos_b2u_midway \
60646070
|SPTR const U8 * const s \
60656071
|MPTR const U8 * const target \

embed.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,6 +1686,7 @@
16861686
# define sv_2iuv_common(a) S_sv_2iuv_common(aTHX_ a)
16871687
# define sv_add_arena(a,b,c) S_sv_add_arena(aTHX_ a,b,c)
16881688
# define sv_display(a,b,c) S_sv_display(aTHX_ a,b,c)
1689+
# define sv_numcmp_common(a,b,c,d,e) S_sv_numcmp_common(aTHX_ a,b,c,d,e)
16891690
# define sv_pos_b2u_midway(a,b,c,d) S_sv_pos_b2u_midway(aTHX_ a,b,c,d)
16901691
# define sv_pos_u2b_cached(a,b,c,d,e,f,g) S_sv_pos_u2b_cached(aTHX_ a,b,c,d,e,f,g)
16911692
# define sv_pos_u2b_forwards S_sv_pos_u2b_forwards

ext/XS-APItest/APItest.xs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,6 +1640,8 @@ signal_thread_start(void *arg) {
16401640
# define hwm_checks_enabled() false
16411641
#endif
16421642

1643+
typedef SV *nullable_SV;
1644+
16431645
MODULE = XS::APItest PACKAGE = XS::APItest
16441646

16451647
INCLUDE: const-xs.inc
@@ -5005,26 +5007,36 @@ test_HvNAMEf_QUOTEDPREFIX(sv)
50055007
OUTPUT:
50065008
RETVAL
50075009

5010+
TYPEMAP: <<HERE
5011+
5012+
nullable_SV T_NULLABLE_SV
5013+
5014+
INPUT
5015+
5016+
T_NULLABLE_SV
5017+
$var = $arg == &PL_sv_undef ? NULL : $arg;
5018+
5019+
HERE
50085020

50095021
bool
5010-
sv_numeq(SV *sv1, SV *sv2)
5022+
sv_numeq(nullable_SV sv1, nullable_SV sv2)
50115023
CODE:
50125024
RETVAL = sv_numeq(sv1, sv2);
50135025
OUTPUT:
50145026
RETVAL
50155027

50165028
bool
5017-
sv_numeq_flags(SV *sv1, SV *sv2, U32 flags)
5029+
sv_numeq_flags(nullable_SV sv1, nullable_SV sv2, U32 flags)
50185030
CODE:
50195031
RETVAL = sv_numeq_flags(sv1, sv2, flags);
50205032
OUTPUT:
50215033
RETVAL
50225034

50235035
bool
5024-
sv_numne(SV *sv1, SV *sv2)
5036+
sv_numne(nullable_SV sv1, nullable_SV sv2)
50255037

50265038
bool
5027-
sv_numne_flags(SV *sv1, SV *sv2, U32 flags)
5039+
sv_numne_flags(nullable_SV sv1, nullable_SV sv2, U32 flags)
50285040

50295041
bool
50305042
sv_streq(SV *sv1, SV *sv2)

ext/XS-APItest/t/sv_numeq.t

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!perl
22

3-
use Test::More tests => 11;
3+
use Test::More tests => 13;
44
use XS::APItest;
55

66
my $four = 4;
@@ -11,6 +11,10 @@ my $six_point_five = 6.5; # an exact float, so == is fine
1111
ok sv_numeq($six_point_five, 6.5), '$six_point_five == 6.5';
1212
ok !sv_numeq($six_point_five, 6.6), '$six_point_five != 6.6';
1313

14+
# NULLs
15+
ok sv_numeq(undef, 0), "NULL sv1";
16+
ok sv_numeq(0, undef), "NULL sv2";
17+
1418
# GMAGIC
1519
"10" =~ m/(\d+)/;
1620
ok !sv_numeq_flags($1, 10, 0), 'sv_numeq_flags with no flags does not GETMAGIC';

ext/XS-APItest/t/sv_numne.t

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!perl
22

3-
use Test::More tests => 11;
3+
use Test::More tests => 13;
44
use XS::APItest;
55

66
my $four = 4;
@@ -11,6 +11,10 @@ my $six_point_five = 6.5; # an exact float, so == is fine
1111
ok !sv_numne($six_point_five, 6.5), '$six_point_five == 6.5';
1212
ok sv_numne($six_point_five, 6.6), '$six_point_five != 6.6';
1313

14+
# NULLs
15+
ok sv_numne(undef, 1), "NULL sv1";
16+
ok sv_numne(1, undef), "NULL sv2";
17+
1418
# GMAGIC
1519
"11" =~ m/(\d+)/;
1620
ok sv_numne_flags($1, 11, 0), 'sv_numne_flags with no flags does not GETMAGIC';

proto.h

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sv.c

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)