[491264] Pass array rather than map of bound values to mapping
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
index db66dd7..342ae6e 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
@@ -57,6 +57,7 @@
 import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable;
 import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
 import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
+import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding;
 import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.runtime.evaluation.AbstractTransformer;
@@ -348,16 +349,21 @@
 		}
 		return transformationAnalysis2;
 	}
-
+	
 	@Override
-	public @Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull Map<Variable, Object> variable2value, @NonNull EvaluationVisitor undecoratedVisitor) {
+	public @Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull Object @NonNull [] boundValues, @NonNull EvaluationVisitor undecoratedVisitor) {
+    	return internalExecuteMappingCall2(mappingCall, boundValues, undecoratedVisitor);
+	}
+
+	public @Nullable Object internalExecuteMappingCall2(@NonNull MappingCall mappingCall, @NonNull Object @NonNull [] boundValues, @NonNull EvaluationVisitor undecoratedVisitor) {
 		Mapping calledMapping = mappingCall.getReferredMapping();
 		if (calledMapping != null) {
 			pushEvaluationEnvironment(calledMapping, mappingCall);
 			try {
-				for (Map.Entry<Variable,Object> entry : variable2value.entrySet()) {
-					@SuppressWarnings("null")@NonNull Variable variable = entry.getKey();
-					replace(variable, entry.getValue());
+				int index = 0;
+				for (MappingCallBinding binding : mappingCall.getBinding()) {
+					Variable boundVariable = ClassUtil.nonNullState(binding.getBoundVariable());
+					replace(boundVariable, boundValues[index++]);
 				}
 				calledMapping.accept(undecoratedVisitor);
 			}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java
index c3b6a70..56a432e 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java
@@ -10,9 +10,7 @@
  ******************************************************************************/
 package org.eclipse.qvtd.pivot.qvtimperative.evaluation;
 
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jdt.annotation.NonNull;
@@ -267,7 +265,12 @@
 
 	@Override
 	public @Nullable Object visitMappingCall(@NonNull MappingCall mappingCall) {
-		Map<Variable, Object> variable2value = new HashMap<Variable, Object>();
+		Mapping referredMapping = mappingCall.getReferredMapping();
+		if (referredMapping == null) {
+			return null;
+		}
+		@NonNull Object @NonNull [] boundValues = new @NonNull Object[mappingCall.getBinding().size()];
+		int index = 0;
 		for (MappingCallBinding binding : mappingCall.getBinding()) {
 			Variable boundVariable = binding.getBoundVariable();
 			if (boundVariable == null) {
@@ -282,19 +285,18 @@
 				return null;		
 			}
 			Object valueOrValues = value.accept(undecoratedVisitor);
+			if (valueOrValues == null) {
+				return null;		
+			}
 			Type valueType = idResolver.getDynamicTypeOf(valueOrValues);
-			if (valueType.conformsTo(standardLibrary, varType)) {
-				variable2value.put(boundVariable, valueOrValues);
+			if (valueType.conformsTo(environmentFactory.getStandardLibrary(), varType)) {
+				boundValues[index++] = valueOrValues;
 			}
 			else {
 				return null;		
 			}
-    	}
-		Mapping referredMapping = mappingCall.getReferredMapping();
-		if (referredMapping == null) {
-			return null;
 		}
-		return executor.internalExecuteMappingCall(mappingCall, variable2value, undecoratedVisitor);
+		return executor.internalExecuteMappingCall(mappingCall, boundValues, undecoratedVisitor);
     }
 
 	@Override
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java
index 6c63338..a60d3fe 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java
@@ -10,13 +10,10 @@
  *******************************************************************************/
 package org.eclipse.qvtd.pivot.qvtimperative.evaluation;
 
-import java.util.Map;
-
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.ocl.pivot.Variable;
 import org.eclipse.ocl.pivot.evaluation.EvaluationVisitor;
 import org.eclipse.ocl.pivot.internal.evaluation.ExecutorInternal;
 import org.eclipse.qvtd.pivot.qvtbase.Transformation;
@@ -35,7 +32,7 @@
 	@Override
 	@NonNull QVTiModelManager getModelManager();
 	@Nullable Object internalExecuteMapping(@NonNull Mapping mapping, @NonNull EvaluationVisitor undecoratedVisitor);
-	@Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull Map<Variable, Object> variable2value, @NonNull EvaluationVisitor undecoratedVisitor);
+	@Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull Object @NonNull [] boundValues, @NonNull EvaluationVisitor undecoratedVisitor);
 	void internalExecuteNavigationAssignment(@NonNull NavigationAssignment navigationAssignment, @NonNull Object slotObject, @Nullable Object ecoreValue, @Nullable Object childKey);
 	@Nullable Object internalExecuteRealizedVariable(@NonNull RealizedVariable realizedVariable, @NonNull EvaluationVisitor undecoratedVisitor);
 	@Nullable Object internalExecuteTransformation(@NonNull Transformation transformation, @NonNull EvaluationVisitor undecoratedVisitor);
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
index dcbd598..773193f 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
@@ -11,17 +11,12 @@
 
 package org.eclipse.qvtd.pivot.qvtimperative.evaluation;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.pivot.NavigationCallExp;
 import org.eclipse.ocl.pivot.OppositePropertyCallExp;
 import org.eclipse.ocl.pivot.Property;
-import org.eclipse.ocl.pivot.Variable;
 import org.eclipse.ocl.pivot.evaluation.EvaluationVisitor;
 import org.eclipse.ocl.pivot.ids.IdResolver;
 import org.eclipse.ocl.pivot.utilities.ClassUtil;
@@ -33,7 +28,6 @@
 import org.eclipse.qvtd.pivot.qvtcorebase.utilities.QVTcoreBaseUtil;
 import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
 import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
-import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.GraphStringBuilder;
 import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
 import org.eclipse.qvtd.runtime.evaluation.AbstractInvocation;
@@ -61,21 +55,21 @@
 
 	protected static abstract class InterpretedInvocation extends AbstractInvocation.Incremental
 	{
-		protected final @NonNull List<Object> theseValues;
+		protected final @NonNull Object @NonNull [] theseValues;
 		protected Object returnStatus;
 		
-		public InterpretedInvocation(@NonNull List<Object> theseValues) {
+		public InterpretedInvocation(@NonNull Object @NonNull [] theseValues) {
 			this.theseValues = theseValues;
 		}
 
 		@Override
 		public boolean isEqual(@NonNull IdResolver idResolver, @NonNull Object @NonNull [] thoseValues) {
 			int iMax = thoseValues.length;
-			if (iMax != theseValues.size()) {
+			if (iMax != theseValues.length) {
 				return false;
 			}
 			for (int i = 0; i < iMax; i++) {
-				if (!ClassUtil.safeEquals(theseValues.get(i), thoseValues[i])) {
+				if (!ClassUtil.safeEquals(theseValues[i], thoseValues[i])) {
 					return false;
 				}
 			}
@@ -114,27 +108,21 @@
 	}
 
 	@Override
-	public @Nullable Object internalExecuteMappingCall(final @NonNull MappingCall mappingCall, final @NonNull Map<Variable, Object> variable2value, final @NonNull EvaluationVisitor undecoratedVisitor) {
+	public @Nullable Object internalExecuteMappingCall(final @NonNull MappingCall mappingCall, @NonNull Object @NonNull [] boundValues, final @NonNull EvaluationVisitor undecoratedVisitor) {
 		if (mode == Mode.LAZY) {
 			Mapping asMapping = mappingCall.getReferredMapping();
 			assert asMapping != null;
 			if (!transformationAnalysis.isHazardous(asMapping)) {
-				return QVTiIncrementalExecutor.super.internalExecuteMappingCall(mappingCall, variable2value, undecoratedVisitor);
+				return internalExecuteMappingCall2(mappingCall, boundValues, undecoratedVisitor);
 			}
 		}
-		List<Object> newBoundValues = new ArrayList<Object>();
-		for (MappingCallBinding binding : mappingCall.getBinding()) {
-			Variable boundVariable = ClassUtil.nonNullModel(binding.getBoundVariable());
-			Object valueOrValues = variable2value.get(boundVariable);
-			newBoundValues.add(valueOrValues);
-		}
-		InterpretedInvocation invocation = new InterpretedInvocation(newBoundValues)
+		InterpretedInvocation invocation = new InterpretedInvocation(boundValues)
 		{
 			@Override
 			public boolean execute() throws InvocationFailedException {
 				currentInvocation = this;
 				try {
-					returnStatus = QVTiIncrementalExecutor.super.internalExecuteMappingCall(mappingCall, variable2value, undecoratedVisitor);
+					returnStatus = internalExecuteMappingCall2(mappingCall, boundValues, undecoratedVisitor);
 					return returnStatus == ValueUtil.TRUE_VALUE;
 				}
 				finally {