X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mop.c;h=25358f8bbf6e3364b375c83f83c58f97ae2e4788;hb=7ec7b950c0cc43c8ba1f2c53a8ebffcfc23ef858;hp=08e5349927aee19fd8addcea10fe684137434283;hpb=22932438751f5ca55563fc133b53f464dedbf3de;p=gitmo%2FClass-MOP.git diff --git a/mop.c b/mop.c index 08e5349..25358f8 100644 --- a/mop.c +++ b/mop.c @@ -242,3 +242,41 @@ mop_prehash_keys () PERL_HASH(prehashed_keys[i].hash, value, strlen(value)); } } + +SV * +mop_simple_reader (SV *self, mop_prehashed_key_t key) +{ + register HE *he; + + if (!SvROK(self)) { + croak("can't call %s as a class method", prehashed_keys[key].name); + } + + if (SvTYPE(SvRV(self)) != SVt_PVHV) { + croak("object is not a hashref"); + } + + if (!(he = hv_fetch_ent((HV *)SvRV(self), prehashed_keys[key].key, 0, prehashed_keys[key].hash))) { + return &PL_sv_undef; + } + + return SvREFCNT_inc(HeVAL(he)); +} + +XS(mop_xs_simple_reader) +{ +#ifdef dVAR + dVAR; dXSARGS; +#else + dXSARGS; +#endif + + if (items != 1) { + croak("expected exactly one argument"); + } + + ST(0) = mop_simple_reader (ST(0), CvXSUBANY(cv).any_i32); + sv_2mortal(ST(0)); + XSRETURN(1); +} +