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;
SV *cb;
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);