X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=BeginLift.xs;h=ebf9279ec2ee735b4f3a4c5bf2cea82ffb2f64a4;hb=HEAD;hp=cf921442d95f3c859bf9272518cb9115e4c04358;hpb=b18c28d9536a2fe1a15d372ba4f3362403d1eb4b;p=p5sagit%2FDevel-BeginLift.git diff --git a/BeginLift.xs b/BeginLift.xs index cf92144..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; @@ -103,13 +130,13 @@ MODULE = Devel::BeginLift PACKAGE = Devel::BeginLift PROTOTYPES: DISABLE UV -setup_for_cv (CV *cv) +setup_for_cv (class, CV *cv) CODE: RETVAL = (UV)hook_op_check_entersubforcv (cv, lift_cb, NULL); OUTPUT: RETVAL void -teardown_for_cv (UV id) +teardown_for_cv (class, UV id) CODE: hook_op_check_entersubforcv_remove ((hook_op_check_id)id);