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 d762a06..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;
@@ -26,8 +26,16 @@ Null CV pointer.
 
 =head1 CV Manipulation Functions
 
+This section documents functions to manipulate CVs which are code-values,
+or subroutines. For more information, see L<perlguts>.
+
 =for apidoc Am|HV*|CvSTASH|CV* cv
-Returns the stash of the CV.
+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
 */
@@ -36,17 +44,21 @@ Returns the stash of the CV.
 #  define Nullcv Null(CV*)
 #endif
 
-#define CvSTASH(sv)    ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash
+#define CvSTASH(sv)    (0+((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash)
+#define CvSTASH_set(cv,st) Perl_cvstash_set(aTHX_ cv, st)
 #define CvSTART(sv)    ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_start
 #define CvROOT(sv)     ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root
 #define CvXSUB(sv)     ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_xsub
 #define CvXSUBANY(sv)  ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_xsubany
-#define CvGV(sv)       ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv
+#define CvGV(sv)       (0+((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv)
+#define CvGV_set(cv,gv)        Perl_cvgv_set(aTHX_ cv, gv)
 #define CvFILE(sv)     ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file
 #ifdef USE_ITHREADS
-#  define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = savepv(CopFILE(cop)))
+#  define CvFILE_set_from_cop(sv, cop) \
+    (CvFILE(sv) = savepv(CopFILE(cop)), CvDYNFILE_on(sv))
 #else
-#  define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = CopFILE(cop))
+#  define CvFILE_set_from_cop(sv, cop) \
+    (CvFILE(sv) = CopFILE(cop), CvDYNFILE_off(sv))
 #endif
 #define CvFILEGV(sv)   (gv_fetchfile(CvFILE(sv)))
 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
@@ -62,6 +74,23 @@ Returns the stash of the CV.
 #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 */
@@ -76,6 +105,8 @@ Returns the stash of the CV.
 #define CVf_NODEBUG    0x0200  /* no DB::sub indirection for this CV
                                   (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)
@@ -133,6 +164,14 @@ Returns the stash of the CV.
 #define CvCVGV_RC_on(cv)       (CvFLAGS(cv) |= CVf_CVGV_RC)
 #define CvCVGV_RC_off(cv)      (CvFLAGS(cv) &= ~CVf_CVGV_RC)
 
+#define CvDYNFILE(cv)          (CvFLAGS(cv) & CVf_DYNFILE)
+#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  */
 
@@ -191,6 +230,8 @@ should print 123:
 =cut
 */
 
+typedef OP *(*Perl_call_checker)(pTHX_ OP *, GV *, SV *);
+
 /*
  * Local variables:
  * c-indentation-style: bsd