X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Size.xs;h=fa0673fa009fb1d77172d68c841ab922bf79f41c;hb=811a099c10b876edcc1167a58cf80bf42bc5eb4c;hp=c77a39154240a138092221a7db77c3eff3f0a2f8;hpb=35b71bcad21c9fb3ab22636b260608c89542e48f;p=p5sagit%2FDevel-Size.git diff --git a/Size.xs b/Size.xs index c77a391..fa0673f 100644 --- 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; }