Skip to content

Commit d1a5b41

Browse files
committed
perl.h add SVVALIDIVX()/SVVAILDRV/SVVAILDNVX/SVVAILDPVX bitfield testers
- Add faster versions of the PL_valid_types_IVX[], PL_valid_types_PVX[], etc array tests intended for use in -O2/not -DDEBUGGING builds. - Currently the PL_valid_types_*VX[] arrays are all 17 bytes long and only used for -DDEBUGGING assert()s in sv.h. The same information can be stored in a U32 literal integer instead. By making these macros use a U32 literal integer instead of a const array of bool/8 vars, there is no performance or overhead concerns anymore, if someone finds a reason to use these macros, in an optimized perl build. The U32 literal integers are now part of the CPU's instruction stream like in all other SV* flag tests. - It is not known yet if there is any good reason to these faster macros, or the old slower PL_valid_types_*VX[]s arrays, in an optimized blead perl or optimized stable perl. All "correct enough" code either in CORE or on CPAN already has macros or expressions using existing macros, to test whatever flags they need to test inside a SV* head struct.
1 parent 563689f commit d1a5b41

File tree

4 files changed

+124
-1
lines changed

4 files changed

+124
-1
lines changed

ext/XS-APItest/APItest.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use strict;
44
use warnings;
55
use Carp;
66

7-
our $VERSION = '1.43';
7+
our $VERSION = '1.44';
88

99
require XSLoader;
1010

ext/XS-APItest/APItest.xs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,6 +1999,82 @@ test_mismatch_xs_handshake_api_ver(...)
19991999
#endif
20002000
}
20012001

2002+
bool
2003+
PL_valid_types_IRNPVX_arrays()
2004+
PREINIT:
2005+
int i;
2006+
int t;
2007+
SV fksv;
2008+
bool * arr;
2009+
bool* p_arrs [] = {
2010+
PL_valid_types_IVX,
2011+
PL_valid_types_NVX,
2012+
PL_valid_types_PVX,
2013+
PL_valid_types_RV,
2014+
PL_valid_types_IV_set,
2015+
PL_valid_types_NV_set
2016+
};
2017+
CODE:
2018+
for(i=0; i< C_ARRAY_LENGTH(p_arrs); i++){
2019+
arr = p_arrs[i];
2020+
switch(i) {
2021+
case 0:
2022+
for(t = 0; t <SVt_LAST; t++) {
2023+
SvFLAGS(&fksv) = t;
2024+
if (cBOOL(SVVAILDIVX(&fksv))
2025+
!= cBOOL(arr[SvTYPE(&fksv) & SVt_MASK]))
2026+
goto failed;
2027+
}
2028+
break;
2029+
case 1:
2030+
for(t = 0; t <SVt_LAST; t++) {
2031+
SvFLAGS(&fksv) = t;
2032+
if (cBOOL(SVVAILDNVX(&fksv))
2033+
!= cBOOL(arr[SvTYPE(&fksv) & SVt_MASK]))
2034+
goto failed;
2035+
}
2036+
break;
2037+
case 2:
2038+
for(t = 0; t <SVt_LAST; t++) {
2039+
SvFLAGS(&fksv) = t;
2040+
if (cBOOL(SVVAILDPVX(&fksv))
2041+
!= cBOOL(arr[SvTYPE(&fksv) & SVt_MASK]))
2042+
goto failed;
2043+
}
2044+
break;
2045+
case 3:
2046+
for(t = 0; t <SVt_LAST; t++) {
2047+
SvFLAGS(&fksv) = t;
2048+
if (cBOOL(SVVAILDRV(&fksv))
2049+
!= cBOOL(arr[SvTYPE(&fksv) & SVt_MASK]))
2050+
goto failed;
2051+
}
2052+
break;
2053+
case 4:
2054+
for(t = 0; t <SVt_LAST; t++) {
2055+
SvFLAGS(&fksv) = t;
2056+
if (cBOOL(SVVAILDIV_set(&fksv))
2057+
!= cBOOL(arr[SvTYPE(&fksv) & SVt_MASK]))
2058+
goto failed;
2059+
}
2060+
break;
2061+
case 5:
2062+
for(t = 0; t <SVt_LAST; t++) {
2063+
SvFLAGS(&fksv) = t;
2064+
if (cBOOL(SVVAILDNV_set(&fksv))
2065+
!= cBOOL(arr[SvTYPE(&fksv) & SVt_MASK]))
2066+
goto failed;
2067+
}
2068+
break;
2069+
}
2070+
}
2071+
RETVAL = TRUE;
2072+
if (0){
2073+
failed:
2074+
RETVAL = FALSE;
2075+
}
2076+
OUTPUT:
2077+
RETVAL
20022078

20032079
MODULE = XS::APItest:Hash PACKAGE = XS::APItest::Hash
20042080

ext/XS-APItest/t/xsub_h.t

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,5 +150,7 @@ is scalar @xs_empty, 0, 'XSRETURN_EMPTY returns empty list in array context';
150150
my $xs_empty = XS::APItest::XSUB::xsreturn_empty();
151151
is $xs_empty, undef, 'XSRETURN_EMPTY returns undef in scalar context';
152152

153+
ok( XS::APItest::XSUB::PL_valid_types_IRNPVX_arrays(),
154+
"APItest::XSUB::PL_valid_types_IRNPVX_arrays returned true");
153155

154156
done_testing();

perl.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6265,6 +6265,51 @@ EXTCONST U8 PL_magic_data[256] =
62656265
EXTCONST U8 PL_magic_data[256];
62666266
#endif
62676267

