Devel-FindBlessedRefs
view release on metacpan or search on metacpan
FindBlessedRefs.xs view on Meta::CPAN
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
MODULE = Devel::FindBlessedRefs PACKAGE = Devel::FindBlessedRefs
PROTOTYPES: DISABLE
void
find_refs(package)
char *package
PREINIT:
SV* sva;
SV* svend;
SV* sv;
PPCODE:
// this stuff is mostly from perl-5.8.8/sv.c, but cleaned up to look like ordinary XS
for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
svend = &sva[SvREFCNT(sva)];
for (sv = sva + 1; sv < svend; ++sv) {
if ( SvROK(sv) ) {
// this part isn't from sv.c
// int sv_isa(SV* sv, const char* name)
if( sv_isa(sv, package) )
XPUSHs(sv);
}
}
}
void
find_refs_with_coderef(code_ref)
SV* code_ref;
PREINIT:
SV* sva;
SV* svend;
SV* sv;
svtype t;
U32 c;
CODE:
for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
svend = &sva[SvREFCNT(sva)];
for (sv = sva + 1; sv < svend; ++sv) {
if( SvROK(sv) ) {
dSP; // make a new local stack
PUSHMARK(SP); // start pushing
XPUSHs(sv); // push the sv as a mortal
PUTBACK; // end the stack
call_sv(code_ref, G_DISCARD);
}
}
}
( run in 0.910 second using v1.01-cache-2.11-cpan-71847e10f99 )