[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 {