From 82d19f315fc49a972bc29bd86dbdddb45f13d3b6 Mon Sep 17 00:00:00 2001 From: hoffc Date: Mon, 13 Jun 2016 15:01:54 +0800 Subject: ExactCalculator: Fix StackOverflowError issue Calculate e^1209! will trigger the StackOverflowError, which results in ExactCalculator exit unexpectedly. Change-Id: Iab080ee98824c213183d5798073365f7de712c63 CRs-Fixed: 1022502 --- src/com/android/calculator2/CalculatorExpr.java | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) mode change 100644 => 100755 src/com/android/calculator2/CalculatorExpr.java diff --git a/src/com/android/calculator2/CalculatorExpr.java b/src/com/android/calculator2/CalculatorExpr.java old mode 100644 new mode 100755 index 14d9236..40da4a1 --- a/src/com/android/calculator2/CalculatorExpr.java +++ b/src/com/android/calculator2/CalculatorExpr.java @@ -873,19 +873,25 @@ class CalculatorExpr { * Unlike the "general" case using logarithms, this handles a negative base. */ private static CR pow(CR base, BigInteger exp) { - if (exp.compareTo(BigInteger.ZERO) < 0) { - return pow(base, exp.negate()).inverse(); + BigInteger bigInteger = new BigInteger(exp.toString()); + + if (bigInteger.compareTo(BigInteger.ZERO) < 0) { + return pow(base, bigInteger.negate()).inverse(); } - if (exp.equals(BigInteger.ONE)) { + + if (bigInteger.equals(BigInteger.ONE)) { return base; } - if (exp.and(BigInteger.ONE).intValue() == 1) { - return pow(base, exp.subtract(BigInteger.ONE)).multiply(base); + + if (bigInteger.and(BigInteger.ONE).intValue() == 1) { + return pow(base, bigInteger.subtract(BigInteger.ONE)).multiply(base); } - if (exp.equals(BigInteger.ZERO)) { + + if (bigInteger.equals(BigInteger.ZERO)) { return CR.valueOf(1); } - CR tmp = pow(base, exp.shiftRight(1)); + + CR tmp = pow(base, bigInteger.shiftRight(1)); return tmp.multiply(tmp); } @@ -961,7 +967,8 @@ class CalculatorExpr { // values. That wouldn't work reliably with floating point either. BigInteger int_exp = BoundedRational.asBigInteger(exp.ratVal); if (int_exp != null) { - crVal = pow(crVal, int_exp); + BigInteger bigInteger = new BigInteger(int_exp.toString()); + crVal = pow(crVal, bigInteger); } else { crVal = crVal.ln().multiply(exp.val).exp(); } -- cgit v1.2.3