This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Filter::Simple: eliminate /\C/
[perl5.git] / cop.h
diff --git a/cop.h b/cop.h
index b20eddb..37980f0 100644 (file)
--- a/cop.h
+++ b/cop.h
 
 struct jmpenv {
     struct jmpenv *    je_prev;
-    Sigjmp_buf         je_buf;         /* only for use if !je_throw */
+    Sigjmp_buf         je_buf;         /* uninit if je_prev is NULL */
     int                        je_ret;         /* last exception thrown */
     bool               je_mustcatch;   /* need to call longjmp()? */
 };
 
 typedef struct jmpenv JMPENV;
 
-#ifdef OP_IN_REGISTER
-#define OP_REG_TO_MEM  PL_opsave = op
-#define OP_MEM_TO_REG  op = PL_opsave
-#else
-#define OP_REG_TO_MEM  NOOP
-#define OP_MEM_TO_REG  NOOP
-#endif
-
 /*
  * How to build the first jmpenv.
  *
@@ -58,10 +50,11 @@ typedef struct jmpenv JMPENV;
 
 #define JMPENV_BOOTSTRAP \
     STMT_START {                               \
-       Zero(&PL_start_env, 1, JMPENV);         \
+       PERL_POISON_EXPR(PoisonNew(&PL_start_env, 1, JMPENV));\
+       PL_top_env = &PL_start_env;             \
+       PL_start_env.je_prev = NULL;            \
        PL_start_env.je_ret = -1;               \
        PL_start_env.je_mustcatch = TRUE;       \
-       PL_top_env = &PL_start_env;             \
     } STMT_END
 
 /*
@@ -107,9 +100,7 @@ typedef struct jmpenv JMPENV;
            Perl_deb(aTHX_ "JUMPENV_PUSH level=%d at %s:%d\n",          \
                         i,  __FILE__, __LINE__);})                     \
        cur_env.je_prev = PL_top_env;                                   \
-       OP_REG_TO_MEM;                                                  \
        cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK);              \
-       OP_MEM_TO_REG;                                                  \
        PL_top_env = &cur_env;                                          \
        cur_env.je_mustcatch = FALSE;                                   \
        (v) = cur_env.je_ret;                                           \
@@ -133,7 +124,6 @@ typedef struct jmpenv JMPENV;
            while (p) { i++; p = p->je_prev; }                  \
            Perl_deb(aTHX_ "JUMPENV_JUMP(%d) level=%d at %s:%d\n", \
                         (int)v, i, __FILE__, __LINE__);})      \
-       OP_REG_TO_MEM;                                          \
        if (PL_top_env->je_prev)                                \
            PerlProc_longjmp(PL_top_env->je_buf, (v));          \
        if ((v) == 2)                                           \
@@ -410,7 +400,7 @@ struct cop {
                                 
 #  ifdef NETWARE
 #    define CopFILE_set(c,pv)  ((c)->cop_file = savepv(pv))
-#    define CopFILE_setn(c,pv,l)  ((c)->cop_file = savepv((pv),(l)))
+#    define CopFILE_setn(c,pv,l)  ((c)->cop_file = savepvn((pv),(l)))
 #  else
 #    define CopFILE_set(c,pv)  ((c)->cop_file = savesharedpv(pv))
 #    define CopFILE_setn(c,pv,l)  ((c)->cop_file = savesharedpvn((pv),(l)))
@@ -444,8 +434,8 @@ struct cop {
 #  else
 #    define CopFILEAVx(c)      (GvAV(CopFILEGV(c)))
 # endif
-#  define CopFILE(c)           (CopFILEGV(c) && GvSV(CopFILEGV(c)) \
-                                   ? SvPVX(GvSV(CopFILEGV(c))) : NULL)
+#  define CopFILE(c)           (CopFILEGV(c) \
+                                   ? GvNAME(CopFILEGV(c))+2 : NULL)
 #  define CopSTASH(c)          ((c)->cop_stash)
 #  define CopSTASH_set(c,hv)   ((c)->cop_stash = (hv))
 #  define CopFILE_free(c)      (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = NULL))
@@ -581,7 +571,9 @@ struct block_format {
  * decremented by LEAVESUB, the other by LEAVE. */
 
 #define PUSHSUB_BASE(cx)                                               \
