diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/NativeNumber.java b/mozilla/js/rhino/src/org/mozilla/javascript/NativeNumber.java index 50ff847e052..cd895871d1b 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/NativeNumber.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/NativeNumber.java @@ -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)); }