Object-Pad-FieldAttr-Checked
view release on metacpan or search on metacpan
lib/Object/Pad/FieldAttr/Checked.xs view on Meta::CPAN
SV *ret = sv_newmortal();
struct DataChecks_Checker *checker = (struct DataChecks_Checker *)cUNOP_AUX->op_aux;
sv_magicext(ret, sv, PERL_MAGIC_ext, &vtbl_checkmagic, (char *)checker, 0);
SETs(ret);
RETURN;
}
static SV *checked_parse(pTHX_ FieldMeta *fieldmeta, SV *valuesrc, void *_funcdata)
{
if(mop_field_get_sigil(fieldmeta) != '$')
croak("Can only apply the :Checked attribute to scalar fields");
dSP;
ENTER;
SAVETMPS;
/* eval_sv() et.al. will forgets what package we're actually running in
lib/Object/Pad/FieldAttr/Checked.xs view on Meta::CPAN
SPAGAIN;
SV *ret = SvREFCNT_inc(POPs);
FREETMPS;
LEAVE;
return ret;
}
static bool checked_apply(pTHX_ FieldMeta *fieldmeta, SV *value, SV **attrdata_ptr, void *_funcdata)
{
if(mop_field_get_sigil(fieldmeta) != '$')
croak("Can only apply the :Checked attribute to scalar fields");
struct DataChecks_Checker *checker = make_checkdata(value);
SvREFCNT_dec(value);
gen_assertmess(checker,
sv_2mortal(newSVpvf("Field %" SVf, SVfARG(mop_field_get_name(fieldmeta)))),
NULL);
*attrdata_ptr = (SV *)checker;
return TRUE;
}
static void checked_gen_accessor_ops(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *_funcdata,
enum AccessorType type, struct AccessorGenerationCtx *ctx)
{
struct DataChecks_Checker *checker = (struct DataChecks_Checker *)attrdata;
switch(type) {
case ACCESSOR_READER:
return;
case ACCESSOR_WRITER:
ctx->bodyop = op_append_elem(OP_LINESEQ,
lib/Object/Pad/FieldAttr/Checked.xs view on Meta::CPAN
op_contextualize(newUNOP(OP_RV2AV, 0, newGVOP(OP_GV, 0, PL_defgv)), G_SCALAR),
make_assertop(checker, newSLUGOP(0))),
ctx->bodyop);
return;
default:
croak("TODO: Unsure what to do with accessor type %d and :Checked", type);
}
}
static OP *checked_gen_valueassert_op(pTHX_ FieldMeta *fieldmeta, SV *attrdata, void *_funcdata,
OP *valueop)
{
struct DataChecks_Checker *checker = (struct DataChecks_Checker *)attrdata;
return make_assertop(checker, valueop);
}
static const struct FieldHookFuncs checked_hooks = {
.ver = OBJECTPAD_ABIVERSION,
.flags = OBJECTPAD_FLAG_ATTR_MUST_VALUE,
( run in 0.236 second using v1.01-cache-2.11-cpan-454fe037f31 )