Jarkko Hietaniemi <[EMAIL PROTECTED]> wrote:
> $ cat big.pasm
> new P0, .BigInt
> set P0, 18446744073709551615
> print P0
> print "\n"
> end
> $ ./parrot ~/big.pasm
> 9223372036854775807
> $
> This on a 64-bit system (tru64 alpha), substitute 4294967295 for the
> 18446744073709551615 in a 32-bit system.
> I don't know off-hand what would be The Right Thing here (I'm guessing
> that a signed long is used to hold the parsed constant, and that's why
> the "unsigned" constant overflows) -- but silent lossage / corruption of
> the PASM's intent is clearly not a right thing to do.
Yep. It's kind of a GIGO. 4294967295 isn't a valid 32 bit signed. The
program runs ok with
set P0, 4294967295L
but that should of course be detected. The C< atol() >s in imcc/pbc.c
are the culprit. This patch helps:
--- parrot/imcc/pbc.c Sat Jul 17 16:14:00 2004
+++ parrot-leo/imcc/pbc.c Sun Aug 1 11:12:44 2004
@@ -758,7 +758,9 @@
else if (r->name[0] == '0' && r->name[1] == 'b')
r->color = strtoul(r->name+2, 0, 2);
else
- r->color = atol(r->name);
+ r->color = strtol(r->name, 0, 10);
+ if (errno == ERANGE)
+ fatal(1, "add_1_const", "Integer overflow '%s'", r->name);
break;
case 'S':
r->color = add_const_str(interpreter, r);
There are a few more such conversions. But I don't know, how portable
that is.
$ parrot big.pasm
error:imcc:add_1_const: Integer overflow '4294967295'
leo