6268+
#define SVtVAILDIVX ((0<<0)/*NL*/|(1<<1)/*IV*/|(0<<2)/*NV*/|(0<<3)/*PV*/ \
6269+
|(0<<4)/*INV*/|(1<<5)/*PI*/|(1<<6)/*PN*/|(1<<7)/*MG*/|(0<<8)/*RX*/ \
6270+
|(1<<9)/*GV*/|(1<<10)/*LV*/|(0<<11)/*AV*/|(0<<12)/*HV*/|(0<<13)/*CV*/ \
6271+
|(0<<14)/*FM*/|(0<<15)/*IO*/|(0<<16)/*OBJ*/)
6272+
#define SVtVAILDNVX ((0<<0)/*NL*/|(0<<1)/*IV*/|(1<<2)/*NV*/|(0<<3)/*PV*/ \
6273+
|(0<<4)/*INV*/|(0<<5)/*PI*/|(1<<6)/*PN*/|(1<<7)/*MG*/|(0<<8)/*RX*/ \
6274+
|(1<<9)/*GV*/|(1<<10)/*LV*/|(0<<11)/*AV*/|(0<<12)/*HV*/|(0<<13)/*CV*/ \
6275+
|(0<<14)/*FM*/|(0<<15)/*IO*/|(0<<16)/*OBJ*/)
6276+
#define SVtVAILDPVX ((0<<0)/*NL*/|(0<<1)/*IV*/|(0<<2)/*NV*/|(1<<3)/*PV*/ \
6277+
|(1<<4)/*INV*/|(1<<5)/*PI*/|(1<<6)/*PN*/|(1<<7)/*MG*/|(1<<8)/*RX*/ \
6278+
|(1<<9)/*GV*/|(1<<10)/*LV*/|(0<<11)/*AV*/|(0<<12)/*HV*/|(1<<13)/*CV*/ \
6279+
|(1<<14)/*FM*/|(1<<15)/*IO*/|(0<<16)/*OBJ*/)
6280+
#define SVtVAILDRV ((0<<0)/*NL*/|(1<<1)/*IV*/|(0<<2)/*NV*/|(1<<3)/*PV*/ \
6281+
|(0<<4)/*INV*/|(1<<5)/*PI*/|(1<<6)/*PN*/|(1<<7)/*MG*/|(1<<8)/*RX*/ \
6282+
|(1<<9)/*GV*/|(1<<10)/*LV*/|(0<<11)/*AV*/|(0<<12)/*HV*/|(0<<13)/*CV*/ \
6283+
|(0<<14)/*FM*/|(1<<15)/*IO*/|(0<<16)/*OBJ*/)
6284+
#define SVtVAILDIV_set ((0<<0)/*NL*/|(1<<1)/*IV*/|(0<<2)/*NV*/|(0<<3)/*PV*/ \
6285+
|(0<<4)/*INV*/|(1<<5)/*PI*/|(1<<6)/*PN*/|(1<<7)/*MG*/|(1<<8)/*RX*/ \
6286+
|(1<<9)/*GV*/|(1<<10)/*LV*/|(0<<11)/*AV*/|(0<<12)/*HV*/|(0<<13)/*CV*/ \
6287+
|(1<<14)/*FM*/|(1<<15)/*IO*/|(0<<16)/*OBJ*/)
6288+
#define SVtVAILDNV_set ((0<<0)/*NL*/|(0<<1)/*IV*/|(1<<2)/*NV*/|(0<<3)/*PV*/ \
6289+
|(0<<4)/*INV*/|(0<<5)/*PI*/|(1<<6)/*PN*/|(1<<7)/*MG*/|(1<<8)/*RX*/ \
6290+
|(1<<9)/*GV*/|(1<<10)/*LV*/|(0<<11)/*AV*/|(0<<12)/*HV*/|(0<<13)/*CV*/ \
6291+
|(0<<14)/*FM*/|(0<<15)/*IO*/|(0<<16)/*OBJ*/)
6292+
6293+
/* Experimental. Only for PERL_CORE. Not for CPAN XS or private XS code.
6294+
*
6295+
* Faster but identical to the assert tests inside sv.h that look like :
6296+
*
6297+
* assert(PL_valid_types_PVX[SvTYPE(_svcur) & SVt_MASK]);
6298+
*
6299+
* These macros don't do an extra memory read from a 17 byte array like
6300+
* the assert() above. The intent is these macros could be used in
6301+
* -O1/-O2 non-DEBUGGING builds, either temporarily in blead, or permanently
6302+
* in stable releases. Probably the only useful macro is SVVAILDPVX() vs
6303+
* if ((type >= SVt_PV && type <= SVt_PVLV) || type == SVt_PVCV) { 0; }
6304+
*/
6305+
6306+
#define SVVAILDIVX(_sv) ((1<<SvTYPE(_sv))&SVtVAILDIVX)
6307+
#define SVVAILDNVX(_sv) ((1<<SvTYPE(_sv))&SVtVAILDNVX)
6308+
#define SVVAILDPVX(_sv) ((1<<SvTYPE(_sv))&SVtVAILDPVX)
6309+
#define SVVAILDRV(_sv) ((1<<SvTYPE(_sv))&SVtVAILDRV)
6310+
#define SVVAILDIV_set(_sv) ((1<<SvTYPE(_sv))&SVtVAILDIV_set)
6311+
#define SVVAILDNV_set(_sv) ((1<<SvTYPE(_sv))&SVtVAILDNV_set)
6312+
62686313
#ifdef DOINIT
62696314
/* NL IV NV PV INV PI PN MG RX GV LV AV HV CV FM IO OBJ */
62706315
EXTCONST bool

0 commit comments

Comments
 (0)