From 6153dfd34b38c7a5842a71cbf5723c7e113a2d18 Mon Sep 17 00:00:00 2001 From: Eric Milles Date: Mon, 22 Jan 2024 14:46:52 -0600 Subject: [PATCH] GROOVY-11293: ensure `isVargsMethod` initialized before return --- .../reflection/GeneratedMetaMethod.java | 2 +- .../groovy/reflection/ParameterTypes.java | 47 ++++++++++--------- .../dgmimpl/NumberNumberMetaMethod.java | 6 +-- .../dgmimpl/arrays/ArrayGetAtMetaMethod.java | 3 +- .../dgmimpl/arrays/ArrayMetaMethod.java | 4 +- .../dgmimpl/arrays/ArrayPutAtMetaMethod.java | 10 ++++ .../arrays/BooleanArrayGetAtMetaMethod.java | 4 +- .../arrays/BooleanArrayPutAtMetaMethod.java | 10 +--- .../arrays/ByteArrayGetAtMetaMethod.java | 4 +- .../arrays/ByteArrayPutAtMetaMethod.java | 10 +--- .../arrays/CharacterArrayGetAtMetaMethod.java | 4 +- .../arrays/CharacterArrayPutAtMetaMethod.java | 10 +--- .../arrays/DoubleArrayGetAtMetaMethod.java | 4 +- .../arrays/DoubleArrayPutAtMetaMethod.java | 10 +--- .../arrays/FloatArrayGetAtMetaMethod.java | 4 +- .../arrays/FloatArrayPutAtMetaMethod.java | 10 +--- .../arrays/IntegerArrayGetAtMetaMethod.java | 4 +- .../arrays/IntegerArrayPutAtMetaMethod.java | 10 +--- .../arrays/LongArrayGetAtMetaMethod.java | 4 +- .../arrays/LongArrayPutAtMetaMethod.java | 10 +--- .../arrays/ObjectArrayGetAtMetaMethod.java | 6 +-- .../arrays/ObjectArrayPutAtMetaMethod.java | 5 -- .../arrays/ShortArrayGetAtMetaMethod.java | 4 +- .../arrays/ShortArrayPutAtMetaMethod.java | 10 +--- .../metaclass/TransformMetaMethod.java | 4 +- .../groovy/reflection/CachedMethodTest.groovy | 21 +++++++-- 26 files changed, 96 insertions(+), 124 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java b/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java index ce3a69aed5e..2d79b0f75b3 100644 --- a/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java @@ -43,10 +43,10 @@ public abstract class GeneratedMetaMethod extends MetaMethod { private final Class returnType; public GeneratedMetaMethod(String name, CachedClass declaringClass, Class returnType, Class[] parameters) { + super(parameters); this.name = name; this.declaringClass = declaringClass; this.returnType = returnType; - nativeParamTypes = parameters; } @Override diff --git a/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java b/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java index d610cc0aead..bff88f441ee 100644 --- a/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java +++ b/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java @@ -27,10 +27,10 @@ import java.lang.reflect.Array; public class ParameterTypes { - protected volatile Class[] nativeParamTypes; - protected volatile CachedClass[] parameterTypes; - protected boolean isVargsMethod; + private volatile CachedClass[] parameterTypes; + private volatile Class[] nativeParamTypes; + private boolean isVargsMethod; public ParameterTypes() { } @@ -52,8 +52,8 @@ public ParameterTypes(String[] pt) { } } - public ParameterTypes(CachedClass[] parameterTypes) { - setParametersTypes(parameterTypes); + public ParameterTypes(CachedClass[] pt) { + setParametersTypes(pt); } protected final void setParametersTypes(CachedClass[] pt) { @@ -65,25 +65,23 @@ public CachedClass[] getParameterTypes() { if (parameterTypes == null) { getParametersTypes0(); } - return parameterTypes; } private synchronized void getParametersTypes0() { - if (parameterTypes != null) - return; - - var npt = nativeParamTypes == null ? getPT() : nativeParamTypes; - if (npt.length == 0) { - nativeParamTypes = MetaClassHelper.EMPTY_TYPE_ARRAY; - setParametersTypes(CachedClass.EMPTY_ARRAY); - } else { - CachedClass[] pt = new CachedClass[npt.length]; - for (int i = 0; i != npt.length; ++i) - pt[i] = ReflectionCache.getCachedClass(npt[i]); - - nativeParamTypes = npt; - setParametersTypes(pt); + if (parameterTypes == null) { + var npt = nativeParamTypes == null ? getPT() : nativeParamTypes; + if (npt.length == 0) { + nativeParamTypes = MetaClassHelper.EMPTY_TYPE_ARRAY; + setParametersTypes(CachedClass.EMPTY_ARRAY); + } else { + CachedClass[] pt = new CachedClass[npt.length]; + for (int i = 0; i != npt.length; ++i) { + pt[i] = ReflectionCache.getCachedClass(npt[i]); + } + nativeParamTypes = npt; + setParametersTypes(pt); + } } } @@ -114,11 +112,14 @@ protected Class[] getPT() { } public boolean isVargsMethod() { + if (parameterTypes == null) { + getParametersTypes0(); // GROOVY-11293 + } return isVargsMethod; } public boolean isVargsMethod(Object[] arguments) { - if (isVargsMethod) { + if (isVargsMethod()) { int aCount = arguments.length; int pCount = parameterTypes.length; if (aCount > pCount || aCount == pCount-1) { // too many or too few? @@ -156,7 +157,7 @@ public Object[] correctArguments(Object[] arguments) { var pt = getParameterTypes(); if (pt.length == 1 && arguments.length == 0) { - if (!isVargsMethod) return MetaClassHelper.ARRAY_WITH_NULL; + if (!isVargsMethod()) return MetaClassHelper.ARRAY_WITH_NULL; return new Object[]{Array.newInstance(pt[0].getTheClass().getComponentType(), 0)}; } @@ -230,7 +231,7 @@ public boolean isValidMethod(Class[] argumentTypes) { CachedClass[] pt = getParameterTypes(); final int nArguments = argumentTypes.length, nParameters = pt.length, nthParameter = nParameters - 1; - if (isVargsMethod && nArguments >= nthParameter) + if (isVargsMethod() && nArguments >= nthParameter) return isValidVargsMethod(argumentTypes, pt, nthParameter); else if (nArguments == nParameters) return isValidExactMethod(argumentTypes, pt); diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java index 57f2cd5f788..f9073aa38ed 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java @@ -30,11 +30,11 @@ import java.lang.reflect.Modifier; public abstract class NumberNumberMetaMethod extends CallSiteAwareMetaMethod { - private static final CachedClass NUMBER_CLASS = ReflectionCache.getCachedClass(Number.class); - private static final CachedClass [] NUMBER_CLASS_ARR = new CachedClass[] { NUMBER_CLASS }; + private static final CachedClass NUMBER_CLASS = ReflectionCache.getCachedClass(Number.class); + private static final CachedClass[] NUMBER_CLASS_ARR = {NUMBER_CLASS}; protected NumberNumberMetaMethod() { - parameterTypes = NUMBER_CLASS_ARR; + setParametersTypes(NUMBER_CLASS_ARR); } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java index 7994b4e3f97..77aa3f65c9b 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java @@ -19,8 +19,9 @@ package org.codehaus.groovy.runtime.dgmimpl.arrays; public abstract class ArrayGetAtMetaMethod extends ArrayMetaMethod { + protected ArrayGetAtMetaMethod() { - parameterTypes = INTEGER_CLASS_ARR; + setParametersTypes(INTEGER_CLASS_ARR); } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java index 630fe6f551c..c5cf781a65a 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java @@ -25,8 +25,8 @@ import java.lang.reflect.Modifier; public abstract class ArrayMetaMethod extends CallSiteAwareMetaMethod { - protected static final CachedClass INTEGER_CLASS = ReflectionCache.getCachedClass(Integer.class); - protected static final CachedClass[] INTEGER_CLASS_ARR = new CachedClass[]{INTEGER_CLASS}; + protected static final CachedClass INTEGER_CLASS = ReflectionCache.getCachedClass(Integer.class); + protected static final CachedClass[] INTEGER_CLASS_ARR = {INTEGER_CLASS}; protected static int normaliseIndex(int i, int size) { int temp = i; diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java index 41fa07027c8..1cd27762f25 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java @@ -18,7 +18,17 @@ */ package org.codehaus.groovy.runtime.dgmimpl.arrays; +import org.codehaus.groovy.reflection.CachedClass; + +import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_CLASS; + public abstract class ArrayPutAtMetaMethod extends ArrayMetaMethod { + private static final CachedClass[] PARAM_TYPES = {INTEGER_CLASS, OBJECT_CLASS}; + + protected ArrayPutAtMetaMethod() { + setParametersTypes(PARAM_TYPES); + } + @Override public String getName() { return "putAt"; diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java index 4244b2ad08e..ce9132f8684 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class BooleanArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(boolean[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(boolean[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java index 4739fd63833..eea5fd6c38d 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java @@ -26,17 +26,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class BooleanArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(boolean[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public BooleanArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(boolean[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java index 4e5af49e70c..6d1f028889b 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class ByteArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(byte[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(byte[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java index 2c79b481d48..8952f1658f6 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java @@ -26,17 +26,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class ByteArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(byte[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public ByteArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(byte[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java index 482d3911b92..03389270a09 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class CharacterArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(char[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(char[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java index 4371c47e8ce..88fb05bea13 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java @@ -27,17 +27,11 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; public class CharacterArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(char[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public CharacterArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(char[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java index 692abfbcefa..0e1014d912f 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class DoubleArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(double[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(double[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java index f89a2d03a30..e3db4a9fda8 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java @@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; public class DoubleArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(double[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public DoubleArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(double[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java index 5caa586505b..ff5badb50b6 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class FloatArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(float[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(float[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java index ebbf2e8f593..5cb0abcaec7 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java @@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; public class FloatArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(float[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public FloatArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(float[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java index 30c4ee5cf80..0863753f7de 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class IntegerArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(int[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(int[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java index 34f114d0ace..2424e9aa5b1 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java @@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; public class IntegerArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(int[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public IntegerArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(int[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java index f31ef1c7dc0..231a9d887f6 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class LongArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(long[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(long[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java index 7d753728b76..6e8afff8741 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java @@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; public class LongArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(long[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public LongArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(long[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java index 011341f501a..e2e9fc84645 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java @@ -21,12 +21,12 @@ import groovy.lang.MetaClassImpl; import groovy.lang.MetaMethod; import org.codehaus.groovy.reflection.CachedClass; -import org.codehaus.groovy.reflection.ReflectionCache; import org.codehaus.groovy.runtime.callsite.CallSite; import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; +import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_ARRAY_CLASS; + public class ObjectArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass OBJECT_ARR_CLASS = ReflectionCache.OBJECT_ARRAY_CLASS; @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return OBJECT_ARR_CLASS; + return OBJECT_ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java index 15e26e230f5..992ee72207f 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java @@ -27,14 +27,9 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_ARRAY_CLASS; -import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_CLASS; public class ObjectArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - public ObjectArrayPutAtMetaMethod() { - parameterTypes = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - } - @Override public final CachedClass getDeclaringClass() { return OBJECT_ARRAY_CLASS; diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java index e85e212a70d..c3e623483aa 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java @@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite; public class ShortArrayGetAtMetaMethod extends ArrayGetAtMetaMethod { - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(short[].class); + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(short[].class); @Override public Class getReturnType() { @@ -35,7 +35,7 @@ public Class getReturnType() { @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java index 6083b24153c..aad4e9a29ad 100644 --- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java @@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; public class ShortArrayPutAtMetaMethod extends ArrayPutAtMetaMethod { - private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS; - private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(short[].class); - private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS}; - - public ShortArrayPutAtMetaMethod() { - parameterTypes = PARAM_CLASS_ARR; - } + private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(short[].class); @Override public final CachedClass getDeclaringClass() { - return ARR_CLASS; + return ARRAY_CLASS; } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java index 64a1eb66173..2c212021b85 100644 --- a/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java +++ b/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java @@ -29,9 +29,9 @@ public class TransformMetaMethod extends MetaMethod { private final MetaMethod metaMethod; public TransformMetaMethod(final MetaMethod metaMethod) { - this.metaMethod = metaMethod; + super(metaMethod.getNativeParameterTypes()); setParametersTypes(metaMethod.getParameterTypes()); - nativeParamTypes = metaMethod.getNativeParameterTypes(); + this.metaMethod = metaMethod; } @Override diff --git a/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy b/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy index eb552519c78..8d9852b3619 100644 --- a/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy +++ b/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy @@ -18,10 +18,23 @@ */ package org.codehaus.groovy.reflection -import groovy.test.GroovyTestCase +import org.junit.Test -class CachedMethodTest extends GroovyTestCase { - void testCachedMethodCompareTo() { - assert String.metaClass.methods.size() == String.metaClass.methods.unique().size() +final class CachedMethodTest { + + @Test + void testCompareTo() { + int methodCount = String.metaClass.methods.size() + int uniqueCount = String.metaClass.methods.unique().size() + + assert methodCount == uniqueCount + } + + // GROOVY-11293 + @Test + void testIsVargsMethod() { + def cachedMethod = new CachedMethod(String.getMethod('join', CharSequence, CharSequence[])) + + assert cachedMethod.isVargsMethod() } }