This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regen pod issues
[perl5.git] / cop.h
diff --git a/cop.h b/cop.h
index e05c89e..a736768 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -544,7 +544,6 @@ be zero.
 /* OutCopFILE() is CopFILE for output (caller, die, warn, etc.) */
 #define OutCopFILE(c) CopFILE(c)
 
-/* FIXME NATIVE_HINTS if this is changed from op_private (see perl.h)  */
 #define CopHINTS_get(c)                ((c)->cop_hints + 0)
 #define CopHINTS_set(c, h)     STMT_START {                            \
                                    (c)->cop_hints = (h);               \
@@ -606,7 +605,7 @@ struct block_format {
           (PL_op->op_flags & OPf_WANT)                                 \
               ? OPpENTERSUB_LVAL_MASK                                  \
               : !(PL_op->op_private & OPpENTERSUB_LVAL_MASK)           \
-                  ? 0 : Perl_was_lvalue_sub(aTHX);                     \
+                  ? 0 : (U8)Perl_was_lvalue_sub(aTHX);                 \
        PUSHSUB_BASE(cx)                                                \
        cx->blk_u16 = PL_op->op_private &                               \
                          (phlags|OPpDEREF);                            \
@@ -654,7 +653,7 @@ struct block_format {
            /* abandon @_ if it got reified */                          \
            if (AvREAL(cx->blk_sub.argarray)) {                         \
                const SSize_t fill = AvFILLp(cx->blk_sub.argarray);     \
-               SvREFCNT_dec(cx->blk_sub.argarray);                     \
+               SvREFCNT_dec_NN(cx->blk_sub.argarray);                  \
                cx->blk_sub.argarray = newAV();                         \
                av_extend(cx->blk_sub.argarray, fill);                  \
                AvREIFY_only(cx->blk_sub.argarray);                     \
@@ -671,15 +670,15 @@ struct block_format {
 
 #define LEAVESUB(sv)                                                   \
     STMT_START {                                                       \
-       if (sv)                                                         \
-           SvREFCNT_dec(sv);                                           \
+       SvREFCNT_dec(sv);                                               \
     } STMT_END
 
 #define POPFORMAT(cx)                                                  \
        setdefout(cx->blk_format.dfoutgv);                              \
        CvDEPTH(cx->blk_format.cv)--;                                   \
-       if (!CvDEPTH(cx->blk_format.cv)) SvREFCNT_dec(cx->blk_format.cv); \
-       SvREFCNT_dec(cx->blk_format.dfoutgv);
+       if (!CvDEPTH(cx->blk_format.cv))                                \
+           SvREFCNT_dec_NN(cx->blk_format.cv);                         \
+       SvREFCNT_dec_NN(cx->blk_format.dfoutgv);
 
 /* eval context */
 struct block_eval {
@@ -718,7 +717,7 @@ struct block_eval {
        optype = CxOLD_OP_TYPE(cx);                                     \
        PL_eval_root = cx->blk_eval.old_eval_root;                      \
        if (cx->blk_eval.cur_text && SvSCREAM(cx->blk_eval.cur_text))   \
-           SvREFCNT_dec(cx->blk_eval.cur_text);                        \
+           SvREFCNT_dec_NN(cx->blk_eval.cur_text);                     \
        if (cx->blk_eval.old_namesv)                                    \
            sv_2mortal(cx->blk_eval.old_namesv);                        \
     } STMT_END
@@ -784,8 +783,8 @@ struct block_loop {
 
 #define POPLOOP(cx)                                                    \
        if (CxTYPE(cx) == CXt_LOOP_LAZYSV) {                            \
-           SvREFCNT_dec(cx->blk_loop.state_u.lazysv.cur);              \
-           SvREFCNT_dec(cx->blk_loop.state_u.lazysv.end);              \
+           SvREFCNT_dec_NN(cx->blk_loop.state_u.lazysv.cur);           \
+           SvREFCNT_dec_NN(cx->blk_loop.state_u.lazysv.end);           \
        }                                                               \
        if (CxTYPE(cx) == CXt_LOOP_FOR)                                 \
            SvREFCNT_dec(cx->blk_loop.state_u.ary.ary);
@@ -969,6 +968,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 +1050,7 @@ L<perlcall>.
                                   Perl_magic_methcall().  */
 #define G_WRITING_TO_STDERR 1024 /* Perl_write_to_stderr() is calling
                                    Perl_magic_methcall().  */
+#define G_RE_REPARSING 0x800     /* compiling a run-time /(?{..})/ */
 
 /* flag bits for PL_in_eval */
 #define EVAL_NULL      0       /* not in an eval */
@@ -1056,6 +1058,7 @@ L<perlcall>.
 #define EVAL_WARNONLY  2       /* used by yywarn() when calling yyerror() */
 #define EVAL_KEEPERR   4       /* set by Perl_call_sv if G_KEEPERR */
 #define EVAL_INREQUIRE 8       /* The code is being required. */
+#define EVAL_RE_REPARSING 0x10 /* eval_sv() called with G_RE_REPARSING */
 
 /* Support for switching (stack and block) contexts.
  * This ensures magic doesn't invalidate local stack and cx pointers.
@@ -1134,8 +1137,7 @@ typedef struct stackinfo PERL_SI;
            Perl_deb(aTHX_ "pop  STACKINFO %d at %s:%d\n",              \
                         i, __FILE__, __LINE__);})                      \
        if (!prev) {                                                    \
-           PerlIO_printf(Perl_error_log, "panic: POPSTACK\n");         \
-           my_exit(1);                                                 \
+           Perl_croak_popstack();                                      \
        }                                                               \
        SWITCHSTACK(PL_curstack,prev->si_stack);                        \
        /* don't free prev here, free them all at the END{} */          \
@@ -1182,12 +1184,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 +1199,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));                  \
@@ -1218,7 +1221,8 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
 #define POP_MULTICALL \
     STMT_START {                                                       \
-       if (! ((CvDEPTH(multicall_cv) = cx->blk_sub.olddepth)) ) {      \
+       cx = &cxstack[cxstack_ix];                                      \
+        if (! ((CvDEPTH(multicall_cv) = cx->blk_sub.olddepth)) ) {     \
                LEAVESUB(multicall_cv);                                 \
        }                                                               \
        POPBLOCK(cx,PL_curpm);                                          \
@@ -1231,7 +1235,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_;                              \
@@ -1241,9 +1245,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));                  \