X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mop.c;h=126568d78352871b4a0e8dcf5cc0f43dbbe9158c;hb=2ca3697e2414c1450af329c5e00503849f257df5;hp=ada6c0ec46fe54148d29c4f086d1bdbd70a7e09b;hpb=384bb6c99e7c8e724e67a7c8073efeed3b682973;p=gitmo%2FClass-MOP.git diff --git a/mop.c b/mop.c index ada6c0e..126568d 100644 --- a/mop.c +++ b/mop.c @@ -1,7 +1,7 @@ #include "mop.h" void -mop_call_xs (pTHX_ void (*subaddr) (pTHX_ CV *), CV *cv, SV **mark) +mop_call_xs (pTHX_ XSPROTO(subaddr), CV *cv, SV **mark) { dSP; PUSHMARK(mark); @@ -202,6 +202,9 @@ mop_get_all_package_symbols (HV *stash, type_filter_t filter) return ret; } +#define DECLARE_KEY(name) { #name, #name, NULL, 0 } +#define DECLARE_KEY_WITH_VALUE(name, value) { #name, value, NULL, 0 } + /* the order of these has to match with those in mop.h */ static struct { const char *name; @@ -219,13 +222,13 @@ static struct { DECLARE_KEY(ISA) }; -inline SV * +SV * mop_prehashed_key_for (mop_prehashed_key_t key) { return prehashed_keys[key].key; } -inline U32 +U32 mop_prehashed_hash_for (mop_prehashed_key_t key) { return prehashed_keys[key].hash; @@ -235,7 +238,6 @@ void mop_prehash_keys () { int i; - for (i = 0; i < key_last; i++) { const char *value = prehashed_keys[i].value; prehashed_keys[i].key = newSVpv(value, strlen(value)); @@ -251,7 +253,7 @@ XS(mop_xs_simple_reader) dXSARGS; #endif register HE *he; - mop_prehashed_key_t key = CvXSUBANY(cv).any_i32; + mop_prehashed_key_t key = (mop_prehashed_key_t)CvXSUBANY(cv).any_i32; SV *self; if (items != 1) { @@ -268,11 +270,11 @@ XS(mop_xs_simple_reader) croak("object is not a hashref"); } - if (!(he = hv_fetch_ent((HV *)SvRV(self), prehashed_keys[key].key, 0, prehashed_keys[key].hash))) { - ST(0) = &PL_sv_undef; + if ((he = hv_fetch_ent((HV *)SvRV(self), prehashed_keys[key].key, 0, prehashed_keys[key].hash))) { + ST(0) = HeVAL(he); } else { - ST(0) = HeVAL(he); + ST(0) = &PL_sv_undef; } XSRETURN(1);