Set the pointer alignment (in bits) via a C macro generated by the Makefile.PL
Nicholas Clark [Sun, 1 May 2011 20:06:51 +0000 (21:06 +0100)]
The previous approach of using sizeof(void *) is flat out wrong on a 64 bit
system. The right answer is 3. It gives 4. Which isn't a problem once the
pointer rotation code in check_new() isn't buggy, but isn't as efficient as
desired.

Makefile.PL
Size.xs

index 2066fe8..d1b6a31 100644 (file)
@@ -1,9 +1,15 @@
 use 5.008;
 use ExtUtils::MakeMaker;
 
+use Config;
+(unpack "B*", pack "N", $Config{ptrsize}) =~ /^0+1(0+)$/
+  or die "Your pointer size of $Config{ptrsize} is very confusing";
+my $ptr_bits = length $1;
+
 WriteMakefile(
   NAME => 'Devel::Size',
   VERSION_FROM => 'lib/Devel/Size.pm',
+  DEFINE => "-DALIGN_BITS=$ptr_bits",
   ($ExtUtils::MakeMaker::VERSION >= 6.47 ? (MIN_PERL_VERSION => '5.008') : ()),
   ($ExtUtils::MakeMaker::VERSION >= 6.31 ? (LICENSE => 'perl') : ()),
 );
diff --git a/Size.xs b/Size.xs
index c276e44..1911d2e 100644 (file)
--- a/Size.xs
+++ b/Size.xs
@@ -46,7 +46,6 @@
    without excessive memory needs. The assumption is that your CPU cache
    works :-) (And that we're not going to bust it)  */
 
-#define ALIGN_BITS  ( sizeof(void*) >> 1 )
 #define BYTE_BITS    3
 #define LEAF_BITS   (16 - BYTE_BITS)
 #define LEAF_MASK   0x1FFF