Devel-GC-Helper
view release on metacpan or search on metacpan
gc_note_sv(tbl, (SV*) PL_sortstash);
gc_note_sv(tbl, (SV*) PL_firstgv);
gc_note_sv(tbl, (SV*) PL_secondgv);
gc_note_sv(tbl, (SV*) PL_pidstatus);
gc_note_sv(tbl, PL_lastscream);
gc_note_sv(tbl, PL_reg_sv);
gc_note_sv(tbl, (SV*) PL_stashcache);
ptr_table_store(tbl, (SV*) PL_strtab, (void*) 1);
gc_note_sv(tbl, PL_numeric_radix_sv);
{
I32 i = 0;
while (i <= PL_tmps_ix)
gc_note_sv(tbl, PL_tmps_stack[i++]);
walk_stack(tbl, PL_curstackinfo);
}
{
const I32 len = av_len((AV*)PL_regex_padav);
SV** const regexen = AvARRAY((AV*)PL_regex_padav);
IV i;
for(i = 0; i <= len; i++) {
if(SvREPADTMP(regexen[i])) {
gc_note_sv(tbl, regexen[i]);
} else {
gc_note_sv(tbl, regexen[i]);
gc_note_re(tbl, (INT2PTR(REGEXP *, SvIVX(regexen[i]))));
}
}
gc_note_sv(tbl, (SV*) PL_regex_padav);
}
return tbl;
}
MODULE = Devel::GC::Helper PACKAGE = Devel::GC::Helper
BOOT:
{
MY_CXT_INIT;
/* If any of the fields in the my_cxt_t struct need
to be initialised, do it here.
*/
}
SV*
sweep()
PPCODE:
{
PTR_TBL_t* tbl = sweep_root();
AV* av = newAV();
{
SV* sva;
I32 visited = 0;
for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
register const SV * const svend = &sva[SvREFCNT(sva)];
SV* svi;
for (svi = sva + 1; svi < svend; ++svi) {
if (SvTYPE(svi) != SVTYPEMASK
&& SvREFCNT(svi)
&& svi != (SV*)av
)
{
if (!ptr_table_fetch(tbl, svi)
&& (
SvTYPE(svi) == SVt_RV
|| SvTYPE(svi) == SVt_PVAV
|| SvTYPE(svi) == SVt_PVHV
|| SvTYPE(svi) == SVt_PVCV
|| (SvTYPE(svi) == SVt_PVMG && SvMAGICAL(svi))
)
) {
av_push(av, svi);
SvREFCNT_inc(svi);
visited++;
}
}
}
}
while (visited--) {
SV** sv = av_fetch(av, visited, (I32)0);
if(sv) {
av_store(av, visited, newRV_inc(*sv));
}
}
}
ST(0) = newRV_noinc((SV*)av);
sv_2mortal(ST(0));
XSRETURN(1);
}
( run in 1.217 second using v1.01-cache-2.11-cpan-71847e10f99 )