From 46812e13854c0703a90fde0cba6cf6370403b40f Mon Sep 17 00:00:00 2001 From: "szegedia%freemail.hu" Date: Fri, 12 Dec 2008 11:42:55 +0000 Subject: [PATCH] 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 --- .../org/mozilla/javascript/NativeNumber.java | 43 ++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) 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)); }