X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Size.xs;h=43b45cee30da7b1777287f11a45333927e21119f;hb=fea63ffab1b34bbefc1f75a7beee2c5bdc96d67e;hp=dd61be7ce83b80b65b8f6fd25569834760047cf0;hpb=6a9ad7ec3939b34abe8422bd16196591d78ef98b;p=p5sagit%2FDevel-Size.git diff --git a/Size.xs b/Size.xs index dd61be7..43b45ce 100644 --- a/Size.xs +++ b/Size.xs @@ -165,11 +165,25 @@ UV thing_size(SV *orig_thing, HV *tracking_hash) { break; case SVt_PVCV: total_size += sizeof(XPVCV); + total_size += magic_size(thing, tracking_hash); carp("CV isn't complete"); break; case SVt_PVGV: + total_size += magic_size(thing, tracking_hash); total_size += sizeof(XPVGV); - carp("GC isn't complete"); + total_size += GvNAMELEN(thing); + /* Is there a file? */ + if (GvFILE(thing)) { + if (check_new(tracking_hash, GvFILE(thing))) { + total_size += strlen(GvFILE(thing)); + } + } + /* Is there something hanging off the glob? */ + if (GvGP(thing)) { + if (check_new(tracking_hash, GvGP(thing))) { + total_size += sizeof(GP); + } + } break; case SVt_PVFM: total_size += sizeof(XPVFM); @@ -185,9 +199,10 @@ UV thing_size(SV *orig_thing, HV *tracking_hash) { return total_size; } - MODULE = Devel::Size PACKAGE = Devel::Size +PROTOTYPES: DISABLE + IV size(orig_thing) SV *orig_thing @@ -234,13 +249,13 @@ CODE: av_push(pending_array, thing); /* Now just yank things off the end of the array until it's done */ - while (&PL_sv_undef != (thing = av_pop(pending_array))) { + while (av_len(pending_array) >= 0) { + thing = av_pop(pending_array); /* Process it if we've not seen it */ if (check_new(tracking_hash, thing)) { - /* First, is it pointing to or contraining something else? */ - if (SvOK(thing)) { + /* Is it valid? */ + if (thing) { /* Yes, it is. So let's check the type */ - switch (SvTYPE(thing)) { case SVt_RV: av_push(pending_array, SvRV(thing)); @@ -271,10 +286,35 @@ CODE: break; case SVt_PVHV: + /* Is there anything in here? */ + if (hv_iterinit((HV *)thing)) { + HE *temp_he; + while (temp_he = hv_iternext((HV *)thing)) { + av_push(pending_array, hv_iterval((HV *)thing, temp_he)); + } + } break; + case SVt_PVGV: + /* Run through all the pieces and push the ones with bits */ + if (GvSV(thing)) { + av_push(pending_array, (SV *)GvSV(thing)); + } + if (GvFORM(thing)) { + av_push(pending_array, (SV *)GvFORM(thing)); + } + if (GvAV(thing)) { + av_push(pending_array, (SV *)GvAV(thing)); + } + if (GvHV(thing)) { + av_push(pending_array, (SV *)GvHV(thing)); + } + if (GvCV(thing)) { + av_push(pending_array, (SV *)GvCV(thing)); + } + break; default: - puts("Dunno"); + break; } }