Devel-GC-Helper

 view release on metacpan or  search on metacpan

Helper.xs  view on Meta::CPAN


  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 )