-       ENTRY_PROBE(GvENAME(CvGV(cv)),                                  \
+       ENTRY_PROBE(CvNAMED(cv)                                         \
+                       ? HEK_KEY(CvNAME_HEK(cv))                       \
+                       : GvENAME(CvGV(cv)),                            \
                CopFILE((const COP *)CvSTART(cv)),                      \
                CopLINE((const COP *)CvSTART(cv)),                      \
                CopSTASHPV((const COP *)CvSTART(cv)));                  \
@@ -596,16 +588,19 @@ struct block_format {
            SAVEFREESV(cv);                                             \
        }
 
-
-#define PUSHSUB(cx)                                                    \
-    {                                                                  \
+#define PUSHSUB_GET_LVALUE_MASK(func) \
        /* If the context is indeterminate, then only the lvalue */     \
        /* flags that the caller also has are applicable.        */     \
-       U8 phlags =                                                     \
+       (                                                               \
           (PL_op->op_flags & OPf_WANT)                                 \
               ? OPpENTERSUB_LVAL_MASK                                  \
               : !(PL_op->op_private & OPpENTERSUB_LVAL_MASK)           \
-                  ? 0 : (U8)Perl_was_lvalue_sub(aTHX);                 \
+                  ? 0 : (U8)func(aTHX)                                 \
+       )
+
+#define PUSHSUB(cx)                                                    \
+    {                                                                  \
+       U8 phlags = PUSHSUB_GET_LVALUE_MASK(Perl_was_lvalue_sub);       \
        PUSHSUB_BASE(cx)                                                \
        cx->blk_u16 = PL_op->op_private &                               \
                          (phlags|OPpDEREF);                            \
@@ -643,7 +638,10 @@ struct block_format {
 
 #define POPSUB(cx,sv)                                                  \
     STMT_START {                                                       \
-       RETURN_PROBE(GvENAME(CvGV((const CV*)cx->blk_sub.cv)),          \
+       const I32 olddepth = cx->blk_sub.olddepth;                      \
+       RETURN_PROBE(CvNAMED(cx->blk_sub.cv)                            \
+                       ? HEK_KEY(CvNAME_HEK(cx->blk_sub.cv))           \
+                       : GvENAME(CvGV(cx->blk_sub.cv)),                \
                CopFILE((COP*)CvSTART((const CV*)cx->blk_sub.cv)),      \
                CopLINE((COP*)CvSTART((const CV*)cx->blk_sub.cv)),      \
                CopSTASHPV((COP*)CvSTART((const CV*)cx->blk_sub.cv)));  \
@@ -664,7 +662,8 @@ struct block_format {
            }                                                           \
        }                                                               \
        sv = MUTABLE_SV(cx->blk_sub.cv);                                \
-       if (sv && (CvDEPTH((const CV*)sv) = cx->blk_sub.olddepth))      \
+       LEAVE_SCOPE(PL_scopestack[cx->blk_oldscopesp-1]);               \
+       if (sv && (CvDEPTH((const CV*)sv) = olddepth))                  \
            sv = NULL;                                          \
     } STMT_END
 
@@ -674,11 +673,15 @@ struct block_format {
     } STMT_END
 
 #define POPFORMAT(cx)                                                  \
-       setdefout(cx->blk_format.dfoutgv);                              \
-       CvDEPTH(cx->blk_format.cv)--;                                   \
-       if (!CvDEPTH(cx->blk_format.cv))                                \
+    STMT_START {                                                       \
+       CV * const cv = cx->blk_format.cv;                              \
+       GV * const dfuot = cx->blk_format.dfoutgv;                      \
+       setdefout(dfuot);                                               \
+       LEAVE_SCOPE(PL_scopestack[cx->blk_oldscopesp-1]);               \
+       if (!--CvDEPTH(cv))                                             \
            SvREFCNT_dec_NN(cx->blk_format.cv);                         \
-       SvREFCNT_dec_NN(cx->blk_format.dfoutgv);
+       SvREFCNT_dec_NN(dfuot);                                         \
+    } STMT_END
 
 /* eval context */
 struct block_eval {
@@ -968,6 +971,8 @@ struct context {
 
 /* private flags for CXt_SUB and CXt_FORMAT */
 #define CXp_HASARGS    0x20
+#define CXp_SUB_RE     0x40    /* code called within regex, i.e. (?{}) */
+#define CXp_SUB_RE_FAKE        0x80    /* fake sub CX for (?{}) in current scope */
 
 /* private flags for CXt_EVAL */
 #define CXp_REAL       0x20    /* truly eval'', not a lookalike */
@@ -1049,6 +1054,7 @@ L<perlcall>.
 #define G_WRITING_TO_STDERR 1024 /* Perl_write_to_stderr() is calling
                                    Perl_magic_methcall().  */
 #define G_RE_REPARSING 0x800     /* compiling a run-time /(?{..})/ */
+#define G_METHOD_NAMED 4096    /* calling named method, eg without :: or ' */
 
 /* flag bits for PL_in_eval */
 #define EVAL_NULL      0       /* not in an eval */
@@ -1157,14 +1163,14 @@ typedef struct stackinfo PERL_SI;
 =head1 Multicall Functions
 
 =for apidoc Ams||dMULTICALL
-Declare local variables for a multicall. See L<perlcall/LIGHTWEIGHT CALLBACKS>.
+Declare local variables for a multicall.  See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
 =for apidoc Ams||PUSH_MULTICALL
 Opening bracket for a lightweight callback.
 See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
 =for apidoc Ams||MULTICALL
-Make a lightweight callback. See L<perlcall/LIGHTWEIGHT CALLBACKS>.
+Make a lightweight callback.  See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
 =for apidoc Ams||POP_MULTICALL
 Closing bracket for a lightweight callback.
@@ -1182,12 +1188,12 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
     U8 hasargs = 0             /* used by PUSHSUB */
 
 #define PUSH_MULTICALL(the_cv) \
-    PUSH_MULTICALL_WITHDEPTH(the_cv, 1);
+    PUSH_MULTICALL_FLAGS(the_cv, 0)
 
-/* Like PUSH_MULTICALL, but allows you to specify the CvDEPTH increment,
- * rather than the default of 1 (this isn't part of the public API) */
+/* Like PUSH_MULTICALL, but allows you to specify extra flags
+ * for the CX stack entry (this isn't part of the public API) */
 
-#define PUSH_MULTICALL_WITHDEPTH(the_cv, depth) \
+#define PUSH_MULTICALL_FLAGS(the_cv, flags) \
     STMT_START {                                                       \
        CV * const _nOnclAshIngNamE_ = the_cv;                          \
        CV * const cv = _nOnclAshIngNamE_;                              \
@@ -1197,9 +1203,10 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
        SAVETMPS; SAVEVPTR(PL_op);                                      \
        CATCH_SET(TRUE);                                                \
        PUSHSTACKi(PERLSI_SORT);                                        \
-       PUSHBLOCK(cx, CXt_SUB|CXp_MULTICALL, PL_stack_sp);              \
+       PUSHBLOCK(cx, (CXt_SUB|CXp_MULTICALL|flags), PL_stack_sp);      \
        PUSHSUB(cx);                                                    \
-       CvDEPTH(cv) += depth;                                           \
+        if (!(flags & CXp_SUB_RE_FAKE))                                 \
+            CvDEPTH(cv)++;                                             \
        if (CvDEPTH(cv) >= 2) {                                         \
            PERL_STACK_OVERFLOW_CHECK();                                \
            Perl_pad_push(aTHX_ padlist, CvDEPTH(cv));                  \
@@ -1232,7 +1239,7 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 /* Change the CV of an already-pushed MULTICALL CxSUB block.
  * (this isn't part of the public API) */
 
-#define CHANGE_MULTICALL_WITHDEPTH(the_cv, depth) \
+#define CHANGE_MULTICALL_FLAGS(the_cv, flags) \
     STMT_START {                                                       \
        CV * const _nOnclAshIngNamE_ = the_cv;                          \
        CV * const cv = _nOnclAshIngNamE_;                              \
@@ -1242,9 +1249,10 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
        if (! ((CvDEPTH(multicall_cv) = cx->blk_sub.olddepth)) ) {      \
                LEAVESUB(multicall_cv);                                 \
        }                                                               \
-       cx->cx_type &= ~CXp_HASARGS;                                    \
+       cx->cx_type = (CXt_SUB|CXp_MULTICALL|flags);                    \
        PUSHSUB(cx);                                                    \
-       CvDEPTH(cv) += depth;                                           \
+        if (!(flags & CXp_SUB_RE_FAKE))                                 \
+            CvDEPTH(cv)++;                                             \
        if (CvDEPTH(cv) >= 2) {                                         \
            PERL_STACK_OVERFLOW_CHECK();                                \
            Perl_pad_push(aTHX_ padlist, CvDEPTH(cv));                  \