For other-than-gcc, generate calls to check_new(...)
Nicholas Clark [Thu, 5 May 2011 09:00:07 +0000 (11:00 +0200)]
Only use a static array of vtables on gcc. Some other compilers may be happy
with it, but VC certainly isn't. It's only trivial to determine gcc or not.

CHANGES
Makefile.PL
Size.xs

diff --git a/CHANGES b/CHANGES
index a6fefbe..18ab31e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
 Revision history for Perl extension Devel::Size.
 
+0.75_51 2011-05-05 nicholas
+ * Only use a static array of vtables on gcc.
+
 0.75_50 2011-05-04 nicholas
  * The core's magic vtables are global constants, so aren't part of the size.
  * Follow mg_obj and mg_ptr.
index 5eb43c6..2f91101 100644 (file)
@@ -29,15 +29,13 @@ my %special = (
 
 open FH, ">$vtable_file" or die "Can't open $vtable_file: $!";
 foreach (sort keys %vtables) {
-    if ($special{$_}) {
-       print FH <<"EOT";
-#ifdef $special{$_}
-    &$_,
-#endif
-EOT
-    } else {
+    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: $!";
diff --git a/Size.xs b/Size.xs
index 8373101..14be0be 100644 (file)
--- a/Size.xs
+++ b/Size.xs
@@ -738,17 +738,27 @@ 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;
@@ -761,8 +771,12 @@ 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;
 }