From 4b09fcc67c52f85a6c75a561090a8d6a742393f8 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 22 Jul 2014 16:24:39 +0200 Subject: [PATCH] Revised exitTypeDescriptor handling to avoid NPEs Issue: SPR-12014 --- .../expression/spel/CodeFlow.java | 2 +- .../spel/ast/CompoundExpression.java | 20 ++--- .../expression/spel/ast/Elvis.java | 79 ++++++++----------- .../spel/ast/FunctionReference.java | 48 +++++------ .../expression/spel/ast/MethodReference.java | 18 ++--- .../spel/ast/PropertyOrFieldReference.java | 25 +++--- .../expression/spel/ast/SpelNodeImpl.java | 10 +-- 7 files changed, 86 insertions(+), 116 deletions(-) diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java b/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java index 26a47af200..98a68ef579 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java @@ -63,7 +63,7 @@ public class CodeFlow implements Opcodes { * @param descriptor type descriptor for most recently evaluated element */ public void pushDescriptor(String descriptor) { - Assert.notNull(descriptor); + Assert.notNull(descriptor, "Descriptor must not be null"); this.compilationScopes.peek().add(descriptor); } diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/CompoundExpression.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/CompoundExpression.java index a540ac9c28..e14f997745 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/CompoundExpression.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/CompoundExpression.java @@ -85,14 +85,9 @@ public class CompoundExpression extends SpelNodeImpl { public TypedValue getValueInternal(ExpressionState state) throws EvaluationException { ValueRef ref = getValueRef(state); TypedValue result = ref.getValue(); - this.exitTypeDescriptor = this.children[this.children.length-1].getExitDescriptor(); + this.exitTypeDescriptor = this.children[this.children.length - 1].getExitDescriptor(); return result; } - - @Override - public String getExitDescriptor() { - return this.exitTypeDescriptor; - } @Override public void setValue(ExpressionState state, Object value) throws EvaluationException { @@ -118,7 +113,7 @@ public class CompoundExpression extends SpelNodeImpl { @Override public boolean isCompilable() { - for (SpelNodeImpl child: children) { + for (SpelNodeImpl child: this.children) { if (!child.isCompilable()) { return false; } @@ -129,16 +124,15 @@ public class CompoundExpression extends SpelNodeImpl { @Override public void generateCode(MethodVisitor mv,CodeFlow codeflow) { // TODO could optimize T(SomeType).staticMethod - no need to generate the T() part - for (int i=0;i= max) { + if (this == peers[i]) { + if (i + 1 >= max) { return false; } - Class clazz = peers[i + 1].getClass(); for (Class desiredClazz : clazzes) { if (clazz.equals(desiredClazz)) { return true; } } - return false; } }