diff options
author | Daniel Dragan <bulk88@hotmail.com> | 2014-11-08 00:20:52 -0500 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2014-11-07 22:52:22 -0800 |
commit | db6e00bd00dae7b918216c69bd58fe860e640276 (patch) | |
tree | b812a379126e4f58290cb6f2a9f293aa878abead /util.h | |
parent | 6402d4ee6fab9f5d76a131921ef72d686ad7aac5 (diff) | |
download | perl-db6e00bd00dae7b918216c69bd58fe860e640276.tar.gz |
add xs_handshake API
This API elevates the amount of ABI compatibility protection between XS
modules and the interp. It also makes each boot XSUB smaller in machine
code by removing function calls and factoring out code into the new
Perl_xs_handshake and Perl_xs_epilog functions.
sv.c :
- revise padlist duping code to reduce code bloat/asserts on DEBUGGING
ext/DynaLoader/dlutils.c :
- disable version checking so interp startup is faster, ABI mismatches are
impossible because DynaLoader is never available as a shared library
ext/XS-APItest/XSUB-redefined-macros.xs :
- "" means dont check the version, so switch to " " to make the test in
xsub_h.t pass, see ML thread "XS_APIVERSION_BOOTCHECK and XS_VERSION
is CPP defined but "", mow what?"
ext/re/re.xs :
- disable API version checking until #123007 is resolved
ParseXS/Utilities.pm :
109-standard_XS_defs.t :
- remove context from S_croak_xs_usage similar to core commit cb077ed296 .
CvGV doesn't need a context until 5.21.4 and commit ae77754ae2 and
by then core's croak_xs_uage API has been long available and this
backport doesn't need to account for newer perls
- fix test where lack of having PERL_IMPLICIT_CONTEXT caused it to fail
Diffstat (limited to 'util.h')
-rw-r--r-- | util.h | 58 |
1 files changed, 58 insertions, 0 deletions
@@ -163,6 +163,64 @@ typedef struct { #endif /* USE_C_BACKTRACE */ +/* Use a packed 32 bit constant "key" to start the handshake. The key defines + ABI compatibility, and how to process the vararg list. + + Note, some bits may be taken from INTRPSIZE (but then a simple x86 AX register + can't be used to read it) and 4 bits from API version len can also be taken, + since v00.00.00 is 9 bytes long. XS version length should not have any bits + taken since XS_VERSION lengths can get quite long since they are user + selectable. These spare bits allow for additional features for the varargs + stuff or ABI compat test flags in the future. +*/ +#define HSm_APIVERLEN 0x0000003F /* perl version string won't be more than 63 chars */ +#define HS_APIVERLEN_MAX HSm_APIVERLEN +#define HSm_XSVERLEN 0x0000FF00 /* if 0, not present, dont check, die if over 255*/ +#define HS_XSVERLEN_MAX 0xFF +#define HSf_POPMARK 0x00000040 /* popmark mode or you must supply ax and items */ +#define HSf_IMP_CXT 0x00000080 /* ABI, threaded/PERL_IMPLICIT_CONTEXT, pTHX_ present */ +#define HSm_INTRPSIZE 0xFFFF0000 /* ABI, interp struct size */ +/* a mask where these bits must always match between a XS mod and interp */ +/* and maybe HSm_APIVERLEN one day if Perl_xs_apiversion_bootcheck is changed to a memcmp */ +#define HSm_KEY_MATCH (HSm_INTRPSIZE|HSf_IMP_CXT) + + +#define HS_GETINTERPSIZE(key) ((key) >> 16) +/* if in the future "" and NULL must be separated, XSVERLEN would be 0 +means arg not present, 1 is empty string/null byte */ +/* (((key) & 0x0000FF00) >> 8) is less efficient on Visual C */ +#define HS_GETXSVERLEN(key) ((key) >> 8 & 0xFF) +#define HS_GETAPIVERLEN(key) ((key) & HSm_APIVERLEN) + +/* internal to util.h macro to create a packed handshake key, all args must be constants */ +/* U32 return = (U16 interpsize, bool cxt, bool popmark, U6 (SIX!) apiverlen, U8 xsverlen) */ +#define HS_KEYp(interpsize, cxt, popmark, apiverlen, xsverlen) \ + (((interpsize) << 16) \ + | ((xsverlen) > HS_XSVERLEN_MAX \ + ? (Perl_croak_nocontext("panic: handshake overflow"), HS_XSVERLEN_MAX) \ + : (xsverlen) << 8) \ + | (cBOOL(cxt) ? HSf_IMP_CXT : 0) \ + | (cBOOL(popmark) ? HSf_POPMARK : 0) \ + | ((apiverlen) > HS_APIVERLEN_MAX \ + ? (Perl_croak_nocontext("panic: handshake overflow"), HS_APIVERLEN_MAX) \ + : (apiverlen))) +/* overflows above will optimize away unless they will execute */ + +/* public macro for core usage to create a packed handshake key but this is + not public API. This more friendly version already collected all ABI info */ +/* U32 return = (bool popmark, "litteral_string_api_ver", "litteral_string_xs_ver") */ +#ifdef PERL_IMPLICIT_CONTEXT +# define HS_KEY(popmark, apiver, xsver) \ + HS_KEYp(sizeof(PerlInterpreter), TRUE, popmark, \ + sizeof("" apiver "")-1, sizeof("" xsver "")-1) +# define HS_CXT aTHX +#else +# define HS_KEY(popmark, apiver, xsver) \ + HS_KEYp(sizeof(struct PerlHandShakeInterpreter), FALSE, popmark, \ + sizeof("" apiver "")-1, sizeof("" xsver "")-1) +# define HS_CXT cv +#endif + /* * Local variables: * c-indentation-style: bsd |