From abc3cc4dc46a352264f97e0890f89b0e4a561504 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Thu, 18 Dec 2014 13:46:55 -0800 Subject: [PATCH] Ensure correct boxing in compiled code for OpEq with primitives Without this change when the operands to an == are a mix of a reference type and a primitive, the failure to box the primitive would result in a verifyerror when the compiled code is loaded. Issue: SPR-12557 --- .../springframework/expression/spel/ast/OpEQ.java | 6 ++++++ .../spel/SpelCompilationCoverageTests.java | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/OpEQ.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/OpEQ.java index 022e10c0b3..73ad67603e 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/OpEQ.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/OpEQ.java @@ -112,7 +112,13 @@ public class OpEQ extends Operator { } else { getLeftOperand().generateCode(mv, cf); + if (leftPrim) { + CodeFlow.insertBoxIfNecessary(mv, leftDesc.charAt(0)); + } getRightOperand().generateCode(mv, cf); + if (rightPrim) { + CodeFlow.insertBoxIfNecessary(mv, rightDesc.charAt(0)); + } Label leftNotNull = new Label(); mv.visitInsn(DUP_X1); // Dup right on the top of the stack mv.visitJumpInsn(IFNONNULL,leftNotNull); 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 53193a479a..022d94157c 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 @@ -1285,7 +1285,20 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests { @Test public void opEq() throws Exception { - + String tvar = "35"; + expression = parse("#root == 35"); + Boolean bb = (Boolean)expression.getValue(tvar); + System.out.println(bb); + assertFalse((Boolean)expression.getValue(tvar)); + assertCanCompile(expression); + assertFalse((Boolean)expression.getValue(tvar)); + + expression = parse("35 == #root"); + expression.getValue(tvar); + assertFalse((Boolean)expression.getValue(tvar)); + assertCanCompile(expression); + assertFalse((Boolean)expression.getValue(tvar)); + TestClass7 tc7 = new TestClass7(); expression = parse("property == 'UK'"); assertTrue((Boolean)expression.getValue(tc7));