Support safe navigation operator with void methods in SpEL
Prior to this commit the Spring Expression Language (SpEL) was able to
properly parse an expression that uses the safe navigation operator
(?.) with a method that has a `void` return type (for example,
"myObject?.doSomething()"); however, SpEL was not able to evaluate or
compile such expressions.
This commit addresses the evaluation issue by selectively not boxing
the exit type descriptor (for inclusion in the generated bytecode) when
the method's return type is `void`.
This commit addresses the compilation issue by pushing a null object
reference onto the stack in the generated byte code when the method's
return type is `void`.
Closes gh-27421
@ -771,6 +771,34 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
@@ -771,6 +771,34 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
@ -3898,37 +3926,71 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
@@ -3898,37 +3926,71 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
@ -5496,7 +5558,10 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
@@ -5496,7 +5558,10 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
publicstaticclassFooObject{
staticbooleandoFooInvoked=false;
publicObjectgetObject(){return"hello";}
publicvoiddoFoo(){doFooInvoked=true;}
}
@ -5744,7 +5809,10 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
@@ -5744,7 +5809,10 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {