#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;
if (type == OP_RV2GV)
return newGVOP(OP_GV, 0, (GV*)sv);
+ if (SvTYPE(sv) == SVt_NULL) {
+ op_free(o);
+ return newOP(OP_NULL, 0);
+ }
+
return newSVOP(OP_CONST, 0, sv);
} else {
/* this bit not lifted, handles the 'sub doesn't return stuff' case
PROTOTYPES: DISABLE
UV
-_setup (CV *cv)
+setup_for_cv (class, CV *cv)
CODE:
RETVAL = (UV)hook_op_check_entersubforcv (cv, lift_cb, NULL);
OUTPUT:
RETVAL
void
-_teardown (UV id)
+teardown_for_cv (class, UV id)
CODE:
hook_op_check_entersubforcv_remove ((hook_op_check_id)id);