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 using custom resolvers or accessors
* Expressions using overloaded operators
* Expressions using array construction syntax
* Expressions using selection or projection
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);
// 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
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
// 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
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.
====
[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" -> {
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" -> {

View File

@ -309,6 +309,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" };