Revert the intent of cb11131e. st (was tv) can be NULL.
Nicholas Clark [Fri, 15 Apr 2011 20:38:03 +0000 (21:38 +0100)]
There's (currently) a call to thing_size() with a NULL st early in total_size().
None of the existing tests caused a code path to be followed that reaches the
assertion, so add one that does.

Size.xs
t/basic.t

diff --git a/Size.xs b/Size.xs
index 1246590..fa2d12a 100644 (file)
--- a/Size.xs
+++ b/Size.xs
@@ -79,10 +79,11 @@ check_new(struct state *st, const void *const p) {
     U8 **leaf_p;
     U8 *leaf;
     unsigned int i;
-    void **tv_p = (void **) (st->tracking);
+    void **tv_p;
 
-    assert(st);
-    if (NULL == p) return FALSE;
+
+    if (NULL == p || NULL == st) return FALSE;
+    tv_p = (void **) (st->tracking);
     TRY_TO_CATCH_SEGV { 
         const char c = *(const char *)p;
     }
index 4dfed68..9805f70 100644 (file)
--- a/t/basic.t
+++ b/t/basic.t
@@ -1,8 +1,9 @@
 #!/usr/bin/perl -w
 
-use Test::More tests => 14;
+use Test::More tests => 15;
 use strict;
 use Devel::Size qw(size total_size);
+use Scalar::Util qw(weaken);
 
 can_ok ('Devel::Size', qw/
   size
@@ -91,3 +92,11 @@ use constant LARGE => 'N' x 8192;
 
 cmp_ok (total_size(\&LARGE), '>', 8192,
         'total_size for a constant includes the constant');
+
+{
+    my $a = [];
+    my $b = \$a;
+    weaken $b;
+    cmp_ok(total_size($a), '>', total_size([]),
+          'making a weakref upgrades the target to PVMG and adds magic');
+}