[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);
                }
                

Reply via email to