X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mop.c;h=65aa92502525c62c9176cdd22a7529eb473b4da3;hb=80d7d6350a5d1efbd6a399ef724ab8258baff30c;hp=ada6c0ec46fe54148d29c4f086d1bdbd70a7e09b;hpb=384bb6c99e7c8e724e67a7c8073efeed3b682973;p=gitmo%2FClass-MOP.git diff --git a/mop.c b/mop.c index ada6c0e..65aa925 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); @@ -93,17 +93,15 @@ mop_get_code_info (SV *coderef, char **pkg, char **name) we hit it without the guard, we segfault. The slightly odd return value strikes me as an improvement (mst) */ -#ifdef isGV_with_GP + if ( isGV_with_GP(CvGV(coderef)) ) { -#endif - *pkg = HvNAME( GvSTASH(CvGV(coderef)) ); + GV *gv = CvGV(coderef); + *pkg = HvNAME( GvSTASH(gv) ? GvSTASH(gv) : CvSTASH(coderef) ); *name = GvNAME( CvGV(coderef) ); -#ifdef isGV_with_GP } else { *pkg = "__UNKNOWN__"; *name = "__ANON__"; } -#endif return 1; } @@ -149,7 +147,7 @@ mop_get_package_symbols (HV *stash, type_filter_t filter, get_package_symbols_cb but that's the API */ key = HePV(he, keylen); package = HvNAME(stash); - fq = newSVpvf("%s::%s", package, key); + fq = sv_2mortal(newSVpvf("%s::%s", package, key)); sv = (SV *)get_cv(SvPV_nolen(fq), 0); break; } @@ -202,6 +200,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 +220,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 +236,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 +251,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 +268,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);