Polishing

Issue: SPR-14863
This commit is contained in:
Juergen Hoeller 2016-11-02 11:45:59 +01:00
parent 388e173ba3
commit 82fa4ef274
4 changed files with 1193 additions and 1151 deletions

View File

@ -36,9 +36,9 @@ public class OpEQ extends Operator {
this.exitTypeDescriptor = "Z"; this.exitTypeDescriptor = "Z";
} }
@Override @Override
public BooleanTypedValue getValueInternal(ExpressionState state) public BooleanTypedValue getValueInternal(ExpressionState state) throws EvaluationException {
throws EvaluationException {
Object left = getLeftOperand().getValueInternal(state).getValue(); Object left = getLeftOperand().getValueInternal(state).getValue();
Object right = getRightOperand().getValueInternal(state).getValue(); Object right = getRightOperand().getValueInternal(state).getValue();
this.leftActualDescriptor = CodeFlow.toDescriptorFromObject(left); this.leftActualDescriptor = CodeFlow.toDescriptorFromObject(left);
@ -86,11 +86,9 @@ public class OpEQ extends Operator {
} }
String operatorClassName = Operator.class.getName().replace('.', '/'); String operatorClassName = Operator.class.getName().replace('.', '/');
String evaluationContextClassName = EvaluationContext.class.getName().replace('.', String evaluationContextClassName = EvaluationContext.class.getName().replace('.', '/');
'/'); mv.visitMethodInsn(INVOKESTATIC, operatorClassName, "equalityCheck",
mv.visitMethodInsn(INVOKESTATIC, operatorClassName, "equalityCheck", "(L" "(L" + evaluationContextClassName + ";Ljava/lang/Object;Ljava/lang/Object;)Z", false);
+ evaluationContextClassName + ";Ljava/lang/Object;Ljava/lang/Object;)Z",
false);
cf.pushDescriptor("Z"); cf.pushDescriptor("Z");
} }

View File

@ -37,9 +37,9 @@ public class OpNE extends Operator {
this.exitTypeDescriptor = "Z"; this.exitTypeDescriptor = "Z";
} }
@Override @Override
public BooleanTypedValue getValueInternal(ExpressionState state) public BooleanTypedValue getValueInternal(ExpressionState state) throws EvaluationException {
throws EvaluationException {
Object left = getLeftOperand().getValueInternal(state).getValue(); Object left = getLeftOperand().getValueInternal(state).getValue();
Object right = getRightOperand().getValueInternal(state).getValue(); Object right = getRightOperand().getValueInternal(state).getValue();
this.leftActualDescriptor = CodeFlow.toDescriptorFromObject(left); this.leftActualDescriptor = CodeFlow.toDescriptorFromObject(left);
@ -87,11 +87,9 @@ public class OpNE extends Operator {
} }
String operatorClassName = Operator.class.getName().replace('.', '/'); String operatorClassName = Operator.class.getName().replace('.', '/');
String evaluationContextClassName = EvaluationContext.class.getName().replace('.', String evaluationContextClassName = EvaluationContext.class.getName().replace('.', '/');
'/'); mv.visitMethodInsn(INVOKESTATIC, operatorClassName, "equalityCheck",
mv.visitMethodInsn(INVOKESTATIC, operatorClassName, "equalityCheck", "(L" "(L" + evaluationContextClassName + ";Ljava/lang/Object;Ljava/lang/Object;)Z", false);
+ evaluationContextClassName + ";Ljava/lang/Object;Ljava/lang/Object;)Z",
false);
// Invert the boolean // Invert the boolean
Label notZero = new Label(); Label notZero = new Label();

View File

@ -159,6 +159,16 @@ public abstract class Operator extends SpelNodeImpl {
cf.pushDescriptor("Z"); cf.pushDescriptor("Z");
} }
/**
* Perform an equality check for the given operand values.
* <p>This method is not just used for reflective comparisons in subclasses
* but also from compiled expression code, which is why it needs to be
* declared as {@code public static} here.
* @param context the current evaluation context
* @param left the left-hand operand value
* @param right the right-hand operand value
*/
public static boolean equalityCheck(EvaluationContext context, Object left, Object right) { public static boolean equalityCheck(EvaluationContext context, Object left, Object right) {
if (left instanceof Number && right instanceof Number) { if (left instanceof Number && right instanceof Number) {
Number leftNumber = (Number) left; Number leftNumber = (Number) left;