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);
return total_size;
}
-
MODULE = Devel::Size PACKAGE = Devel::Size
+PROTOTYPES: DISABLE
+
IV
size(orig_thing)
SV *orig_thing
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));
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;
}
}