X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=BeginLift.xs;h=ebf9279ec2ee735b4f3a4c5bf2cea82ffb2f64a4;hb=HEAD;hp=9794747abcbad4af79321e1aa48dcadac64fda9f;hpb=eeee00dfd031b2d5c2cac5179c47a56da82a994e;p=p5sagit%2FDevel-BeginLift.git diff --git a/BeginLift.xs b/BeginLift.xs index 9794747..ebf9279 100644 --- a/BeginLift.xs +++ b/BeginLift.xs @@ -12,6 +12,33 @@ #define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o)) +#ifndef linklist +# define linklist(o) THX_linklist(aTHX_ o) +STATIC OP *THX_linklist(pTHX_ OP *o) { + OP *first; + if(o->op_next) + return o->op_next; + first = cUNOPo->op_first; + if (first) { + OP *kid; + o->op_next = LINKLIST(first); + kid = first; + for (;;) { + if (kid->op_sibling) { + kid->op_next = LINKLIST(kid->op_sibling); + kid = kid->op_sibling; + } else { + kid->op_next = o; + break; + } + } + } else { + o->op_next = o; + } + return o->op_next; +} +#endif /* !linklist */ + STATIC OP *lift_cb(pTHX_ OP *o, CV *cv, void *user_data) { dSP; SV *sv;