From 43e6a9c88516229bd4e341124e4cd57e48c2ab54 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Thu, 26 Nov 2009 02:57:24 +0000 Subject: [PATCH] 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 --- .../hssf/record/formula/functions/Choose.java | 8 ++++++- .../poi/hssf/record/formula/functions/If.java | 21 +++++++++++++++++-- .../poi/ss/formula/WorkbookEvaluator.java | 3 --- 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); }