Reinstate weaken(), inadvertently removed by 8c394e1251fdfe38.
[p5sagit/Devel-Size.git] / Size.xs
diff --git a/Size.xs b/Size.xs
index c77a391..fa0673f 100644 (file)
--- a/Size.xs
+++ b/Size.xs
@@ -12,6 +12,9 @@
 #ifndef SvRV_const
 #  define SvRV_const(rv) SvRV(rv)
 #endif
+#ifndef SvOOK_offset
+#  define SvOOK_offset(sv, len) STMT_START { len = SvIVX(sv); } STMT_END
+#endif
 
 #ifdef _MSC_VER 
 /* "structured exception" handling is a Microsoft extension to C and C++.
@@ -312,12 +315,12 @@ magic_size(pTHX_ const SV * const thing, struct state *st) {
   /* Have we seen the magic pointer?  (NULL has always been seen before)  */
   while (check_new(st, magic_pointer)) {
     st->total_size += sizeof(MAGIC);
+    /* magic vtables aren't freed when magic is freed, so don't count them.
+       (They are static structures. Anything that assumes otherwise is buggy.)
+    */
+
 
     TRY_TO_CATCH_SEGV {
-        /* Have we seen the magic vtable? */
-        if (check_new(st, magic_pointer->mg_virtual)) {
-          st->total_size += sizeof(MGVTBL);
-        }
        sv_size(aTHX_ st, magic_pointer->mg_obj, TOTAL_SIZE_RECURSION);
        if (magic_pointer->mg_len == HEf_SVKEY) {
            sv_size(aTHX_ st, (SV *)magic_pointer->mg_ptr, TOTAL_SIZE_RECURSION);
@@ -760,7 +763,9 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing,
        st->total_size += SvLEN(thing);
 
     if(SvOOK(thing)) {
-        st->total_size += SvIVX(thing);
+       STRLEN len;
+       SvOOK_offset(thing, len);
+       st->total_size += len;
     }
     TAG;break;
 
@@ -768,27 +773,11 @@ sv_size(pTHX_ struct state *const st, const SV * const orig_thing,
   return TRUE;
 }
 
-/* Frustratingly, the vtables aren't const in perl.h
-   gcc is happy enough to have non-const initialisers in a static array.
-   VC seems not to be. (Is it actually treating the file as C++?)
-   So do the maximally portable thing, unless we know it's gcc, in which case
-   we can do the more space efficient version.  */
-
-#if __GNUC__
-void *vtables[] = {
-#include "vtables.inc"
-    NULL
-};
-#endif
-
 static struct state *
 new_state(pTHX)
 {
     SV *warn_flag;
     struct state *st;
-#if __GNUC__
-    void **vt_p = vtables;
-#endif
 
     Newxz(st, 1, struct state);
     st->go_yell = TRUE;
@@ -801,12 +790,6 @@ new_state(pTHX)
     check_new(st, &PL_sv_undef);
     check_new(st, &PL_sv_no);
     check_new(st, &PL_sv_yes);
-#if __GNUC__
-    while(*vt_p)
-       check_new(st, *vt_p++);
-#else
-#include "vtables.inc"
-#endif
     return st;
 }