This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Document IN_PERL_(RUN|COMPILE)TIME
[perl5.git] / cop.h
diff --git a/cop.h b/cop.h
index f9bf852..49f1d0c 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -76,35 +76,36 @@ typedef struct jmpenv JMPENV;
 
 /*
  *   PERL_FLEXIBLE_EXCEPTIONS
- * 
+ *
  * All the flexible exceptions code has been removed.
  * See the following threads for details:
  *
- *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2004-07/msg00378.html
- * 
+ *   Message-Id: 20040713143217.GB1424@plum.flirble.org
+ *   https://www.nntp.perl.org/group/perl.perl5.porters/2004/07/msg93041.html
+ *
  * Joshua's original patches (which weren't applied) and discussion:
- * 
+ *
  *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01396.html
  *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01489.html
  *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01491.html
  *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01608.html
  *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg02144.html
  *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg02998.html
- * 
+ *
  * Chip's reworked patch and discussion:
- * 
+ *
  *   http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1999-03/msg00520.html
- * 
+ *
  * The flaw in these patches (which went unnoticed at the time) was
  * that they moved some code that could potentially die() out of the
  * region protected by the setjmp()s.  This caused exceptions within
  * END blocks and such to not be handled by the correct setjmp().
- * 
+ *
  * The original patches that introduces flexible exceptions were:
  *
- * http://perl5.git.perl.org/perl.git/commit/312caa8e97f1c7ee342a9895c2f0e749625b4929
- * http://perl5.git.perl.org/perl.git/commit/14dd3ad8c9bf82cf09798a22cc89a9862dfd6d1a                                        
- *  
+ * https://github.com/Perl/perl5/commit/312caa8e97f1c7ee342a9895c2f0e749625b4929
+ * https://github.com/Perl/perl5/commit/14dd3ad8c9bf82cf09798a22cc89a9862dfd6d1a
+ *
  */
 
 #define dJMPENV                JMPENV cur_env
@@ -165,7 +166,7 @@ typedef struct jmpenv JMPENV;
     } STMT_END
 
 /*
-=head1 COP Hint Hashes
+=for apidoc_section COP Hint Hashes
 */
 
 typedef struct refcounted_he COPHH;
@@ -183,6 +184,8 @@ it has not been precomputed.  Returns a mortal scalar copy of the value
 associated with the key, or C<&PL_sv_placeholder> if there is no value
 associated with the key.
 
+=for apidoc Amnh||COPHH_KEY_UTF8
+
 =cut
 */
 
@@ -400,10 +403,10 @@ struct cop {
 #ifdef USE_ITHREADS
     PADOFFSET  cop_stashoff;   /* offset into PL_stashpad, for the
                                   package the line was compiled in */
-    char *     cop_file;       /* file name the following line # is from */
+    char *     cop_file;       /* name of file this command is from */
 #else
     HV *       cop_stash;      /* package line was compiled in */
-    GV *       cop_filegv;     /* file the following line # is from */
+    GV *       cop_filegv;     /* name of GV file this command is from */
 #endif
     U32                cop_hints;      /* hints bits from pragmata */
     U32                cop_seq;        /* parse sequence number */
@@ -412,13 +415,19 @@ struct cop {
     /* compile time state of %^H.  See the comment in op.c for how this is
        used to recreate a hash to return from caller.  */
     COPHH *    cop_hints_hash;
+    /* for now just a bitmask stored here.
+       If we get sufficient features this may become a pointer.
+       How these flags are stored is subject to change without
+       notice.  Use the macros to test for features.
+    */
+    U32                cop_features;
 };
 
 #ifdef USE_ITHREADS
 #  define CopFILE(c)           ((c)->cop_file)
 #  define CopFILEGV(c)         (CopFILE(c) \
                                 ? gv_fetchfile(CopFILE(c)) : NULL)
-                                
+
 #  ifdef NETWARE
 #    define CopFILE_set(c,pv)  ((c)->cop_file = savepv(pv))
 #    define CopFILE_setn(c,pv,l)  ((c)->cop_file = savepvn((pv),(l)))
