Skip to content

Compiled elvis operator does not work correctly when default value is a complex expression [SPR-17214] #21747

Closed
@spring-projects-issues

Description

@spring-projects-issues

heyouxian opened SPR-17214 and commented

Following exception raised when I execute "record.get('MR_dlEARFCN')?:record.put('MR_dlEARFCN',expression.dl_CarrierFreq?.longValue())"

Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
 at org.springframework.asm.Frame.merge(Frame.java:1501) ~[spring-core-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.asm.Frame.merge(Frame.java:1478) ~[spring-core-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.asm.MethodWriter.visitMaxs(MethodWriter.java:1520) ~[spring-core-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelCompiler.createExpressionClass(SpelCompiler.java:175) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:104) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.compileExpression(SpelExpression.java:517) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.checkCompile(SpelExpression.java:487) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:372) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]

If I change expression to "record.get('MR_dlEARFCN')==null?record.put('MR_dlEARFCN',expression.dl_CarrierFreq?.longValue()):null", the following exception is raised:

Caused by: java.lang.IllegalStateException: Failed to instantiate CompiledExpression
 at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:110) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.compileExpression(SpelExpression.java:517) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.checkCompile(SpelExpression.java:487) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:372) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 ... 17 more
Caused by: java.lang.VerifyError: (class: spel/Ex62, method: getValue signature: (Ljava/lang/Object;Lorg/springframework/expression/EvaluationContext;)Ljava/lang/Object;) Inconsistent stack height 1 != 0
 at java.lang.Class.getDeclaredConstructors0(Native Method) ~[?:1.8.0_121]
 at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) ~[?:1.8.0_121]
 at java.lang.Class.getConstructor0(Class.java:3075) ~[?:1.8.0_121]
 at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[?:1.8.0_121]
 at org.springframework.util.ReflectionUtils.accessibleConstructor(ReflectionUtils.java:503) ~[spring-core-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:107) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.compileExpression(SpelExpression.java:517) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.checkCompile(SpelExpression.java:487) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]
 at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:372) ~[spring-expression-5.0.8.RELEASE.jar:5.0.8.RELEASE]

 
I have to use "record.put('MR_dlEARFCN',record.get('MR_dlEARFCN')==null?expression.dl_CarrierFreq?.longValue():record.get('MR_dlEARFCN'))"  to make it work.


Affects: 4.3.18, 5.0.8

Backported to: 4.3.19

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: backportedAn issue that has been backported to maintenance branchestype: bugA general bug

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions