/* Figure out how much magic is attached to the SV and return the
size */
static void
-magic_size(const SV * const thing, struct state *st) {
+magic_size(pTHX_ const SV * const thing, struct state *st) {
MAGIC *magic_pointer;
/* Is there any? */
if (check_new(st, magic_pointer->mg_virtual)) {
st->total_size += sizeof(MGVTBL);
}
+ sv_size(aTHX_ st, magic_pointer->mg_obj, TOTAL_SIZE_RECURSION);
/* Get the next in the chain */
magic_pointer = magic_pointer->mg_moremagic;
sv_size(aTHX_ st, SvRV_const(thing), recurse);
else
st->total_size += SvLEN(thing);
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
TAG;break;
#if PERL_VERSION <= 8
case SVt_PVBM: TAG;
sv_size(aTHX_ st, SvRV_const(thing), recurse);
else
st->total_size += SvLEN(thing);
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
TAG;break;
#endif
case SVt_PVLV: TAG;
sv_size(aTHX_ st, SvRV_const(thing), recurse);
else
st->total_size += SvLEN(thing);
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
TAG;break;
/* How much space is dedicated to the array? Not counting the
elements in the array, mind, just the array itself */
complain about AvARYLEN() passing thing to it. */
sv_size(aTHX_ st, AvARYLEN(thing), recurse);
#endif
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
TAG;break;
case SVt_PVHV: TAG;
/* First the base struct */
}
}
}
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
TAG;break;
case SVt_PVCV: TAG;
st->total_size += sizeof(XPVCV);
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
st->total_size += ((XPVIO *) SvANY(thing))->xpv_len;
sv_size(aTHX_ st, (SV *)CvSTASH(thing), SOME_RECURSION);
TAG;break;
case SVt_PVGV: TAG;
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
st->total_size += sizeof(XPVGV);
if(isGV_with_GP(thing)) {
st->total_size += GvNAMELEN(thing);
TAG;break;
case SVt_PVFM: TAG;
st->total_size += sizeof(XPVFM);
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
st->total_size += ((XPVIO *) SvANY(thing))->xpv_len;
sv_size(aTHX_ st, (SV *)CvPADLIST(thing), SOME_RECURSION);
sv_size(aTHX_ st, (SV *)CvOUTSIDE(thing), recurse);
TAG;break;
case SVt_PVIO: TAG;
st->total_size += sizeof(XPVIO);
- magic_size(thing, st);
+ magic_size(aTHX_ thing, st);
if (check_new(st, (SvPVX_const(thing)))) {
st->total_size += ((XPVIO *) SvANY(thing))->xpv_cur;
}
#!/usr/bin/perl -w
use strict;
-use Test::More tests => 7;
+use Test::More tests => 11;
use Devel::Size ':all';
require Tie::Scalar;
cmp_ok($after_size, '>', $before_size, 'Still larger than initial size');
cmp_ok($after_size, '<', $compiled_size, 'size decreases due to unmagic');
}
+
+{
+ my $string = 'Perl Rules';
+ my $before_size = total_size($string);
+ cmp_ok($before_size, '>', length $string,
+ 'Our string has a non-zero length');
+ tie $string, 'Tie::StdScalar';
+ my $after_size = total_size($string);
+ cmp_ok($after_size, '>', $before_size, 'size increases due to magic');
+ is($string, undef, 'No value yet');
+ # This is defineately cheating, in that we're poking inside the
+ # implementation of Tie::StdScalar, but if we just write to $string, the way
+ # magic works, the (nice long) value is first written to the regular scalar,
+ # then picked up by the magic. So it grows, which defeats the purpose of the
+ # test.
+ ${tied $string} = 'X' x 1024;
+ cmp_ok(total_size($string), '>', $after_size + 1024,
+ 'the magic object is counted');
+}