They are static structures. Anything that assumes otherwise is buggy.
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.
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 (<FH>) {
- 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},
);
/* 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);
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;
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;
}