X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlguts.pod;h=9932b3754744e7156de4859bd40d8e1ca75e4d0c;hb=7fddc82f0212c2b411408f0a05ebb86f9e431bd9;hp=78a1dfc50e686876afec2ef571929f578ee4ec78;hpb=038fcae385eee134ba22a23fbbf09eafafbe7927;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlguts.pod b/pod/perlguts.pod index 78a1dfc..9932b37 100644 --- a/pod/perlguts.pod +++ b/pod/perlguts.pod @@ -1381,11 +1381,12 @@ and C is the number of elements the stack should be extended by. Now that there is room on the stack, values can be pushed on it using C macro. The pushed values will often need to be "mortal" (See -L). +L): PUSHs(sv_2mortal(newSViv(an_integer))) + PUSHs(sv_2mortal(newSVuv(an_unsigned_integer))) + PUSHs(sv_2mortal(newSVnv(a_double))) PUSHs(sv_2mortal(newSVpv("Some String",0))) - PUSHs(sv_2mortal(newSVnv(3.141592))) And now the Perl program calling C, the two values will be assigned as in: @@ -1401,8 +1402,9 @@ This macro automatically adjust the stack for you, if needed. Thus, you do not need to call C to extend the stack. Despite their suggestions in earlier versions of this document the macros -C, C and C are I suited to XSUBs which return -multiple results, see L. +C<(X)PUSH[iunp]> are I suited to XSUBs which return multiple results. +For that, either stick to the C<(X)PUSHs> macros shown above, or use the new +C macros instead; see L. For more information, consult L and L. @@ -1536,7 +1538,7 @@ corresponding parts of its I and puts the I on stack. The macro to put this target on stack is C, and it is directly used in some opcodes, as well as indirectly in zillions of -others, which use it via C<(X)PUSH[pni]>. +others, which use it via C<(X)PUSH[iunp]>. Because the target is reused, you must be careful when pushing multiple values on the stack. The following code will not do what you think: @@ -1548,12 +1550,30 @@ This translates as "set C to 10, push a pointer to C onto the stack; set C to 20, push a pointer to C onto the stack". At the end of the operation, the stack does not contain the values 10 and 20, but actually contains two pointers to C, which we have set -to 20. If you need to push multiple different values, use C, -which bypasses C. +to 20. -On a related note, if you do use C<(X)PUSH[npi]>, then you're going to +If you need to push multiple different values then you should either use +the C<(X)PUSHs> macros, or else use the new C macros, +none of which make use of C. The C<(X)PUSHs> macros simply push an +SV* on the stack, which, as noted under L, +will often need to be "mortal". The new C macros make +this a little easier to achieve by creating a new mortal for you (via +C<(X)PUSHmortal>), pushing that onto the stack (extending it if necessary +in the case of the C macros), and then setting its value. +Thus, instead of writing this to "fix" the example above: + + XPUSHs(sv_2mortal(newSViv(10))) + XPUSHs(sv_2mortal(newSViv(20))) + +you can simply write: + + mXPUSHi(10) + mXPUSHi(20) + +On a related note, if you do use C<(X)PUSH[iunp]>, then you're going to need a C in your variable declarations so that the C<*PUSH*> -macros can make use of the local variable C. +macros can make use of the local variable C. See also C +and C. =head2 Scratchpads