Sub-Op
view release on metacpan or search on metacpan
#if SO_THREADSAFE
void
CLONE(...)
PROTOTYPE: DISABLE
PREINIT:
HV *map;
CV *placeholder;
tTHX owner;
PPCODE:
{
dMY_CXT;
owner = MY_CXT.owner;
map = (HV *) so_clone((SV *) MY_CXT.map, owner);
placeholder = (CV *) so_clone((SV *) MY_CXT.placeholder, owner);
}
{
MY_CXT_CLONE;
MY_CXT.map = map;
MY_CXT.placeholder = placeholder;
MY_CXT.owner = aTHX;
}
XSRETURN(0);
#endif /* SO_THREADSAFE */
void
_placeholder(SV *sv)
PROTOTYPE: $
PPCODE:
if (SvROK(sv)) {
sv = SvRV(sv);
if (SvTYPE(sv) >= SVt_PVCV) {
dMY_CXT;
SvREFCNT_dec(MY_CXT.placeholder);
MY_CXT.placeholder = (CV *) SvREFCNT_inc(sv);
}
}
XSRETURN(0);
void
_custom_name(SV *op)
PROTOTYPE: $
PREINIT:
OP *o;
so_op_name_t *on;
PPCODE:
if (!SvROK(op))
XSRETURN_UNDEF;
o = INT2PTR(OP *, SvIV(SvRV(op)));
if (!o || o->op_type != OP_CUSTOM)
XSRETURN_UNDEF;
#ifdef USE_ITHREADS
MUTEX_LOCK(&so_op_name_mutex);
#endif /* USE_ITHREADS */
on = ptable_fetch(so_op_name, o);
#ifdef USE_ITHREADS
MUTEX_UNLOCK(&so_op_name_mutex);
#endif /* USE_ITHREADS */
if (!on)
XSRETURN_UNDEF;
ST(0) = sv_2mortal(newSVpvn(&on->buf, on->len));
XSRETURN(1);
void
_constant_sub(SV *sv)
PROTOTYPE: $
PPCODE:
if (!SvROK(sv))
XSRETURN_UNDEF;
sv = SvRV(sv);
if (SvTYPE(sv) < SVt_PVCV)
XSRETURN_UNDEF;
ST(0) = sv_2mortal(newSVuv(CvCONST(sv)));
XSRETURN(1);
t/Sub-Op-LexicalSub/LexicalSub.xs view on Meta::CPAN
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);
}
}
( run in 1.398 second using v1.01-cache-2.11-cpan-5511b514fd6 )