[SYSTEMML-921] Fix function call error handling with missing inputs Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/00b06d47 Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/00b06d47 Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/00b06d47
Branch: refs/heads/master Commit: 00b06d4723c037a9effdecec526d9b039db40c2d Parents: b304e60 Author: Matthias Boehm <mbo...@us.ibm.com> Authored: Thu Sep 15 01:34:21 2016 +0200 Committer: Matthias Boehm <mbo...@us.ibm.com> Committed: Thu Sep 15 09:41:29 2016 +0200 ---------------------------------------------------------------------- .../context/ExecutionContext.java | 14 ++++---- .../cp/FunctionCallCPInstruction.java | 37 ++++++++++---------- 2 files changed, 26 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/00b06d47/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java index dd20fd0..14b9c44 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java @@ -126,19 +126,19 @@ public class ExecutionContext * ------------------------------------------------------- */ - public Data getVariable(String name) - { + public Data getVariable(String name) { return _variables.get(name); } - public void setVariable(String name, Data val) - throws DMLRuntimeException - { + public void setVariable(String name, Data val) { _variables.put(name, val); } + + public boolean containsVariable(String name) { + return _variables.keySet().contains(name); + } - public Data removeVariable(String name) - { + public Data removeVariable(String name) { return _variables.remove(name); } http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/00b06d47/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java index 348eef2..529bd25 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java @@ -27,6 +27,7 @@ import java.util.LinkedList; import org.apache.sysml.api.DMLScript; import org.apache.sysml.lops.Lop; +import org.apache.sysml.parser.DMLProgram; import org.apache.sysml.parser.DataIdentifier; import org.apache.sysml.parser.Expression.DataType; import org.apache.sysml.parser.Expression.ValueType; @@ -75,14 +76,12 @@ public class FunctionCallCPInstruction extends CPInstruction } /** - * Instruction format extFunct:::[FUNCTION NAME]:::[num input params]:::[num output params]:::[list of delimited input params ]:::[list of delimited ouput params] - * These are the "bound names" for the inputs / outputs. For example, out1 = foo(in1, in2) yields - * extFunct:::foo:::2:::1:::in1:::in2:::out1 * */ public static FunctionCallCPInstruction parseInstruction(String str) throws DMLRuntimeException { + //schema: extfunct, fname, num inputs, num outputs, inputs, outputs String[] parts = InstructionUtils.getInstructionPartsWithValueType ( str ); String namespace = parts[1]; String functionName = parts[2]; @@ -91,22 +90,20 @@ public class FunctionCallCPInstruction extends CPInstruction ArrayList<CPOperand> boundInParamOperands = new ArrayList<CPOperand>(); ArrayList<String> boundInParamNames = new ArrayList<String>(); ArrayList<String> boundOutParamNames = new ArrayList<String>(); - - int FIRST_PARAM_INDEX = 5; for (int i = 0; i < numInputs; i++) { - CPOperand operand = new CPOperand(parts[FIRST_PARAM_INDEX + i]); + CPOperand operand = new CPOperand(parts[5 + i]); boundInParamOperands.add(operand); boundInParamNames.add(operand.getName()); } for (int i = 0; i < numOutputs; i++) { - boundOutParamNames.add(parts[FIRST_PARAM_INDEX + numInputs + i]); + boundOutParamNames.add(parts[5 + numInputs + i]); } - return new FunctionCallCPInstruction ( namespace,functionName, boundInParamOperands, boundInParamNames, boundOutParamNames, str ); + return new FunctionCallCPInstruction ( namespace,functionName, + boundInParamOperands, boundInParamNames, boundOutParamNames, str ); } - - + @Override public Instruction preprocessInstruction(ExecutionContext ec) throws DMLRuntimeException @@ -144,8 +141,7 @@ public class FunctionCallCPInstruction extends CPInstruction ValueType valType = fpb.getInputParams().get(i).getValueType(); // CASE (a): default values, if call w/ less params than signature (scalars only) - if ( i > _boundInputParamNames.size() - || (!_boundInputParamOperands.get(i).isLiteral() && ec.getVariable(_boundInputParamNames.get(i)) == null)) + if( i > _boundInputParamNames.size() ) { String defaultVal = fpb.getInputParams().get(i).getDefaultValue(); currFormalParamValue = ec.getScalarInput(defaultVal, valType, false); @@ -153,12 +149,17 @@ public class FunctionCallCPInstruction extends CPInstruction // CASE (b) literals or symbol table entries else { CPOperand operand = _boundInputParamOperands.get(i); - if( operand.getDataType()==DataType.SCALAR ) - currFormalParamValue = ec.getScalarInput(operand.getName(), operand.getValueType(), operand.isLiteral()); - else - currFormalParamValue = ec.getVariable(operand.getName()); + String varname = operand.getName(); + //error handling non-existing variables + if( !operand.isLiteral() && ec.containsVariable(varname) ) { + throw new DMLRuntimeException("Input variable '"+varname+"' not existing on call of " + + DMLProgram.constructFunctionKey(_namespace, _functionName) + " (line "+getLineNum()+")."); + } + //get input matrix/frame/scalar + currFormalParamValue = (operand.getDataType()!=DataType.SCALAR) ? ec.getVariable(varname) : + ec.getScalarInput(varname, operand.getValueType(), operand.isLiteral()); } - + functionVariables.put(currFormalParamName,currFormalParamValue); } @@ -179,7 +180,7 @@ public class FunctionCallCPInstruction extends CPInstruction throw e; } catch (Exception e){ - String fname = this._namespace + "::" + this._functionName; + String fname = DMLProgram.constructFunctionKey(_namespace, _functionName); throw new DMLRuntimeException("error executing function " + fname, e); }