This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make -T HANDLE set the last stat type
[perl5.git] / cv.h
diff --git a/cv.h b/cv.h
index f47d171..a3b9865 100644 (file)
--- a/cv.h
+++ b/cv.h
@@ -8,7 +8,7 @@
  *
  */
 
-/* This structure must the beginning of XPVFM in sv.h  */
+/* This structure must match the beginning of XPVFM in sv.h  */
 
 struct xpvcv {
     _XPV_HEAD;
@@ -34,6 +34,9 @@ Returns the stash of the CV. A stash is the symbol table hash, containing
 the package-scoped variables in the package where the subroutine was defined.
 For more information, see L<perlguts>.
 
+This also has a special use with XS AUTOLOAD subs.
+See L<perlguts/Autoloading with XSUBs>.
+
 =cut
 */
 
@@ -71,6 +74,23 @@ For more information, see L<perlguts>.
 #define CvFLAGS(sv)    ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_flags
 #define CvOUTSIDE_SEQ(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside_seq
 
+/* These two are sometimes called on non-CVs */
+#define CvPROTO(sv)                               \
+       (                                          \
+        SvPOK(sv)                                  \
+         ? SvTYPE(sv) == SVt_PVCV && CvAUTOLOAD(sv) \
+            ? SvEND(sv)+1 : SvPVX_const(sv)          \
+         : NULL                                       \
+       )
+#define CvPROTOLEN(sv)                           \
+       (                                          \
+        SvPOK(sv)                                  \
+         ? SvTYPE(sv) == SVt_PVCV && CvAUTOLOAD(sv) \
+            ? SvLEN(sv)-SvCUR(sv)-2                  \
+            : SvCUR(sv)                               \
+         : 0                                           \
+       )
+
 #define CVf_METHOD     0x0001  /* CV is explicitly marked as a method */
 #define CVf_LVALUE     0x0002  /* CV return value can be used as lvalue */
 #define CVf_CONST      0x0004  /* inlinable sub */
@@ -86,6 +106,7 @@ For more information, see L<perlguts>.
                                   (esp. useful for special XSUBs) */
 #define CVf_CVGV_RC    0x0400  /* CvGV is reference counted */
 #define CVf_DYNFILE    0x1000  /* The filename isn't static  */
+#define CVf_AUTOLOAD   0x2000  /* SvPVX contains AUTOLOADed sub name  */
 
 /* This symbol for optimised communication between toke.c and op.c: */
 #define CVf_BUILTIN_ATTRS      (CVf_METHOD|CVf_LVALUE)
@@ -147,6 +168,10 @@ For more information, see L<perlguts>.
 #define CvDYNFILE_on(cv)       (CvFLAGS(cv) |= CVf_DYNFILE)
 #define CvDYNFILE_off(cv)      (CvFLAGS(cv) &= ~CVf_DYNFILE)
 
+#define CvAUTOLOAD(cv)         (CvFLAGS(cv) & CVf_AUTOLOAD)
+#define CvAUTOLOAD_on(cv)      (CvFLAGS(cv) |= CVf_AUTOLOAD)
+#define CvAUTOLOAD_off(cv)     (CvFLAGS(cv) &= ~CVf_AUTOLOAD)
+
 /* Flags for newXS_flags  */
 #define XS_DYNAMIC_FILENAME    0x01    /* The filename isn't static  */