summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhoffc <hoffc@codeaurora.org>2016-06-13 15:01:54 +0800
committerLinux Build Service Account <lnxbuild@localhost>2016-08-24 08:11:39 -0600
commit82d19f315fc49a972bc29bd86dbdddb45f13d3b6 (patch)
tree4d2ae0bff1242d50470eec82733f2d0e8be20b1a
parent2d20bbc22422514f6d09abf8fd36772647c85c9e (diff)
downloadandroid_packages_apps_ExactCalculator-82d19f315fc49a972bc29bd86dbdddb45f13d3b6.tar.gz
android_packages_apps_ExactCalculator-82d19f315fc49a972bc29bd86dbdddb45f13d3b6.tar.bz2
android_packages_apps_ExactCalculator-82d19f315fc49a972bc29bd86dbdddb45f13d3b6.zip
ExactCalculator: Fix StackOverflowError issue
Calculate e^1209! will trigger the StackOverflowError, which results in ExactCalculator exit unexpectedly. Change-Id: Iab080ee98824c213183d5798073365f7de712c63 CRs-Fixed: 1022502
-rwxr-xr-x[-rw-r--r--]src/com/android/calculator2/CalculatorExpr.java23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/com/android/calculator2/CalculatorExpr.java b/src/com/android/calculator2/CalculatorExpr.java
index 14d9236..40da4a1 100644..100755
--- 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();
}