Sub-Op
view release on metacpan or search on metacpan
t/Sub-Op-LexicalSub/LexicalSub.xs view on Meta::CPAN
STATIC HV *sols_map = NULL;
STATIC OP *sols_check(pTHX_ OP *o, void *ud_) {
char buf[sizeof(void*)*2+1];
SV *cb = ud_;
(void) hv_store(sols_map, buf, sprintf(buf, "%"UVxf, PTR2UV(o)), cb, 0);
return o;
}
STATIC OP *sols_pp(pTHX) {
dSP;
dMARK;
SV *cb;
int i, items;
{
char buf[sizeof(void*)*2+1];
SV **svp;
svp = hv_fetch(sols_map, buf, sprintf(buf, "%"UVxf, PTR2UV(PL_op)), 0);
if (!svp)
RETURN;
cb = *svp;
}
ENTER;
SAVETMPS;
PUSHMARK(MARK);
items = call_sv(cb, G_ARRAY);
SPAGAIN;
for (i = 0; i < items; ++i)
SvREFCNT_inc(SP[-i]);
PUTBACK;
FREETMPS;
LEAVE;
return NORMAL;
}
/* --- XS ------------------------------------------------------------------ */
MODULE = Sub::Op::LexicalSub PACKAGE = Sub::Op::LexicalSub
PROTOTYPES: ENABLE
BOOT:
{
sols_map = newHV();
}
void
_init(SV *name, SV *cb)
PROTOTYPE: $$
PREINIT:
sub_op_config_t c;
PPCODE:
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);
}
}
XSRETURN(0);
( run in 1.378 second using v1.01-cache-2.11-cpan-5511b514fd6 )