This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
rpeep() assert oldoldop -> oldop -> o form a chain
authorDavid Mitchell <davem@iabyn.com>
Wed, 9 Dec 2015 14:30:05 +0000 (14:30 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 9 Dec 2015 14:30:05 +0000 (14:30 +0000)
In rpeep(), in a loop, the var o becomes each op in the op_next chain in
turn. At the same time, oldop is set to the previous value of o, and
oldoldop the previous but one.

Some places that modify the op_next chain weren't correctly upodating
oldop and oldoldop at the same time. Last few commits have fixed those
places.

This commit adds an assert at the top of loop to check that oldoldop and
oldop are in fact consistent.

(This assert was used to find the faults fixed in the previous couple of
commits).

op.c

diff --git a/op.c b/op.c
index 30595b7..0de303c 100644 (file)
--- a/op.c
+++ b/op.c
@@ -13127,6 +13127,11 @@ Perl_rpeep(pTHX_ OP *o)
        }
 
       redo:
        }
 
       redo:
+
+        /* oldoldop -> oldop -> o should be a chain of 3 adjacent ops */
+        assert(!oldoldop || oldoldop->op_next == oldop);
+        assert(!oldop    || oldop->op_next    == o);
+
        /* By default, this op has now been optimised. A couple of cases below
           clear this again.  */
        o->op_opt = 1;
        /* By default, this op has now been optimised. A couple of cases below
           clear this again.  */
        o->op_opt = 1;