@@ -443,7 +452,7 @@ struct cop {
 #  else
 #    define CopFILE_free(c)    (PerlMemShared_free(CopFILE(c)),(CopFILE(c) = NULL))
 #  endif
-#else
+#else /* Above: no threads; Below yes threads */
 #  define CopFILEGV(c)         ((c)->cop_filegv)
 #  define CopFILEGV_set(c,gv)  ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
 #  define CopFILE_set(c,pv)    CopFILEGV_set((c), gv_fetchfile(pv))
@@ -455,7 +464,7 @@ struct cop {
 #  else
 #    define CopFILEAVx(c)      (GvAV(CopFILEGV(c)))
 # endif
-#  define CopFILE(c)           (CopFILEGV(c) \
+#  define CopFILE(c)           (CopFILEGV(c) /* +2 for '_<' */         \
                                    ? GvNAME(CopFILEGV(c))+2 : NULL)
 #  define CopSTASH(c)          ((c)->cop_stash)
 #  define CopSTASH_set(c,hv)   ((c)->cop_stash = (hv))
@@ -472,10 +481,6 @@ struct cop {
 #define CopHINTHASH_set(c,h)   ((c)->cop_hints_hash = (h))
 
 /*
-=head1 COP Hint Reading
-*/
-
-/*
 =for apidoc Am|SV *|cop_hints_fetch_pvn|const COP *cop|const char *keypv|STRLEN keylen|U32 hash|U32 flags
 
 Look up the hint entry in the cop C<cop> with the key specified by
@@ -627,12 +632,6 @@ struct block_format {
 #  define CX_POP(cx) cxstack_ix--;
 #endif
 
-
-/* base for the next two macros. Don't use directly.
- * The context frame holds a reference to the CV so that it can't be
- * freed while we're executing it */
-
-
 #define CX_PUSHSUB_GET_LVALUE_MASK(func) \
        /* If the context is indeterminate, then only the lvalue */     \
        /* flags that the caller also has are applicable.        */     \
@@ -938,10 +937,6 @@ struct context {
 
 #define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc()))
 
-/* 
-=head1 "Gimme" Values
-*/
-
 /*
 =for apidoc AmnU||G_SCALAR
 Used to indicate scalar context.  See C<L</GIMME_V>>, C<L</GIMME>>, and
@@ -1007,6 +1002,8 @@ L<perlcall>.
 
 /* Support for switching (stack and block) contexts.
  * This ensures magic doesn't invalidate local stack and cx pointers.
+ * Which one to use (or add) is mostly, but not completely arbitrary:  See
+ * http://nntp.perl.org/group/perl.perl5.porters/257169
  */
 
 #define PERLSI_UNKNOWN         -1
@@ -1021,6 +1018,7 @@ L<perlcall>.
 #define PERLSI_DIEHOOK         8
 #define PERLSI_REQUIRE         9
 #define PERLSI_MULTICALL       10
+#define PERLSI_REGCOMP         11
 
 struct stackinfo {
     AV *               si_stack;       /* stack for current runlevel */
@@ -1113,14 +1111,23 @@ typedef struct stackinfo PERL_SI;
        }                                                               \
     } STMT_END
 
-#define IN_PERL_COMPILETIME    cBOOL(PL_curcop == &PL_compiling)
-#define IN_PERL_RUNTIME                cBOOL(PL_curcop != &PL_compiling)
-
+/*
+=for apidoc_section Utility Functions
+=for apidoc Amn|bool|IN_PERL_COMPILETIME
+Returns 1 if this macro is being called during the compilation phase of the
+program; otherwise 0;
 
+=for apidoc Amn|bool|IN_PERL_RUNTIME
+Returns 1 if this macro is being called during the execution phase of the
+program; otherwise 0;
 
+=cut
+*/
+#define IN_PERL_COMPILETIME     cBOOL(PL_curcop == &PL_compiling)
+#define IN_PERL_RUNTIME         cBOOL(PL_curcop != &PL_compiling)
 
 /*
-=head1 Multicall Functions
+=for apidoc_section Multicall Functions
 
 =for apidoc Amns||dMULTICALL
 Declare local variables for a multicall.  See L<perlcall/LIGHTWEIGHT CALLBACKS>.