This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Simplify double-nextstate optimisation
[perl5.git] / pp.h
diff --git a/pp.h b/pp.h
index 09d8bb1..f236185 100644 (file)
--- a/pp.h
+++ b/pp.h
@@ -57,9 +57,10 @@ Refetch the stack pointer.  Used after a callback.  See L<perlcall>.
 
 #define PUSHMARK(p)    \
        STMT_START {                                    \
-           if (UNLIKELY(++PL_markstack_ptr == PL_markstack_max))       \
-           markstack_grow();                           \
-           *PL_markstack_ptr = (I32)((p) - PL_stack_base);\
+           I32 * mark_stack_entry;                     \
+           if (UNLIKELY((mark_stack_entry = ++PL_markstack_ptr) == PL_markstack_max))  \
+           mark_stack_entry = markstack_grow();                                        \
+           *mark_stack_entry  = (I32)((p) - PL_stack_base);                            \
        } STMT_END
 
 #define TOPMARK                (*PL_markstack_ptr)
@@ -274,11 +275,11 @@ Does not use C<TARG>.  See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
 # define EXTEND(p,n)   STMT_START {                                     \
                            sp = stack_grow(sp,p,(SSize_t) (n));         \
                            PERL_UNUSED_VAR(sp);                         \
-                       } STMT_END
+                       } STMT_END
 /* Same thing, but update mark register too. */
 # define MEXTEND(p,n)   STMT_START {                                    \
                             const int markoff = mark - PL_stack_base;   \
-                            sp = stack_grow(sp,p,(SSize_t) (n)));       \
+                            sp = stack_grow(sp,p,(SSize_t) (n))       \
                             mark = PL_stack_base + markoff;             \
                             PERL_UNUSED_VAR(sp);                        \
                         } STMT_END
@@ -305,7 +306,7 @@ Does not use C<TARG>.  See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
 #define PUSHi(i)       STMT_START { sv_setiv(TARG, (IV)(i)); PUSHTARG; } STMT_END
 #define PUSHu(u)       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
 
-#define XPUSHs(s)      (EXTEND(sp,1), *++sp = (s))
+#define XPUSHs(s)      STMT_START { EXTEND(sp,1); *++sp = (s); } STMT_END
 #define XPUSHTARG      STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END
 #define XPUSHp(p,l)    STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END
 #define XPUSHn(n)      STMT_START { sv_setnv(TARG, (NV)(n)); XPUSHTARG; } STMT_END
@@ -378,8 +379,7 @@ Does not use C<TARG>.  See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
 
 #define ARGTARG                PL_op->op_targ
 
-    /* See OPpTARGET_MY: */
-#define MAXARG         (PL_op->op_private & 15)
+#define MAXARG         (PL_op->op_private & OPpARG4_MASK)
 
 #define SWITCHSTACK(f,t) \
     STMT_START {                                                       \
@@ -391,9 +391,10 @@ Does not use C<TARG>.  See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
     } STMT_END
 
 #define EXTEND_MORTAL(n) \
-    STMT_START {                                                       \
-       if (UNLIKELY(PL_tmps_ix + (n) >= PL_tmps_max))                  \
-           tmps_grow(n);                                               \
+    STMT_START {                                               \
+       SSize_t eMiX = PL_tmps_ix + (n);                        \
+       if (UNLIKELY(eMiX >= PL_tmps_max))                      \
+           (void)Perl_tmps_grow_p(aTHX_ eMiX);                 \
     } STMT_END
 
 #define AMGf_noright   1
@@ -479,15 +480,6 @@ Does not use C<TARG>.  See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
 
 
 #define opASSIGN (PL_op->op_flags & OPf_STACKED)
-#define SETsv(sv)      STMT_START {                                    \
-               if (opASSIGN || (SvFLAGS(TARG) & SVs_PADMY))            \
-                  { sv_setsv(TARG, (sv)); SETTARG; }                   \
-               else SETs(sv); } STMT_END
-
-#define SETsvUN(sv)    STMT_START {                                    \
-               if (SvFLAGS(TARG) & SVs_PADMY)          \
-                  { sv_setsv(TARG, (sv)); SETTARG; }                   \
-               else SETs(sv); } STMT_END
 
 /*
 =for apidoc mU||LVRET