X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Size.xs;h=fa0673fa009fb1d77172d68c841ab922bf79f41c;hb=811a099c10b876edcc1167a58cf80bf42bc5eb4c;hp=913467ba469711a0c2c08eb0eb06ae9876d24601;hpb=95dc1714d10e347894254292580004dd194f58db;p=p5sagit%2FDevel-Size.git diff --git a/Size.xs b/Size.xs index 913467b..fa0673f 100644 --- a/Size.xs +++ b/Size.xs @@ -315,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); @@ -773,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; @@ -806,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; }