summaryrefslogtreecommitdiff
path: root/util.h
diff options
context:
space:
mode:
authorDaniel Dragan <bulk88@hotmail.com>2014-11-13 01:59:06 -0500
committerFather Chrysostomos <sprout@cpan.org>2014-11-13 04:41:46 -0800
commit9a18979311347ab1c45e2ef16113bb5abe4cbd26 (patch)
tree22590b8dffe9c4de5f1bf101111d04690033aea1 /util.h
parented6401c5fdd50fe275e7ed0d9af99dff6ec7c1fb (diff)
downloadperl-9a18979311347ab1c45e2ef16113bb5abe4cbd26.tar.gz
add filename handling to xs handshake
- this improves the error message on ABI incompatibility, per [perl #123136] - reduce the number of gv_fetchfile calls in newXS over registering many XSUBs - "v" was not stripped from PERL_API_VERSION_STRING since string "vX.XX.X\0", a typical version number is 8 bytes long, and aligned to 4/8 by most compilers in an image. A double digit maint release is extremely unlikely. - newXS_deffile saves on machine code in bootstrap functions by not passing arg filename - move newXS to where the rest of the newXS*()s live - move the "no address" panic closer to the start to get it out of the way sooner flow wise (it nothing to do with var gv or cv) - move CvANON_on to not check var name twice - change die message to use %p, more efficient on 32 ptr/64 IV platforms see ML post "about commit "util.c: fix comiler warnings"" - vars cv/xs_spp (stack pointer pointer)/xs_interp exist for inspection by a C debugger in an unoptimized build
Diffstat (limited to 'util.h')
-rw-r--r--util.h28
1 files changed, 18 insertions, 10 deletions
diff --git a/util.h b/util.h
index 172723353c..6e63f3bc2e 100644
--- a/util.h
+++ b/util.h
@@ -173,16 +173,21 @@ typedef struct {
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 HSm_APIVERLEN 0x0000001F /* perl version string won't be more than 31 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
+/* uses var file to set default filename for newXS_deffile to use for CvFILE */
+#define HSf_SETXSUBFN 0x00000020
#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 */
+/* A mask of bits in the key which must always match between a XS mod and interp.
+ Also if all ABI bits in a key are true, skip all ABI checks, it is very
+ the unlikely interp size will all 1 bits */
+/* 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 HSf_NOCHK HSm_KEY_MATCH /* if all ABI bits are 1 in the key, dont chk */
#define HS_GETINTERPSIZE(key) ((key) >> 16)
@@ -193,12 +198,14 @@ means arg not present, 1 is empty string/null byte */
#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) \
+/* U32 return = (U16 interpsize, bool cxt, bool setxsubfn, bool popmark,
+ U5 (FIVE!) apiverlen, U8 xsverlen) */
+#define HS_KEYp(interpsize, cxt, setxsubfn, popmark, apiverlen, xsverlen) \
(((interpsize) << 16) \
| ((xsverlen) > HS_XSVERLEN_MAX \
? (Perl_croak_nocontext("panic: handshake overflow"), HS_XSVERLEN_MAX) \
: (xsverlen) << 8) \
+ | (cBOOL(setxsubfn) ? HSf_SETXSUBFN : 0) \
| (cBOOL(cxt) ? HSf_IMP_CXT : 0) \
| (cBOOL(popmark) ? HSf_POPMARK : 0) \
| ((apiverlen) > HS_APIVERLEN_MAX \
@@ -208,15 +215,16 @@ means arg not present, 1 is empty string/null byte */
/* 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") */
+/* U32 return = (bool setxsubfn, 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, \
+# define HS_KEY(setxsubfn, popmark, apiver, xsver) \
+ HS_KEYp(sizeof(PerlInterpreter), TRUE, setxsubfn, 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, \
+# define HS_KEY(setxsubfn, popmark, apiver, xsver) \
+ HS_KEYp(sizeof(struct PerlHandShakeInterpreter), FALSE, setxsubfn, popmark, \
sizeof("" apiver "")-1, sizeof("" xsver "")-1)
# define HS_CXT cv
#endif