B-CallChecker
view release on metacpan or search on metacpan
lib/B/CallChecker.xs view on Meta::CPAN
*ckobj_p = valp ? *valp : &PL_sv_undef;
}
static OP *cckfun_perl_ckfun(pTHX_ OP *entersubop, GV *namegv, SV *cckobj)
{
SV *ckobj_st, *namegv_st, *entersubop_st, *ckobj;
CV *ckfun;
ckfun_decode_perl_as_c(0, cckobj, &ckfun, &ckobj);
entersubop_st = encode_bop(entersubop);
namegv_st = sv_2mortal(newRV_inc((SV*)namegv));
ckobj_st = sv_2mortal(newRV_inc(ckobj));
ENTER;
{
dSP;
PUSHMARK(SP);
EXTEND(SP, 3);
PUSHs(entersubop_st);
PUSHs(namegv_st);
PUSHs(ckobj_st);
PUTBACK;
call_sv((SV*)ckfun, G_SCALAR);
SPAGAIN;
entersubop_st = POPs;
PUTBACK;
}
LEAVE;
return decode_bop(entersubop_st);
}
#define install_cv(cv, name) THX_install_cv(aTHX_ cv, name)
static void THX_install_cv(pTHX_ CV *cv, char const *name)
{
GV *gv = gv_fetchpv(name, GV_ADDMULTI, SVt_PVCV);
GvCV_set(gv, cv);
GvCVGEN(gv) = 0;
CvGV_set(cv, gv);
}
typedef SV *SVREF;
MODULE = B::CallChecker PACKAGE = B::CallChecker
PROTOTYPES: DISABLE
BOOT:
ckfun_cap_map = ptr_table_new();
stash_bop = gv_stashpvs("B::OP", 1);
install_cv(ckfun_encode_c_as_perl(Perl_ck_entersub_args_proto),
"B::CallChecker::ck_entersub_args_proto");
install_cv(ckfun_encode_c_as_perl(Perl_ck_entersub_args_proto_or_list),
"B::CallChecker::ck_entersub_args_proto_or_list");
void
cv_get_call_checker(CV *tgtcv)
PROTOTYPE: $
PREINIT:
Perl_call_checker cckfun;
SV *cckobj;
CV *ckfun;
SV *ckobj;
PPCODE:
PUTBACK;
cv_get_call_checker(tgtcv, &cckfun, &cckobj);
if(ckfun_c_is_encoded_perl(cckfun)) {
ckfun_decode_perl_as_c(cckfun, cckobj, &ckfun, &ckobj);
} else {
ckfun = ckfun_encode_c_as_perl(cckfun);
ckobj = cckobj;
}
SPAGAIN;
EXTEND(SP, 2);
PUSHs(sv_2mortal(newRV_inc((SV*)ckfun)));
PUSHs(sv_2mortal(newRV_inc(ckobj)));
void
cv_set_call_checker(CV *tgtcv, CV *ckfun, SVREF ckobj)
PROTOTYPE: $$$
PREINIT:
Perl_call_checker cckfun;
SV *cckobj;
CODE:
PUTBACK;
if(ckfun_perl_is_encoded_c(ckfun)) {
cckfun = ckfun_decode_c_as_perl(ckfun);
cckobj = ckobj;
} else {
ckfun_encode_perl_as_c(ckfun, ckobj, &cckfun, &cckobj);
}
cv_set_call_checker(tgtcv, cckfun, cckobj);
SPAGAIN;
OP *
ck_entersub_args_list(OP *entersubop)
PROTOTYPE: $
CODE:
PUTBACK;
RETVAL = ck_entersub_args_list(entersubop);
SPAGAIN;
OUTPUT:
RETVAL
( run in 1.025 second using v1.01-cache-2.11-cpan-71847e10f99 )