File Coverage

Gladiator.xs
Criterion Covered Total %
statement 27 27 100.0
branch 26 30 86.6
condition n/a
subroutine n/a
pod n/a
total 53 57 92.9


line stmt bran cond sub pod time code
1             #include "EXTERN.h"
2             #include "perl.h"
3             #include "XSUB.h"
4              
5             #include "ppport.h"
6              
7              
8             MODULE = Devel::Gladiator PACKAGE = Devel::Gladiator
9              
10              
11              
12             SV*
13             walk_arena()
14             PPCODE:
15             {
16             SV* sva;
17 2           I32 visited = 0;
18 2           AV* av = newAV();
19 937 100         for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
20 935           register const SV * const svend = &sva[SvREFCNT(sva)];
21             SV* svi;
22 158950 100         for (svi = sva + 1; svi < svend; ++svi) {
23 158015 100         if (SvTYPE(svi) != SVTYPEMASK
24 105549 50         && SvREFCNT(svi)
25 105549 100         && svi != (SV*)av
26             )
27             {
28             /** skip pads, they have a PVAV as their first element inside a PVAV **/
29 115567           if (SvTYPE(svi) == SVt_PVAV &&
30 10020           av_len( (AV*) svi) != -1) {
31 5510           SV** first = AvARRAY((AV*)svi);
32 5510 50         if (first && *first && SvTYPE(*first) == SVt_PVAV) {
    100          
    100          
33 3826           continue;
34             }
35 1684 50         if (first && *first && SvTYPE(*first) == SVt_PVCV) {
    100          
    100          
36 96           continue;
37             }
38             }
39 101625 100         if (SvTYPE(svi) == SVt_PVCV && CvROOT((CV*)svi) == 0) {
    100          
40 318           continue;
41             }
42 101307           ++visited;
43 101307           av_push(av,svi);
44 101307           SvREFCNT_inc(svi);
45             }
46             }
47             }
48              
49 101309 100         while (visited--) {
50 101307           SV** sv = av_fetch(av, visited, (I32)0);
51              
52             /** if (SvTYPE(sv) == SVt_PV
53             || SvTYPE(sv) == SVt_IV
54             || SvTYPE(sv) == SVt_NV
55             || SvTYPE(sv) == SVt_RV
56             || SvTYPE(sv) == SVt_PVIV
57             || SvTYPE(sv) == SVt_PVNV
58             || SvTYPE(sv) == SVt_PVMG) {
59             **/
60 101307 50         if(sv) {
61 101307           av_store(av, visited, newRV_inc(*sv));
62             }
63             }
64              
65 2           ST(0) = newRV_noinc((SV*)av);
66 2           sv_2mortal(ST(0));
67              
68             /*sv_dump(ST(0)); */
69 2           XSRETURN(1);
70             }
71