Sub-Op

 view release on metacpan or  search on metacpan

Op.xs  view on Meta::CPAN


#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 )