Merge branch '6.1.x'
This commit is contained in:
@@ -390,7 +390,7 @@ public class Indexer extends SpelNodeImpl {
|
|||||||
mv.visitLdcInsn(mapKeyName);
|
mv.visitLdcInsn(mapKeyName);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
generateIndexCode(mv, cf, index);
|
generateIndexCode(mv, cf, index, Object.class);
|
||||||
}
|
}
|
||||||
mv.visitMethodInsn(
|
mv.visitMethodInsn(
|
||||||
INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true);
|
INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true);
|
||||||
@@ -438,12 +438,6 @@ public class Indexer extends SpelNodeImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateIndexCode(MethodVisitor mv, CodeFlow cf, SpelNodeImpl index) {
|
|
||||||
cf.enterCompilationScope();
|
|
||||||
index.generateCode(mv, cf);
|
|
||||||
cf.exitCompilationScope();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateIndexCode(MethodVisitor mv, CodeFlow cf, SpelNodeImpl indexNode, Class<?> indexType) {
|
private void generateIndexCode(MethodVisitor mv, CodeFlow cf, SpelNodeImpl indexNode, Class<?> indexType) {
|
||||||
cf.generateCodeForArgument(mv, indexNode, indexType);
|
cf.generateCodeForArgument(mv, indexNode, indexType);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -746,6 +746,53 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
|
|||||||
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
|
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test // gh-32903
|
||||||
|
void indexIntoMapUsingPrimitiveLiteral() {
|
||||||
|
Map<Object, String> map = Map.of(
|
||||||
|
false, "0", // BooleanLiteral
|
||||||
|
1, "ABC", // IntLiteral
|
||||||
|
2L, "XYZ", // LongLiteral
|
||||||
|
9.99F, "~10", // FloatLiteral
|
||||||
|
3.14159, "PI" // RealLiteral
|
||||||
|
);
|
||||||
|
context.setVariable("map", map);
|
||||||
|
|
||||||
|
// BooleanLiteral
|
||||||
|
expression = parser.parseExpression("#map[false]");
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("0");
|
||||||
|
assertCanCompile(expression);
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("0");
|
||||||
|
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
|
||||||
|
|
||||||
|
// IntLiteral
|
||||||
|
expression = parser.parseExpression("#map[1]");
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("ABC");
|
||||||
|
assertCanCompile(expression);
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("ABC");
|
||||||
|
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
|
||||||
|
|
||||||
|
// LongLiteral
|
||||||
|
expression = parser.parseExpression("#map[2L]");
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("XYZ");
|
||||||
|
assertCanCompile(expression);
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("XYZ");
|
||||||
|
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
|
||||||
|
|
||||||
|
// FloatLiteral
|
||||||
|
expression = parser.parseExpression("#map[9.99F]");
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("~10");
|
||||||
|
assertCanCompile(expression);
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("~10");
|
||||||
|
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
|
||||||
|
|
||||||
|
// RealLiteral
|
||||||
|
expression = parser.parseExpression("#map[3.14159]");
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("PI");
|
||||||
|
assertCanCompile(expression);
|
||||||
|
assertThat(expression.getValue(context)).isEqualTo("PI");
|
||||||
|
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
|
||||||
|
}
|
||||||
|
|
||||||
private String stringify(Object object) {
|
private String stringify(Object object) {
|
||||||
Stream<? extends Object> stream;
|
Stream<? extends Object> stream;
|
||||||
if (object instanceof Collection<?> collection) {
|
if (object instanceof Collection<?> collection) {
|
||||||
|
|||||||
Reference in New Issue
Block a user