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
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;
}
}
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 = sv_2mortal(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_WITH_VALUE(package_cache_flag, "_package_cache_flag"),
DECLARE_KEY(methods),
DECLARE_KEY(VERSION),
- DECLARE_KEY(ISA)
+ DECLARE_KEY(ISA),
+ DECLARE_KEY_WITH_VALUE(_version, "-version")
};
SV *