In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/6cae08a8be145bcb838b49a6de6051e08d4e25a5?hp=aec1aee98641bc6f9ad658677f98ce6915bd139a>

- Log -----------------------------------------------------------------
commit 6cae08a8be145bcb838b49a6de6051e08d4e25a5
Author: Reini Urban <rur...@cpanel.net>
Date:   Mon Mar 16 10:27:37 2015 +0100

    MARK -Ds debugging
    
    display the MARK arity and pointers with MARK macros.
    assert on markptr underflow.
-----------------------------------------------------------------------

Summary of changes:
 perl.c   |  4 ++--
 pp.h     | 53 ++++++++++++++++++++++++++++++++++++++++++-----------
 pp_ctl.c | 12 ++++++------
 pp_hot.c |  4 ++--
 scope.c  |  2 ++
 5 files changed, 54 insertions(+), 21 deletions(-)

diff --git a/perl.c b/perl.c
index b64975b..8182562 100644
--- a/perl.c
+++ b/perl.c
@@ -2776,9 +2776,9 @@ Perl_call_sv(pTHX_ SV *sv, VOL I32 flags)
     }
     else {
        myop.op_other = (OP*)&myop;
-       PL_markstack_ptr--;
+       POPMARK;
        create_eval_scope(flags|G_FAKINGEVAL);
-       PL_markstack_ptr++;
+       INCMARK;
 
        JMPENV_PUSH(ret);
 
diff --git a/pp.h b/pp.h
index b497085..5712b8e 100644
--- a/pp.h
+++ b/pp.h
@@ -55,16 +55,47 @@ Refetch the stack pointer.  Used after a callback.  See 
L<perlcall>.
 #define MARK mark
 #define TARG targ
 
-#define PUSHMARK(p)    \
-       STMT_START {                                    \
-           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)
-#define POPMARK                (*PL_markstack_ptr--)
+#if defined(DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS)
+#define PUSHMARK(p)                                                   \
+    STMT_START {                                                      \
+        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);              \
+        DEBUG_s(PerlIO_printf(Perl_debug_log, "MARK push %p %d\n",    \
+                PL_markstack_ptr, *mark_stack_entry));                \
+    } STMT_END
+#define TOPMARK                                                       \
+    ({                                                                \
+        DEBUG_s(PerlIO_printf(Perl_debug_log, "MARK top  %p %d\n",    \
+                PL_markstack_ptr, *PL_markstack_ptr));                \
+        *PL_markstack_ptr;                                            \
+    })
+#define POPMARK                                                       \
+    ({                                                                \
+        DEBUG_s(PerlIO_printf(Perl_debug_log, "MARK pop  %p %d\n",    \
+                (PL_markstack_ptr-1), *(PL_markstack_ptr-1)));        \
+        assert((PL_markstack_ptr > PL_markstack) || !"MARK underflow");\
+        *PL_markstack_ptr--;                                          \
+    })
+#define INCMARK                                                       \
+    ({                                                                \
+        DEBUG_s(PerlIO_printf(Perl_debug_log, "MARK inc  %p %d\n",    \
+                (PL_markstack_ptr+1), *(PL_markstack_ptr+1)));        \
+        *PL_markstack_ptr++;                                          \
+    })
+#else
+#define PUSHMARK(p)                                                   \
+    STMT_START {                                                     \
+        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)
+#define POPMARK                (*PL_markstack_ptr--)
+#define INCMARK                (*PL_markstack_ptr++)
+#endif
 
 #define dSP            SV **sp = PL_stack_sp
 #define djSP           dSP
@@ -506,7 +537,7 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, 
C<L</mPUSHu>> and C<L</PUSHu>>.
                while (jump_o->op_type == OP_NULL)              \
                    jump_o = jump_o->op_next;                   \
                assert(jump_o->op_type == OP_ENTERSUB);         \
-               PL_markstack_ptr--;                             \
+               POPMARK;                                        \
                return jump_o->op_next;                         \
            }                                                   \
            return NORMAL;                                      \
diff --git a/pp_ctl.c b/pp_ctl.c
index cdbdbd0..f9306e1 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -928,13 +928,13 @@ PP(pp_grepstart)
     dSP;
     SV *src;
 
-    if (PL_stack_base + *PL_markstack_ptr == SP) {
+    if (PL_stack_base + TOPMARK == SP) {
        (void)POPMARK;
        if (GIMME_V == G_SCALAR)
            mXPUSHi(0);
        RETURNOP(PL_op->op_next->op_next);
     }
-    PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
+    PL_stack_sp = PL_stack_base + TOPMARK + 1;
     Perl_pp_pushmark(aTHX);                            /* push dst */
     Perl_pp_pushmark(aTHX);                            /* push src */
     ENTER_with_name("grep");                                   /* enter outer 
scope */
@@ -944,9 +944,9 @@ PP(pp_grepstart)
     ENTER_with_name("grep_item");                                      /* 
enter inner scope */
     SAVEVPTR(PL_curpm);
 
-    src = PL_stack_base[*PL_markstack_ptr];
+    src = PL_stack_base[TOPMARK];
     if (SvPADTMP(src)) {
-       src = PL_stack_base[*PL_markstack_ptr] = sv_mortalcopy(src);
+       src = PL_stack_base[TOPMARK] = sv_mortalcopy(src);
        PL_tmps_floor++;
     }
     SvTEMP_off(src);
@@ -962,7 +962,7 @@ PP(pp_mapwhile)
 {
     dSP;
     const I32 gimme = GIMME_V;
-    I32 items = (SP - PL_stack_base) - *PL_markstack_ptr; /* how many new 
items */
+    I32 items = (SP - PL_stack_base) - TOPMARK; /* how many new items */
     I32 count;
     I32 shift;
     SV** src;
@@ -1063,7 +1063,7 @@ PP(pp_mapwhile)
     LEAVE_with_name("grep_item");                                      /* exit 
inner scope */
 
     /* All done yet? */
-    if (PL_markstack_ptr[-1] > *PL_markstack_ptr) {
+    if (PL_markstack_ptr[-1] > TOPMARK) {
 
        (void)POPMARK;                          /* pop top */
        LEAVE_with_name("grep");                                        /* exit 
outer scope */
diff --git a/pp_hot.c b/pp_hot.c
index 87e306c..d1e5562 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3157,9 +3157,9 @@ PP(pp_grepwhile)
        ENTER_with_name("grep_item");                                   /* 
enter inner scope */
        SAVEVPTR(PL_curpm);
 
-       src = PL_stack_base[*PL_markstack_ptr];
+       src = PL_stack_base[TOPMARK];
        if (SvPADTMP(src)) {
-           src = PL_stack_base[*PL_markstack_ptr] = sv_mortalcopy(src);
+           src = PL_stack_base[TOPMARK] = sv_mortalcopy(src);
            PL_tmps_floor++;
        }
        SvTEMP_off(src);
diff --git a/scope.c b/scope.c
index bdf299a..037bbc0 100644
--- a/scope.c
+++ b/scope.c
@@ -131,6 +131,8 @@ Perl_markstack_grow(pTHX)
     Renew(PL_markstack, newmax, I32);
     PL_markstack_max = PL_markstack + newmax;
     PL_markstack_ptr = PL_markstack + oldmax;
+    DEBUG_s(PerlIO_printf(Perl_debug_log, "MARK grow %p %d by %d\n",
+            PL_markstack_ptr, *PL_markstack_ptr, oldmax));
     return PL_markstack_ptr;
 }
 

--
Perl5 Master Repository

Reply via email to