return o;
}
+STATIC OP *sols_ref(pTHX_ OP *o, void *ud_) {
+ SV *cb = ud_;
+
+ return newSVOP(OP_ANONCODE, o->op_flags & ~OPf_KIDS, cb);
+}
+
STATIC OP *sols_pp(pTHX) {
dSP;
- dMARK;
SV *cb;
int i, items;
cb = *svp;
}
- ENTER;
- SAVETMPS;
-
- PUSHMARK(MARK);
-
- items = call_sv(cb, G_ARRAY);
-
- SPAGAIN;
- for (i = 0; i < items; ++i)
- SvREFCNT_inc(SP[-i]);
+ XPUSHs(cb);
PUTBACK;
- FREETMPS;
- LEAVE;
-
- return NORMAL;
+ return CALL_FPTR(PL_ppaddr[OP_ENTERSUB])(aTHX);
}
/* --- XS ------------------------------------------------------------------ */
if (SvROK(cb)) {
cb = SvRV(cb);
if (SvTYPE(cb) >= SVt_PVCV) {
- c.name = SvPV_const(name, c.namelen);
- c.check = sols_check;
- c.ud = SvREFCNT_inc(cb);
- c.pp = sols_pp;
- sub_op_register(aTHX_ &c);
+ sub_op_init(&c);
+ c.name = SvPV_const(name, c.namelen);
+ if (SvPOK(cb)) { /* Sub is prototyped */
+ c.proto = SvPV_const(cb, c.protolen);
+ }
+ c.check = sols_check;
+ c.ref = sols_ref;
+ c.ud = SvREFCNT_inc(cb);
+ c.pp = sols_pp;
+ sub_op_register(aTHX_ &c, 0);
}
}
XSRETURN(0);