aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Micich <josh@apache.org>2009-11-26 02:57:24 +0000
committerJosh Micich <josh@apache.org>2009-11-26 02:57:24 +0000
commit43e6a9c88516229bd4e341124e4cd57e48c2ab54 (patch)
tree4023adaf94fe60062124d5c4ff5390533b91aec7
parent61fc4d0329a186a6a0b5e0654c14c1945654e493 (diff)
downloadpoi-43e6a9c88516229bd4e341124e4cd57e48c2ab54.tar.gz
poi-43e6a9c88516229bd4e341124e4cd57e48c2ab54.zip
Moved handling of MissingArgEval into IF() or CHOOSE() for non-optimised (eager argument evaluation) case
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@884389 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/functions/Choose.java8
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/functions/If.java21
-rw-r--r--src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java3
3 files changed, 26 insertions, 6 deletions
diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java b/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java
index 3495571340..01fa4590f8 100644
--- a/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java
+++ b/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java
@@ -17,8 +17,10 @@
package org.apache.poi.hssf.record.formula.functions;
+import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.ErrorEval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
+import org.apache.poi.hssf.record.formula.eval.MissingArgEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@@ -37,7 +39,11 @@ public final class Choose implements Function {
if (ix < 1 || ix >= args.length) {
return ErrorEval.VALUE_INVALID;
}
- return OperandResolver.getSingleValue(args[ix], srcRowIndex, srcColumnIndex);
+ ValueEval result = OperandResolver.getSingleValue(args[ix], srcRowIndex, srcColumnIndex);
+ if (result == MissingArgEval.instance) {
+ return BlankEval.INSTANCE;
+ }
+ return result;
} catch (EvaluationException e) {
return e.getErrorEval();
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/If.java b/src/java/org/apache/poi/hssf/record/formula/functions/If.java
index 3f74019844..6cdbcd6a16 100644
--- a/src/java/org/apache/poi/hssf/record/formula/functions/If.java
+++ b/src/java/org/apache/poi/hssf/record/formula/functions/If.java
@@ -17,8 +17,10 @@
package org.apache.poi.hssf.record.formula.functions;
+import org.apache.poi.hssf.record.formula.eval.BlankEval;
import org.apache.poi.hssf.record.formula.eval.BoolEval;
import org.apache.poi.hssf.record.formula.eval.EvaluationException;
+import org.apache.poi.hssf.record.formula.eval.MissingArgEval;
import org.apache.poi.hssf.record.formula.eval.OperandResolver;
import org.apache.poi.hssf.record.formula.eval.ValueEval;
@@ -34,7 +36,13 @@ public final class If extends Var2or3ArgFunction {
} catch (EvaluationException e) {
return e.getErrorEval();
}
- return b ? arg1 : BoolEval.FALSE;
+ if (b) {
+ if (arg1 == MissingArgEval.instance) {
+ return BlankEval.INSTANCE;
+ }
+ return arg1;
+ }
+ return BoolEval.FALSE;
}
public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
@@ -45,7 +53,16 @@ public final class If extends Var2or3ArgFunction {
} catch (EvaluationException e) {
return e.getErrorEval();
}
- return b ? arg1 : arg2;
+ if (b) {
+ if (arg1 == MissingArgEval.instance) {
+ return BlankEval.INSTANCE;
+ }
+ return arg1;
+ }
+ if (arg2 == MissingArgEval.instance) {
+ return BlankEval.INSTANCE;
+ }
+ return arg2;
}
public static boolean evaluateFirstArg(ValueEval arg, int srcCellRow, int srcCellCol)
diff --git a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
index ddd5f5d36d..3accf93f31 100644
--- a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
+++ b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
@@ -435,9 +435,6 @@ public final class WorkbookEvaluator {
}
// logDebug("invoke " + operation + " (nAgs=" + numops + ")");
opResult = OperationEvaluatorFactory.evaluate(optg, ops, ec);
- if (opResult == MissingArgEval.instance) {
- opResult = BlankEval.INSTANCE;
- }
} else {
opResult = getEvalForPtg(ptg, ec);
}