Merge branch '6.1.x'

This commit is contained in:
Sam Brannen 2024-03-08 15:50:29 +01:00
commit 90867e7e62
4 changed files with 31 additions and 4 deletions

View File

@ -518,6 +518,7 @@ following kinds of expressions cannot be compiled.
* Expressions relying on the conversion service * Expressions relying on the conversion service
* Expressions using custom resolvers or accessors * Expressions using custom resolvers or accessors
* Expressions using overloaded operators * Expressions using overloaded operators
* Expressions using array construction syntax
* Expressions using selection or projection * Expressions using selection or projection
Compilation of additional kinds of expressions may be supported in the future. Compilation of additional kinds of expressions may be supported in the future.

View File

@ -13,7 +13,7 @@ Java::
int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue(context); int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue(context);
// Array with initializer // Array with initializer
int[] numbers2 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue(context); int[] numbers2 = (int[]) parser.parseExpression("new int[] {1, 2, 3}").getValue(context);
// Multi dimensional array // Multi dimensional array
int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue(context); int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue(context);
@ -26,14 +26,22 @@ Kotlin::
val numbers1 = parser.parseExpression("new int[4]").getValue(context) as IntArray val numbers1 = parser.parseExpression("new int[4]").getValue(context) as IntArray
// Array with initializer // Array with initializer
val numbers2 = parser.parseExpression("new int[]{1,2,3}").getValue(context) as IntArray val numbers2 = parser.parseExpression("new int[] {1, 2, 3}").getValue(context) as IntArray
// Multi dimensional array // Multi dimensional array
val numbers3 = parser.parseExpression("new int[4][5]").getValue(context) as Array<IntArray> val numbers3 = parser.parseExpression("new int[4][5]").getValue(context) as Array<IntArray>
---- ----
====== ======
[NOTE]
====
You cannot currently supply an initializer when you construct a multi-dimensional array. You cannot currently supply an initializer when you construct a multi-dimensional array.
====
[CAUTION]
====
Any expression that constructs an array for example, via `new int[4]` or
`new int[] {1, 2, 3}` cannot be compiled. See
xref:core/expressions/evaluation.adoc#expressions-compiler-limitations[Compiler Limitations]
for details.
====

View File

@ -263,6 +263,12 @@ public class Indexer extends SpelNodeImpl {
} }
case "B" -> { case "B" -> {
mv.visitTypeInsn(CHECKCAST, "[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; yield BALOAD;
} }
case "C" -> { case "C" -> {

View File

@ -309,6 +309,18 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
assertThat(getAst().getExitDescriptor()).isEqualTo("C"); 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 @Test
void indexIntoStringArray() { void indexIntoStringArray() {
String[] strings = { "a", "b", "c" }; String[] strings = { "a", "b", "c" };