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.626 second using v1.01-cache-2.11-cpan-454fe037f31 )