On Thu, 3 Jan 2002, Nicholas Clark wrote:
> On Thu, Jan 03, 2002 at 08:46:31AM -0600, David M. Lloyd wrote:
> >
> > Maybe we should be using the Configure output to determine what postfix to
> > use, based on the size of ints, longs, long longs, etc., and pointers,
> > rather than "almost always" being right?
And here's a patch that does that (feel free to tweak).
Note that the 'u' and friends are moved inside the ().
This passes tests in stack and pmc.t for Solaris 64-bit and (I
assume) other 64-bits as well.
===================================================================
RCS file: /home/perlcvs/parrot/Configure.pl,v
retrieving revision 1.65
diff -u -r1.65 Configure.pl
--- Configure.pl 2 Jan 2002 16:27:42 -0000 1.65
+++ Configure.pl 3 Jan 2002 20:01:55 -0000
@@ -141,11 +141,12 @@
debugging => $opt_debugging,
rm_f => 'rm -f',
rm_rf => 'rm -rf',
- stacklow => '(~0xfff)U',
- intlow => '(~0xfff)U',
- numlow => '(~0xfff)U',
- strlow => '(~0xfff)U',
- pmclow => '(~0xfff)U',
+ ptrconst => 'u',
+ stacklow => '(~0xfffu)',
+ intlow => '(~0xfffu)',
+ numlow => '(~0xfffu)',
+ strlow => '(~0xfffu)',
+ pmclow => '(~0xfffu)',
make => $Config{make},
make_set_make => $Config{make_set_make},
@@ -429,6 +430,24 @@
$c{packtype_n} = 'd';
+#
+# Find out what integer constant type we can use
+# for pointers.
+#
+
+print "Figuring out what integer type we can mix with pointers...\n";
+
+if ($c{intsize} == $c{ptrsize}) {
+ print "We'll use 'unsigned int'.\n";
+ $c{ptrconst} = "u";
+} elsif ($c{longsize} == $c{ptrsize}) {
+ print "We'll use 'unsigned long'.\n";
+ $c{ptrconst} = "ul";
+} else {
+ die <<"AARGH";
+Configure.pl: Unable to find an integer type that fits a pointer.
+AARGH
+}
#
# Build config.h, the Makfefiles and Types.pm:
@@ -701,7 +720,7 @@
my $vector = unpack("b*", pack("V", $_));
my $offset = rindex($vector, "1")+1;
my $mask = 2**$offset - 1;
- push @returns, "(~0x".sprintf("%x", $mask)."U)";
+ push @returns, "(~0x".sprintf("%x", $mask).$c{ptrconst}.")";
}
return @returns;
- D
<[EMAIL PROTECTED]>