Mark, On 4/27/15 7:01 PM, ma...@apache.org wrote: > Author: markt > Date: Mon Apr 27 23:01:16 2015 > New Revision: 1676393 > > URL: http://svn.apache.org/r1676393 > Log: > Add some comments to clarify behaviour. > Review by schultz re object allocation > > Modified: > tomcat/trunk/java/org/apache/el/parser/AstValue.java > tomcat/trunk/test/org/apache/el/TestMethodExpressionImpl.java > > Modified: tomcat/trunk/java/org/apache/el/parser/AstValue.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstValue.java?rev=1676393&r1=1676392&r2=1676393&view=diff > ============================================================================== > --- tomcat/trunk/java/org/apache/el/parser/AstValue.java (original) > +++ tomcat/trunk/java/org/apache/el/parser/AstValue.java Mon Apr 27 23:01:16 > 2015 > @@ -41,6 +41,9 @@ import org.apache.el.util.ReflectionUtil > */ > public final class AstValue extends SimpleNode { > > + private static final Object[] EMPTY_ARRAY = new Object[0]; > + private static final Object[] ARRAY_OF_SINGLE_NULL = new Object[1]; > + > protected static class Target { > protected Object base; > > @@ -263,7 +266,8 @@ public final class AstValue extends Simp > private Object[] convertArgs(EvaluationContext ctx, Object[] src, Method > m) { > Class<?>[] types = m.getParameterTypes(); > if (types.length == 0) { > - return new Object[0]; > + // Treated as if parameters have been provided so src is ignored > + return EMPTY_ARRAY; > } > > int paramCount = types.length; > @@ -271,23 +275,24 @@ public final class AstValue extends Simp > if (m.isVarArgs() && paramCount > 1 && (src == null || paramCount > > src.length) || > !m.isVarArgs() && (paramCount > 0 && src == null || > src != null && src.length != paramCount)) { > - String inputParamCount = null; > + String srcCount = null; > if (src != null) { > - inputParamCount = Integer.toString(src.length); > + srcCount = Integer.toString(src.length); > } > String msg; > if (m.isVarArgs()) { > msg = MessageFactory.get("error.invoke.tooFewParams", > - m.getName(), inputParamCount, > Integer.toString(paramCount)); > + m.getName(), srcCount, Integer.toString(paramCount)); > } else { > msg = MessageFactory.get("error.invoke.wrongParams", > - m.getName(), inputParamCount, > Integer.toString(paramCount)); > + m.getName(), srcCount, Integer.toString(paramCount)); > } > throw new IllegalArgumentException(msg); > } > > if (src == null) { > - return new Object[1]; > + // Must be a varargs method with a single parameter. > + return ARRAY_OF_SINGLE_NULL;
Is this safe? I'm not sure of the scope of this array, but client code could potentially mutate the contents. We fully expect ARRAY_OF_SINGLE_NULL[0] to be == null, but some other code could change it and it would probably cause a huge mess. I like the use of a flyweight here, but if that object ever gets out of our control, it could be poisoned. Thanks, -chris
signature.asc
Description: OpenPGP digital signature