Skip to content

Commit 54c07ed

Browse files
committed
Merge branch '6.1.x'
2 parents 2d1e58b + e9de426 commit 54c07ed

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ else if (this.indexedType == IndexedType.MAP) {
390390
mv.visitLdcInsn(mapKeyName);
391391
}
392392
else {
393-
generateIndexCode(mv, cf, index);
393+
generateIndexCode(mv, cf, index, Object.class);
394394
}
395395
mv.visitMethodInsn(
396396
INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true);
@@ -438,12 +438,6 @@ else if (this.indexedType == IndexedType.CUSTOM) {
438438
}
439439
}
440440

441-
private void generateIndexCode(MethodVisitor mv, CodeFlow cf, SpelNodeImpl index) {
442-
cf.enterCompilationScope();
443-
index.generateCode(mv, cf);
444-
cf.exitCompilationScope();
445-
}
446-
447441
private void generateIndexCode(MethodVisitor mv, CodeFlow cf, SpelNodeImpl indexNode, Class<?> indexType) {
448442
cf.generateCodeForArgument(mv, indexNode, indexType);
449443
}

spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java

+47
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,53 @@ void indexIntoListUsingIntegerWrapper() {
746746
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
747747
}
748748

749+
@Test // gh-32903
750+
void indexIntoMapUsingPrimitiveLiteral() {
751+
Map<Object, String> map = Map.of(
752+
false, "0", // BooleanLiteral
753+
1, "ABC", // IntLiteral
754+
2L, "XYZ", // LongLiteral
755+
9.99F, "~10", // FloatLiteral
756+
3.14159, "PI" // RealLiteral
757+
);
758+
context.setVariable("map", map);
759+
760+
// BooleanLiteral
761+
expression = parser.parseExpression("#map[false]");
762+
assertThat(expression.getValue(context)).isEqualTo("0");
763+
assertCanCompile(expression);
764+
assertThat(expression.getValue(context)).isEqualTo("0");
765+
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
766+
767+
// IntLiteral
768+
expression = parser.parseExpression("#map[1]");
769+
assertThat(expression.getValue(context)).isEqualTo("ABC");
770+
assertCanCompile(expression);
771+
assertThat(expression.getValue(context)).isEqualTo("ABC");
772+
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
773+
774+
// LongLiteral
775+
expression = parser.parseExpression("#map[2L]");
776+
assertThat(expression.getValue(context)).isEqualTo("XYZ");
777+
assertCanCompile(expression);
778+
assertThat(expression.getValue(context)).isEqualTo("XYZ");
779+
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
780+
781+
// FloatLiteral
782+
expression = parser.parseExpression("#map[9.99F]");
783+
assertThat(expression.getValue(context)).isEqualTo("~10");
784+
assertCanCompile(expression);
785+
assertThat(expression.getValue(context)).isEqualTo("~10");
786+
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
787+
788+
// RealLiteral
789+
expression = parser.parseExpression("#map[3.14159]");
790+
assertThat(expression.getValue(context)).isEqualTo("PI");
791+
assertCanCompile(expression);
792+
assertThat(expression.getValue(context)).isEqualTo("PI");
793+
assertThat(getAst().getExitDescriptor()).isEqualTo("Ljava/lang/Object");
794+
}
795+
749796
private String stringify(Object object) {
750797
Stream<? extends Object> stream;
751798
if (object instanceof Collection<?> collection) {

0 commit comments

Comments
 (0)