Long.java (parseLong): Corrected overflow detection code.

* java/lang/Long.java (parseLong): Corrected overflow detection
	code.
	* java/lang/Integer.java (parseInt): Corrected overflow detection
	code.

From-SVN: r26295
This commit is contained in:
Tom Tromey 1999-04-08 11:57:28 +00:00 committed by Tom Tromey
parent e086449d2a
commit c86e69b2f9
3 changed files with 25 additions and 30 deletions

View File

@ -1,5 +1,10 @@
1999-04-08 Tom Tromey <tromey@cygnus.com>
* java/lang/Long.java (parseLong): Corrected overflow detection
code.
* java/lang/Integer.java (parseInt): Corrected overflow detection
code.
* java/io/PrintStream.java (print): Handle null string argument.
(println): Likewise.

View File

@ -203,12 +203,15 @@ public final class Integer extends Number implements Comparable
int val = 0;
int digval;
int max = MAX_VALUE / radix;
// We can't directly write `max = (MAX_VALUE + 1) / radix'.
// So instead we fake it.
if (isNeg && MAX_VALUE % radix == radix - 1)
++max;
for ( ; index < len; index++)
{
// The the previous loop iteration left us with a negative
// value (which can only be the most negative value, but we
// don't check that), then having more digits is wrong.
if (val == MIN_VALUE)
if (val < 0 || val > max)
throw new NumberFormatException();
if ((digval = Character.digit(str.charAt(index), radix)) < 0)
@ -216,17 +219,9 @@ public final class Integer extends Number implements Comparable
// Throw an exception for overflow if result is negative.
// However, we special-case the most negative value.
val *= radix;
if (val < 0 || val + digval < 0)
{
if (isNeg && val + digval == MIN_VALUE)
{
// Ok.
}
else
throw new NumberFormatException();
}
val += digval;
val = val * radix + digval;
if (val < 0 && (! isNeg || val != MIN_VALUE))
throw new NumberFormatException();
}
return isNeg ? -(val) : val;

View File

@ -205,12 +205,15 @@ public final class Long extends Number implements Comparable
long val = 0;
int digval;
long max = MAX_VALUE / radix;
// We can't directly write `max = (MAX_VALUE + 1) / radix'.
// So instead we fake it.
if (isNeg && MAX_VALUE % radix == radix - 1)
++max;
for ( ; index < len; index++)
{
// The the previous loop iteration left us with a negative
// value (which can only be the most negative value, but we
// don't check that), then having more digits is wrong.
if (val == MIN_VALUE)
if (val < 0 || val > max)
throw new NumberFormatException();
if ((digval = Character.digit(str.charAt(index), radix)) < 0)
@ -218,17 +221,9 @@ public final class Long extends Number implements Comparable
// Throw an exception for overflow if result is negative.
// However, we special-case the most negative value.
val *= radix;
if (val < 0 || val + digval < 0)
{
if (isNeg && val + digval == MIN_VALUE)
{
// Ok.
}
else
throw new NumberFormatException();
}
val += digval;
val = val * radix + digval;
if (val < 0 && (! isNeg || val != MIN_VALUE))
throw new NumberFormatException();
}
return isNeg ? -(val) : val;