From fea1464562289c64b1bfe858f74d50970531a8a0 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:29:42 +0100 Subject: [PATCH] Ensure SpEL can compile an expression indexing into a boolean array Closes gh-32400 --- .../springframework/expression/spel/ast/Indexer.java | 6 ++++++ .../spel/SpelCompilationCoverageTests.java | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java index b1fbc3225a..e0bc8be533 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java @@ -245,6 +245,12 @@ public class Indexer extends SpelNodeImpl { } case "B" -> { mv.visitTypeInsn(CHECKCAST, "[B"); + // byte and boolean arrays are both loaded via BALOAD + yield BALOAD; + } + case "Z" -> { + mv.visitTypeInsn(CHECKCAST, "[Z"); + // byte and boolean arrays are both loaded via BALOAD yield BALOAD; } case "C" -> { diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java index 33e8604732..41c22b88a3 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java @@ -308,6 +308,18 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests { assertThat(getAst().getExitDescriptor()).isEqualTo("C"); } + @Test + void indexIntoPrimitiveBooleanArray() { + boolean[] booleans = { true, false }; + + expression = parser.parseExpression("[1]"); + + assertThat(expression.getValue(booleans)).isEqualTo(false); + assertCanCompile(expression); + assertThat(expression.getValue(booleans)).isEqualTo(false); + assertThat(getAst().getExitDescriptor()).isEqualTo("Z"); + } + @Test void indexIntoStringArray() { String[] strings = { "a", "b", "c" };