Fix for #467276: NaN/Infinity.toExponential(...) should not check range
git-svn-id: svn://10.0.0.236/trunk@255507 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
962c31bc46
commit
46812e1385
@ -161,13 +161,44 @@ final class NativeNumber extends IdScriptableObject
|
||||
return num_to(value, args, DToA.DTOSTR_FIXED,
|
||||
DToA.DTOSTR_FIXED, -20, 0);
|
||||
|
||||
case Id_toExponential:
|
||||
return num_to(value, args, DToA.DTOSTR_STANDARD_EXPONENTIAL,
|
||||
DToA.DTOSTR_EXPONENTIAL, 0, 1);
|
||||
case Id_toExponential: {
|
||||
// Handle special values before range check
|
||||
if(Double.isNaN(value)) {
|
||||
return "NaN";
|
||||
}
|
||||
if(Double.isInfinite(value)) {
|
||||
if(value >= 0) {
|
||||
return "Infinity";
|
||||
}
|
||||
else {
|
||||
return "-Infinity";
|
||||
}
|
||||
}
|
||||
// General case
|
||||
return num_to(value, args, DToA.DTOSTR_STANDARD_EXPONENTIAL,
|
||||
DToA.DTOSTR_EXPONENTIAL, 0, 1);
|
||||
}
|
||||
|
||||
case Id_toPrecision:
|
||||
return num_to(value, args, DToA.DTOSTR_STANDARD,
|
||||
DToA.DTOSTR_PRECISION, 1, 0);
|
||||
case Id_toPrecision: {
|
||||
// Undefined precision, fall back to ToString()
|
||||
if(args.length == 0 || args[0] == Undefined.instance) {
|
||||
return ScriptRuntime.numberToString(value, 10);
|
||||
}
|
||||
// Handle special values before range check
|
||||
if(Double.isNaN(value)) {
|
||||
return "NaN";
|
||||
}
|
||||
if(Double.isInfinite(value)) {
|
||||
if(value >= 0) {
|
||||
return "Infinity";
|
||||
}
|
||||
else {
|
||||
return "-Infinity";
|
||||
}
|
||||
}
|
||||
return num_to(value, args, DToA.DTOSTR_STANDARD,
|
||||
DToA.DTOSTR_PRECISION, 1, 0);
|
||||
}
|
||||
|
||||
default: throw new IllegalArgumentException(String.valueOf(id));
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user