bug 473392 - [compiler][otdre] ClassCastException when callin is
suppressed by base predicate but result lifting still happens
- one more fix: avoid duplicate var "result"
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java
index 374875e..1fc05d9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java
@@ -867,6 +867,7 @@
List<Statement> swStatements = new ArrayList<Statement>();
for (CallinMappingDeclaration mapping : callinDecls) {
int nLabels = 0;
+ char[] resultVar = RESULT;
for (MethodSpec baseSpec : mapping.baseMethodSpecs) {
List<Statement> caseBlockStats = new ArrayList<Statement>();
caseBlockStats.add(gen.caseStatement(gen.intLiteral(baseSpec.getCallinId(aTeam)))); // case baseSpecCallinId:
@@ -936,12 +937,13 @@
currentRole.baseclass(), currentRole, false)
// TODO: might want to extend the signature of callNext to pass the current role to avoid this lifting?
: genTeamThis(gen, returnTypes[0]);
- caseBlockStats.add(gen.localVariable(RESULT, gen.qualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT), result));
+ resultVar = CharOperation.append(resultVar, '$');
+ caseBlockStats.add(gen.localVariable(resultVar, gen.qualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT), result));
caseBlockStats.add(gen.ifStatement(gen.singleNameReference(IS_BASE_CALL),
- gen.assignment(gen.singleNameReference(RESULT),
+ gen.assignment(gen.singleNameReference(resultVar),
Lifting.liftCall(mapping.scope,
liftReceiver,
- gen.castExpression(gen.singleNameReference(RESULT),
+ gen.castExpression(gen.singleNameReference(resultVar),
gen.baseclassReference(returnTypes[1]),
CastExpression.RAW),
returnTypes[1],
@@ -949,7 +951,7 @@
false,
gen)),
null));
- result = gen.singleNameReference(RESULT);
+ result = gen.singleNameReference(resultVar);
}
caseBlockStats.add(gen.returnStatement(result));