From: Nicholas Clark Date: Sat, 7 May 2011 10:23:01 +0000 (+0200) Subject: Magic vtables aren't freed when magic is freed, so don't count them. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=9847261df894191f35b2917704fb21809f8609b7;p=p5sagit%2FDevel-Size.git Magic vtables aren't freed when magic is freed, so don't count them. They are static structures. Anything that assumes otherwise is buggy. --- diff --git a/CHANGES b/CHANGES index f221c7f..e91a6b9 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,8 @@ Revision history for Perl extension Devel::Size. 0.72_52 2011-05-09 nicholas * Use a table for SV body sizes. These incorporate the space saving post 5.8.x * Correctly handle SvOOK scalars. 5.12 and later don't use SvIVX(). + * Magic vtables aren't freed when magic is freed, so don't count them. + (They are static structures. Anything that assumes otherwise is buggy.) 0.75_51 2011-05-05 nicholas * Only use a static array of vtables on gcc. diff --git a/Makefile.PL b/Makefile.PL index 2f91101..e2dce20 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -8,43 +8,10 @@ use Config; or die "Your pointer size of $Config{ptrsize} is very confusing"; my $ptr_bits = length $1; -my $svh = "$Config{archlibexp}/CORE/perl.h"; -my $vtable_file = 'vtables.inc'; - -my %vtables; -open FH, "<$svh" - or die "Can't open $svh ($!) - is your perl install missing its headers?"; -while () { - next unless /^\s+(PL_vtbl_[a-z]+),\s*$/ or /^EXT MGVTBL (PL_vtbl_[a-z]+) =/; - ++$vtables{$1}; -} -warn "Didn't find any vtable names in $svh" unless %vtables; -close FH; - - -my %special = ( - PL_vtbl_collxfrm => 'USE_LOCALE_COLLATE', - PL_vtbl_mutex => 'USE_5005THREADS', -); - -open FH, ">$vtable_file" or die "Can't open $vtable_file: $!"; -foreach (sort keys %vtables) { - print FH "#ifdef $special{$_}\n" if ($special{$_}); - if ($Config{gccversion}) { - print FH " &$_,\n"; - } else { - print FH " check_new(st, &$_);\n"; - } - print FH "#endif\n" if ($special{$_}); -} - -close FH or die "Error closing $vtable_file: $!"; - WriteMakefile( NAME => 'Devel::Size', VERSION_FROM => 'lib/Devel/Size.pm', DEFINE => "-DALIGN_BITS=$ptr_bits", (eval $ExtUtils::MakeMaker::VERSION >= 6.47 ? (MIN_PERL_VERSION => '5.008') : ()), (eval $ExtUtils::MakeMaker::VERSION >= 6.31 ? (LICENSE => 'perl') : ()), - realclean => {FILES=> $vtable_file}, ); 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; }