import Devel-Size 0.54 from CPAN
[p5sagit/Devel-Size.git] / Size.xs
diff --git a/Size.xs b/Size.xs
index dd61be7..43b45ce 100644 (file)
--- 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;
        }
       }