X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Size.xs;h=40207331d5e1f1275c12b0f2c43f5c1193db98fe;hb=267703fda234ef545c9051071cc4c2b796282f34;hp=14be0be10aebb2a363a0dc8538d4dc9e49b8a41a;hpb=ec404c2370ba877301e093207215b59f5de80a7a;p=p5sagit%2FDevel-Size.git diff --git a/Size.xs b/Size.xs index 14be0be..4020733 100644 --- a/Size.xs +++ b/Size.xs @@ -498,6 +498,10 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing, st->total_size += sizeof(SV); + if (SvTYPE(thing) >= SVt_PVMG) { + magic_size(aTHX_ thing, st); + } + switch (SvTYPE(thing)) { /* Is it undef? */ case SVt_NULL: TAG; @@ -533,62 +537,7 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing, sv_size(aTHX_ st, SvRV_const(thing), recurse); TAG;break; #endif - /* How about a plain string? In which case we need to add in how - much has been allocated */ - case SVt_PV: TAG; - st->total_size += sizeof(XPV); - if(recurse && SvROK(thing)) - sv_size(aTHX_ st, SvRV_const(thing), recurse); - else - st->total_size += SvLEN(thing); - TAG;break; - /* A string with an integer part? */ - case SVt_PVIV: TAG; - st->total_size += sizeof(XPVIV); - if(recurse && SvROK(thing)) - sv_size(aTHX_ st, SvRV_const(thing), recurse); - else - st->total_size += SvLEN(thing); - if(SvOOK(thing)) { - st->total_size += SvIVX(thing); - } - TAG;break; - /* A scalar/string/reference with a float part? */ - case SVt_PVNV: TAG; - st->total_size += sizeof(XPVNV); - if(recurse && SvROK(thing)) - sv_size(aTHX_ st, SvRV_const(thing), recurse); - else - st->total_size += SvLEN(thing); - TAG;break; - case SVt_PVMG: TAG; - st->total_size += sizeof(XPVMG); - if(recurse && SvROK(thing)) - sv_size(aTHX_ st, SvRV_const(thing), recurse); - else - st->total_size += SvLEN(thing); - magic_size(aTHX_ thing, st); - TAG;break; -#if PERL_VERSION <= 8 - case SVt_PVBM: TAG; - st->total_size += sizeof(XPVBM); - if(recurse && SvROK(thing)) - sv_size(aTHX_ st, SvRV_const(thing), recurse); - else - st->total_size += SvLEN(thing); - magic_size(aTHX_ thing, st); - TAG;break; -#endif - case SVt_PVLV: TAG; - st->total_size += sizeof(XPVLV); - if(recurse && SvROK(thing)) - sv_size(aTHX_ st, SvRV_const(thing), recurse); - else - st->total_size += SvLEN(thing); - magic_size(aTHX_ thing, st); - TAG;break; - /* How much space is dedicated to the array? Not counting the - elements in the array, mind, just the array itself */ + case SVt_PVAV: TAG; st->total_size += sizeof(XPVAV); /* Is there anything in the array? */ @@ -621,7 +570,6 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing, complain about AvARYLEN() passing thing to it. */ sv_size(aTHX_ st, AvARYLEN(thing), recurse); #endif - magic_size(aTHX_ thing, st); TAG;break; case SVt_PVHV: TAG; /* First the base struct */ @@ -648,13 +596,23 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing, } } } - magic_size(aTHX_ thing, st); TAG;break; + + + case SVt_PVFM: TAG; + st->total_size += sizeof(XPVFM); + sv_size(aTHX_ st, (SV *)CvPADLIST(thing), SOME_RECURSION); + sv_size(aTHX_ st, (SV *)CvOUTSIDE(thing), recurse); + + if (st->go_yell && !st->fm_whine) { + carp("Devel::Size: Calculated sizes for FMs are incomplete"); + st->fm_whine = 1; + } + goto freescalar; + case SVt_PVCV: TAG; st->total_size += sizeof(XPVCV); - magic_size(aTHX_ thing, st); - st->total_size += ((XPVIO *) SvANY(thing))->xpv_len; sv_size(aTHX_ st, (SV *)CvSTASH(thing), SOME_RECURSION); sv_size(aTHX_ st, (SV *)SvSTASH(thing), SOME_RECURSION); sv_size(aTHX_ st, (SV *)CvGV(thing), SOME_RECURSION); @@ -666,11 +624,47 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing, op_size(aTHX_ CvSTART(thing), st); op_size(aTHX_ CvROOT(thing), st); } + goto freescalar; + + case SVt_PVIO: TAG; + st->total_size += sizeof(XPVIO); + /* Some embedded char pointers */ + check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_top_name); + check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_fmt_name); + check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_bottom_name); + /* Throw the GVs on the list to be walked if they're not-null */ + sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_top_gv, recurse); + sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_bottom_gv, recurse); + sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_fmt_gv, recurse); + + /* Only go trotting through the IO structures if they're really + trottable. If USE_PERLIO is defined we can do this. If + not... we can't, so we don't even try */ +#ifdef USE_PERLIO + /* Dig into xio_ifp and xio_ofp here */ + warn("Devel::Size: Can't size up perlio layers yet\n"); +#endif + goto freescalar; + +#if PERL_VERSION <= 8 + case SVt_PVBM: TAG; + st->total_size += sizeof(XPVBM); + goto freescalar; +#endif + + case SVt_PVLV: TAG; + st->total_size += sizeof(XPVLV); +#if (PERL_VERSION < 9) + goto freescalar; +#else + goto donegv; +#endif - TAG;break; case SVt_PVGV: TAG; - magic_size(aTHX_ thing, st); st->total_size += sizeof(XPVGV); +#if (PERL_VERSION >= 9) + donegv: +#endif if(isGV_with_GP(thing)) { st->total_size += GvNAMELEN(thing); #ifdef GvFILE @@ -695,43 +689,38 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing, sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_egv), recurse); sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_cv), recurse); } +#if (PERL_VERSION >= 9) + TAG; break; +#endif } - TAG;break; - case SVt_PVFM: TAG; - st->total_size += sizeof(XPVFM); - magic_size(aTHX_ thing, st); - st->total_size += ((XPVIO *) SvANY(thing))->xpv_len; - sv_size(aTHX_ st, (SV *)CvPADLIST(thing), SOME_RECURSION); - sv_size(aTHX_ st, (SV *)CvOUTSIDE(thing), recurse); + goto freescalar; - if (st->go_yell && !st->fm_whine) { - carp("Devel::Size: Calculated sizes for FMs are incomplete"); - st->fm_whine = 1; + case SVt_PVMG: TAG; + st->total_size += sizeof(XPVMG); + goto freescalar; + + case SVt_PVNV: TAG; + st->total_size += sizeof(XPVNV); + goto freescalar; + + case SVt_PVIV: TAG; + st->total_size += sizeof(XPVIV); + goto freescalar; + + case SVt_PV: TAG; + st->total_size += sizeof(XPV); + + freescalar: + if(recurse && SvROK(thing)) + sv_size(aTHX_ st, SvRV_const(thing), recurse); + else + st->total_size += SvLEN(thing); + + if(SvOOK(thing)) { + st->total_size += SvIVX(thing); } TAG;break; - case SVt_PVIO: TAG; - st->total_size += sizeof(XPVIO); - magic_size(aTHX_ thing, st); - if (check_new(st, (SvPVX_const(thing)))) { - st->total_size += ((XPVIO *) SvANY(thing))->xpv_cur; - } - /* Some embedded char pointers */ - check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_top_name); - check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_fmt_name); - check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_bottom_name); - /* Throw the GVs on the list to be walked if they're not-null */ - sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_top_gv, recurse); - sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_bottom_gv, recurse); - sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_fmt_gv, recurse); - /* Only go trotting through the IO structures if they're really - trottable. If USE_PERLIO is defined we can do this. If - not... we can't, so we don't even try */ -#ifdef USE_PERLIO - /* Dig into xio_ifp and xio_ofp here */ - warn("Devel::Size: Can't size up perlio layers yet\n"); -#endif - TAG;break; default: warn("Devel::Size: Unknown variable type: %d encountered\n", SvTYPE(thing) ); }