#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);
int
mop_get_code_info (SV *coderef, char **pkg, char **name)
{
+ GV *gv;
+
if (!SvOK(coderef) || !SvROK(coderef) || SvTYPE(SvRV(coderef)) != SVt_PVCV) {
return 0;
}
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)) );
- *name = GvNAME( CvGV(coderef) );
-#ifdef isGV_with_GP
+ gv = CvGV(coderef);
+ *pkg = HvNAME( GvSTASH(gv) ? GvSTASH(gv) : CvSTASH(coderef) );
+ *name = GvNAME( CvGV(coderef) );
} else {
- *pkg = "__UNKNOWN__";
- *name = "__ANON__";
+ *pkg = "__UNKNOWN__";
+ *name = "__ANON__";
}
-#endif
return 1;
}
}
while ( (he = hv_iternext(stash)) ) {
- SV *const gv = HeVAL(he);
- SV *sv = NULL;
- char *key;
+ GV * const gv = (GV*)HeVAL(he);
STRLEN keylen;
- char *package;
- SV *fq;
+ const char * const key = HePV(he, keylen);
+ SV *sv = NULL;
- switch( SvTYPE(gv) ) {
-#ifndef SVt_RV
- case SVt_RV:
-#endif
- case SVt_PV:
- case SVt_IV:
- /* expand the gv into a real typeglob if it
- * contains stub functions and we were asked to
- * return CODE symbols */
- if (filter == TYPE_FILTER_CODE) {
- if (SvROK(gv)) {
- /* we don't really care about the length,
- but that's the API */
- key = HePV(he, keylen);
- package = HvNAME(stash);
- fq = newSVpvf("%s::%s", package, key);
- sv = (SV *)get_cv(SvPV_nolen(fq), 0);
- break;
- }
-
- key = HePV(he, keylen);
- gv_init((GV *)gv, stash, key, keylen, GV_ADDMULTI);
- }
- /* fall through */
- case SVt_PVGV:
- switch (filter) {
- case TYPE_FILTER_CODE: sv = (SV *)GvCVu(gv); break;
- case TYPE_FILTER_ARRAY: sv = (SV *)GvAV(gv); break;
- case TYPE_FILTER_IO: sv = (SV *)GvIO(gv); break;
- case TYPE_FILTER_HASH: sv = (SV *)GvHV(gv); break;
- case TYPE_FILTER_SCALAR: sv = (SV *)GvSV(gv); break;
- default:
- croak("Unknown type");
- }
- break;
- default:
- continue;
+ if(isGV(gv)){
+ switch (filter) {
+ case TYPE_FILTER_CODE: sv = (SV *)GvCVu(gv); break;
+ case TYPE_FILTER_ARRAY: sv = (SV *)GvAV(gv); break;
+ case TYPE_FILTER_IO: sv = (SV *)GvIO(gv); break;
+ case TYPE_FILTER_HASH: sv = (SV *)GvHV(gv); break;
+ case TYPE_FILTER_SCALAR: sv = (SV *)GvSV(gv); break;
+ default:
+ croak("Unknown type");
+ }
+ }
+ /* expand the gv into a real typeglob if it
+ * contains stub functions or constants and we
+ * were asked to return CODE references */
+ else if (filter == TYPE_FILTER_CODE) {
+ gv_init(gv, stash, key, keylen, GV_ADDMULTI);
+ sv = (SV *)GvCV(gv);
}
if (sv) {
- const char *key = HePV(he, keylen);
if (!cb(key, keylen, sv, ud)) {
return;
}
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;
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) {