Add new dUNDERBAR and UNDERBAR macros, to help XS writers to
Rafael Garcia-Suarez [Fri, 14 May 2004 09:38:43 +0000 (09:38 +0000)]
access the $_ variable, even when there is a lexical one in scope.

p4raw-id: //depot/perl@22819

XSUB.h
pod/perlapi.pod

diff --git a/XSUB.h b/XSUB.h
index b4c241a..a1e48dd 100644 (file)
--- a/XSUB.h
+++ b/XSUB.h
@@ -67,6 +67,14 @@ This is usually handled automatically by C<xsubpp>.
 Sets up the C<ix> variable for an XSUB which has aliases.  This is usually
 handled automatically by C<xsubpp>.
 
+=for apidoc Ams||dUNDERBAR
+Sets up the C<padoff_du> variable for an XSUB that wishes to use
+C<UNDERBAR>.
+
+=for apidoc AmU||UNDERBAR
+The SV* corresponding to the $_ variable. Works even if there
+is a lexical $_ in scope.
+
 =cut
 */
 
@@ -106,6 +114,11 @@ handled automatically by C<xsubpp>.
 #define XSINTERFACE_FUNC_SET(cv,f)     \
                CvXSUBANY(cv).any_dxptr = (void (*) (pTHX_ void*))(f)
 
+#define dUNDERBAR I32 padoff_du = pad_findmy("$_")
+#define UNDERBAR ((padoff_du == NOT_IN_PAD \
+           || PAD_COMPNAME_FLAGS(padoff_du) & SVpad_OUR) \
+       ? DEFSV : PAD_SVl(padoff_du))
+
 /* Simple macros to put new mortal values onto the stack.   */
 /* Typically used to return values from XS functions.       */
 
index b0381fe..27daa64 100644 (file)
@@ -5418,6 +5418,16 @@ This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
 =for hackers
 Found in file XSUB.h
 
+=item dUNDERBAR
+
+Sets up the C<padoff_du> variable for an XSUB that wishes to use
+C<UNDERBAR>.
+
+               dUNDERBAR;
+
+=for hackers
+Found in file XSUB.h
+
 =item dXSARGS
 
 Sets up stack and mark pointers for an XSUB, calling dSP and dMARK.
@@ -5498,6 +5508,14 @@ L<perlxs/"Using XS With C++">.
 =for hackers
 Found in file XSUB.h
 
+=item UNDERBAR
+
+The SV* corresponding to the $_ variable. Works even if there
+is a lexical $_ in scope.
+
+=for hackers
+Found in file XSUB.h
+
 =item XS
 
 Macro to declare an XSUB and its C parameter list.  This is handled by