#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
int
_unitcheckify(SV* sv);
int
_add_cv_to_reqd(CV *cv);
#if (PERL_VERSION >= 9 && PERL_SUBVERSION >= 5) \
|| (PERL_VERSION >= 10)
int
_add_cv_to_reqd(CV *cv) {
if
(!cv)
croak(
"Need a CV"
);
CvSPECIAL_on(cv);
if
(!PL_unitcheckav)
PL_unitcheckav = newAV();
av_unshift(PL_unitcheckav, 1);
av_store(PL_unitcheckav, 0, (SV*)cv);
return
0;
}
#else
int
_add_cv_to_reqd(CV *cv) {
if
(!cv)
croak(
"Need a CV"
);
if
(PL_main_start && ckWARN(WARN_VOID)) {
warn(
"Check::UnitCheck - Too late to run CHECK block"
);
return
1;
}
CvSPECIAL_on(cv);
if
(!PL_checkav)
PL_checkav = newAV();
av_unshift(PL_checkav, 1);
av_store(PL_checkav, 0, (SV*)cv);
return
0;
}
#endif
int
_unitcheckify(SV *sv) {
CV *cv;
cv = (CV*)SvRV(sv);
SvREFCNT_inc((SV*)cv);
if
(_add_cv_to_reqd(cv)) {
SvREFCNT_dec((SV*)cv);
}
else
{
return
0;
}
}
MODULE = Check::UnitCheck PACKAGE = Check::UnitCheck
int
unitcheckify(sv)
INPUT:
SV * sv
CODE:
if
(!sv)
croak(
"Need a subref a"
);
if
(!SvRV(sv))
croak(
"Need a subref b"
);
if
(! (SvTYPE(SvRV(sv)) == SVt_PVCV))
croak(
"Need a subref c"
);
RETVAL = _unitcheckify(sv);
OUTPUT:
RETVAL