commit afb1a41bfb0a86232639d83c26869146bb3c8030
Author: Matthew Horsfall <[email protected]>
Date:   Mon Nov 14 11:55:06 2016 -0500

   Provide and use OpSIBLING to get at siblings if not provided

   This should allow Devel::Cover to work on all versions of Perl.

   On older Perls (<5.25.x?) OpSIBLING() isn't defined so we specify
   one that will access ->op_sibling.

   On newer Perls with PERL_OP_PARENT set to true (default now),
   OpSIBLING() will already exist and point to the correct op->sibparent

diff --git a/Cover.xs b/Cover.xs
index cb11bf7..50aa499 100644
--- a/Cover.xs
+++ b/Cover.xs
@@ -45,6 +45,14 @@ extern "C" {

#define MY_CXT_KEY "Devel::Cover::_guts" XS_VERSION

+#ifndef OpHAS_SIBLING
+#define OpHAS_SIBLING(o)      (cBOOL((o)->op_sibling))
+#endif
+
+#ifndef OpSIBLING
+#define OpSIBLING(o)          (0 + (o)->op_sibling)
+#endif
+
#define PDEB(a) a
#define NDEB(a) ;
#define D PerlIO_printf
@@ -614,9 +622,9 @@ static OP *find_skipped_conditional(pTHX_ OP *o) {
        return NULL;

    /* Get to the end of the "a || b || c" block */
-    OP *right = cLOGOP->op_first->op_sibling;
-    while (right && cLOGOPx(right)->op_sibling)
-        right = cLOGOPx(right)->op_sibling;
+    OP *right = OpSIBLING(cLOGOP->op_first);
+    while (right && OpSIBLING(cLOGOPx(right)))
+        right = OpSIBLING(cLOGOPx(right));

    if (!right)
        return NULL;
@@ -784,7 +792,7 @@ static void cover_logop(pTHX) {
            (PL_op->op_type == OP_XOR)) {
            /* no short circuit */

-            OP *right = cLOGOP->op_first->op_sibling;
+            OP *right = OpSIBLING(cLOGOP->op_first);

            NDEB(op_dump(right));

@@ -874,7 +882,7 @@ static void cover_logop(pTHX) {
        } else {
            /* short circuit */
#if PERL_VERSION > 14
-            OP *up = cLOGOP->op_first->op_sibling->op_next;
+            OP *up = OpSIBLING(cLOGOP->op_first)->op_next;
#if PERL_VERSION > 18
            OP *skipped;
#endif
@@ -887,7 +895,7 @@ static void cover_logop(pTHX) {
                add_conditional(aTHX_ up, 3);
                if (up->op_next == PL_op->op_next)
                    break;
-                up = cLOGOPx(up)->op_first->op_sibling->op_next;
+                up = OpSIBLING(cLOGOPx(up)->op_first)->op_next;
            }
#endif
            add_conditional(aTHX_ PL_op, 3);