X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlxs.pod;h=5ad24d8aa3d17c81a6805e124876bd25cdc4b4b6;hb=a22f28a4268aa03ce2bafaf594271b8ff764a5f8;hp=6d14bae275b9289560fce55fa0e5d0df765ceec7;hpb=832a833bda7470a7163fbdbf0c6029513869c248;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlxs.pod b/pod/perlxs.pod index 6d14bae..5ad24d8 100644 --- a/pod/perlxs.pod +++ b/pod/perlxs.pod @@ -293,7 +293,7 @@ or less equivalent: ST(0) = newSVpv("Hello World",0); sv_2mortal(ST(0)); XSRETURN(1); - + SV * beta() CODE: @@ -319,7 +319,7 @@ CPAN modules) in the typemap file, the reference count of the C is not properly decremented. Thus, the above XSUB would leak memory whenever it is being called. The same problem exists for C. -When you're returning an C or a C, you have make sure +When you're returning an C or a C, you have to make sure their reference count is decremented by making the AV or HV mortal: AV * @@ -554,7 +554,7 @@ exception happens if this C<;> terminates the line, then this C<;> is quietly ignored. The following code demonstrates how to supply initialization code for -function parameters. The initialization code is eval'd within double +function parameters. The initialization code is eval'ed within double quotes by the compiler before it is added to the output so anything which should be interpreted literally [mainly C<$>, C<@>, or C<\\>] must be protected with backslashes. The variables $var, $arg, @@ -562,7 +562,7 @@ and $type can be used as in typemaps. bool_t rpcb_gettime(host,timep) - char *host = (char *)SvPV($arg,PL_na); + char *host = (char *)SvPV_nolen($arg); time_t &timep = 0; OUTPUT: timep @@ -589,7 +589,7 @@ Here's a truly obscure example: bool_t rpcb_gettime(host,timep) time_t &timep; /* \$v{timep}=@{[$v{timep}=$arg]} */ - char *host + SvOK($v{timep}) ? SvPV($arg,PL_na) : NULL; + char *host + SvOK($v{timep}) ? SvPV_nolen($arg) : NULL; OUTPUT: timep @@ -950,10 +950,9 @@ The XS code, with ellipsis, follows. time_t timep = NO_INIT PREINIT: char *host = "localhost"; - STRLEN n_a; CODE: if( items > 1 ) - host = (char *)SvPV(ST(1), n_a); + host = (char *)SvPV_nolen(ST(1)); RETVAL = rpcb_gettime( host, &timep ); OUTPUT: timep @@ -1094,8 +1093,8 @@ return value, should the need arise. time_t timep; bool_t x; CODE: - ST(0) = sv_newmortal(); if( rpcb_gettime( host, &timep ) ){ + ST(0) = sv_newmortal(); sv_setnv( ST(0), (double)timep); } else{ @@ -1212,6 +1211,12 @@ To disable version checking: VERSIONCHECK: DISABLE +Note that if the version of the PM module is an NV (a floating point +number), it will be stringified with a possible loss of precision +(currently chopping to nine decimal places) so that it may not match +the version of the XS module anymore. Quoting the $VERSION declaration +to make it a string is recommended if long version numbers are used. + =head2 The PROTOTYPES: Keyword The PROTOTYPES: keyword corresponds to B's C<-prototypes> and @@ -1242,10 +1247,9 @@ prototypes. PROTOTYPE: $;$ PREINIT: char *host = "localhost"; - STRLEN n_a; CODE: if( items > 1 ) - host = (char *)SvPV(ST(1), n_a); + host = (char *)SvPV_nolen(ST(1)); RETVAL = rpcb_gettime( host, &timep ); OUTPUT: timep @@ -1313,7 +1317,7 @@ this: In this case, the function will overload both of the three way comparison operators. For all overload operations using non-alpha -characters, you must type the parameter without quoting, seperating +characters, you must type the parameter without quoting, separating multiple overloads with whitespace. Note that "" (the stringify overload) should be entered as \"\" (i.e. escaped). @@ -1391,7 +1395,7 @@ C with offsets being C, C, C, C. Then one can use #define XSINTERFACE_FUNC_BYOFFSET(ret,cv,f) \ - ((XSINTERFACE_CVT(ret,))fp[CvXSUBANY(cv).any_i32]) + ((XSINTERFACE_CVT_ANON(ret))fp[CvXSUBANY(cv).any_i32]) #define XSINTERFACE_FUNC_BYOFFSET_set(cv,f) \ CvXSUBANY(cv).any_i32 = CAT2( f, _off ) @@ -2007,7 +2011,7 @@ comma, i.e. C<_aMY_CXT>, C, C<_pMY_CXT> and C. =item MY_CXT_CLONE By default, when a new interpreter is created as a copy of an existing one -(eg via C<new()>>), both interpreters share the same physical +(eg via C<< threads->create() >>), both interpreters share the same physical my_cxt_t structure. Calling C (typically via the package's C function), causes a byte-for-byte copy of the structure to be taken, and any future dMY_CXT will cause the copy to be accessed instead.