diff -Nru cglib-3.2.4/cglib/pom.xml cglib-3.2.5/cglib/pom.xml
--- cglib-3.2.4/cglib/pom.xml 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/pom.xml 2017-03-06 19:24:07.000000000 +0000
@@ -9,7 +9,7 @@
cglib
cglib-parent
- 3.2.4
+ 3.2.5
diff -Nru cglib-3.2.4/cglib/src/main/java/net/sf/cglib/core/ReflectUtils.java cglib-3.2.5/cglib/src/main/java/net/sf/cglib/core/ReflectUtils.java
--- cglib-3.2.4/cglib/src/main/java/net/sf/cglib/core/ReflectUtils.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/main/java/net/sf/cglib/core/ReflectUtils.java 2017-03-06 19:24:07.000000000 +0000
@@ -19,6 +19,7 @@
import java.lang.reflect.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.security.PrivilegedExceptionAction;
import java.security.ProtectionDomain;
import java.util.*;
import org.objectweb.asm.Attribute;
@@ -33,41 +34,84 @@
private static final Map primitives = new HashMap(8);
private static final Map transforms = new HashMap(8);
private static final ClassLoader defaultLoader = ReflectUtils.class.getClassLoader();
- private static Method DEFINE_CLASS;
+ private static Method DEFINE_CLASS, DEFINE_CLASS_UNSAFE;
private static final ProtectionDomain PROTECTION_DOMAIN;
+ private static final Object UNSAFE;
+ private static final Throwable THROWABLE;
private static final List OBJECT_METHODS = new ArrayList();
static {
- PROTECTION_DOMAIN = getProtectionDomain(ReflectUtils.class);
-
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- try {
- Class loader = Class.forName("java.lang.ClassLoader"); // JVM crash w/o this
- DEFINE_CLASS = loader.getDeclaredMethod("defineClass",
- new Class[]{ String.class,
- byte[].class,
- Integer.TYPE,
- Integer.TYPE,
- ProtectionDomain.class });
- DEFINE_CLASS.setAccessible(true);
- } catch (ClassNotFoundException e) {
- throw new CodeGenerationException(e);
- } catch (NoSuchMethodException e) {
- throw new CodeGenerationException(e);
+ ProtectionDomain protectionDomain;
+ Method defineClass, defineClassUnsafe;
+ Object unsafe;
+ Throwable throwable = null;
+ try {
+ protectionDomain = getProtectionDomain(ReflectUtils.class);
+ try {
+ defineClass = (Method) AccessController.doPrivileged(new PrivilegedExceptionAction() {
+ public Object run() throws Exception {
+ Class loader = Class.forName("java.lang.ClassLoader"); // JVM crash w/o this
+ Method defineClass = loader.getDeclaredMethod("defineClass",
+ new Class[]{ String.class,
+ byte[].class,
+ Integer.TYPE,
+ Integer.TYPE,
+ ProtectionDomain.class });
+ defineClass.setAccessible(true);
+ return defineClass;
+ }
+ });
+ defineClassUnsafe = null;
+ unsafe = null;
+ } catch (Throwable t) {
+ // Fallback on Jigsaw where this method is not available.
+ throwable = t;
+ defineClass = null;
+ unsafe = AccessController.doPrivileged(new PrivilegedExceptionAction() {
+ public Object run() throws Exception {
+ Class u = Class.forName("sun.misc.Unsafe");
+ Field theUnsafe = u.getDeclaredField("theUnsafe");
+ theUnsafe.setAccessible(true);
+ return theUnsafe.get(null);
+ }
+ });
+ Class u = Class.forName("sun.misc.Unsafe");
+ defineClassUnsafe = u.getMethod("defineClass",
+ new Class[]{ String.class,
+ byte[].class,
+ Integer.TYPE,
+ Integer.TYPE,
+ ClassLoader.class,
+ ProtectionDomain.class });
+ }
+ AccessController.doPrivileged(new PrivilegedExceptionAction() {
+ public Object run() throws Exception {
+ Method[] methods = Object.class.getDeclaredMethods();
+ for (Method method : methods) {
+ if ("finalize".equals(method.getName())
+ || (method.getModifiers() & (Modifier.FINAL | Modifier.STATIC)) > 0) {
+ continue;
+ }
+ OBJECT_METHODS.add(method);
+ }
+ return null;
}
- return null;
- }
- });
- Method[] methods = Object.class.getDeclaredMethods();
- for (Method method : methods) {
- if ("finalize".equals(method.getName())
- || (method.getModifiers() & (Modifier.FINAL | Modifier.STATIC)) > 0) {
- continue;
- }
- OBJECT_METHODS.add(method);
- }
+ });
+ } catch (Throwable t) {
+ if (throwable == null) {
+ throwable = t;
+ }
+ protectionDomain = null;
+ defineClass = null;
+ defineClassUnsafe = null;
+ unsafe = null;
+ }
+ PROTECTION_DOMAIN = protectionDomain;
+ DEFINE_CLASS = defineClass;
+ DEFINE_CLASS_UNSAFE = defineClassUnsafe;
+ UNSAFE = unsafe;
+ THROWABLE = throwable;
}
private static final String[] CGLIB_PACKAGES = {
@@ -409,8 +453,16 @@
}
public static Class defineClass(String className, byte[] b, ClassLoader loader, ProtectionDomain protectionDomain) throws Exception {
- Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), protectionDomain };
- Class c = (Class)DEFINE_CLASS.invoke(loader, args);
+ Class c;
+ if (DEFINE_CLASS != null) {
+ Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), protectionDomain };
+ c = (Class)DEFINE_CLASS.invoke(loader, args);
+ } else if (DEFINE_CLASS_UNSAFE != null) {
+ Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), loader, protectionDomain };
+ c = (Class)DEFINE_CLASS_UNSAFE.invoke(UNSAFE, args);
+ } else {
+ throw new CodeGenerationException(THROWABLE);
+ }
// Force static initializers to run.
Class.forName(className, true, loader);
return c;
diff -Nru cglib-3.2.4/cglib/src/main/java/net/sf/cglib/core/TinyBitSet.java cglib-3.2.5/cglib/src/main/java/net/sf/cglib/core/TinyBitSet.java
--- cglib-3.2.4/cglib/src/main/java/net/sf/cglib/core/TinyBitSet.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/main/java/net/sf/cglib/core/TinyBitSet.java 2017-03-06 19:24:07.000000000 +0000
@@ -15,6 +15,7 @@
*/
package net.sf.cglib.core;
+@Deprecated
public class TinyBitSet {
private static int[] T = new int[256];
private int value = 0;
@@ -29,7 +30,7 @@
}
static {
- for(int j = 0; j < 256; j++) {
+ for (int j = 0; j < 256; j++) {
T[j] = gcount(j);
}
}
@@ -49,11 +50,16 @@
}
return j;
}
-
+
public int length() {
return log2(topbit(value));
}
+ /**
+ * If bit 31 is set then this method results in an infinite loop.
+ *
+ * @return the number of bits set to true
in this TinyBitSet.
+ */
public int cardinality() {
int w = value;
int c = 0;
diff -Nru cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/BridgeMethodResolver.java cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/BridgeMethodResolver.java
--- cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/BridgeMethodResolver.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/BridgeMethodResolver.java 2017-03-06 19:24:07.000000000 +0000
@@ -42,9 +42,11 @@
class BridgeMethodResolver {
private final Map/* */declToBridge;
+ private final ClassLoader classLoader;
- public BridgeMethodResolver(Map declToBridge) {
+ public BridgeMethodResolver(Map declToBridge, ClassLoader classLoader) {
this.declToBridge = declToBridge;
+ this.classLoader = classLoader;
}
/**
@@ -58,7 +60,7 @@
Class owner = (Class)entry.getKey();
Set bridges = (Set)entry.getValue();
try {
- new ClassReader(owner.getName())
+ new ClassReader(classLoader.getResourceAsStream(owner.getName().replace('.', '/') + ".class"))
.accept(new BridgedFinder(bridges, resolved),
ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG);
} catch(IOException ignored) {}
@@ -68,14 +70,14 @@
private static class BridgedFinder extends ClassVisitor {
private Map/**/ resolved;
- private Set/**/ eligableMethods;
+ private Set/**/ eligibleMethods;
private Signature currentMethod = null;
- BridgedFinder(Set eligableMethods, Map resolved) {
+ BridgedFinder(Set eligibleMethods, Map resolved) {
super(Opcodes.ASM5);
this.resolved = resolved;
- this.eligableMethods = eligableMethods;
+ this.eligibleMethods = eligibleMethods;
}
public void visit(int version, int access, String name,
@@ -85,7 +87,7 @@
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
Signature sig = new Signature(name, desc);
- if (eligableMethods.remove(sig)) {
+ if (eligibleMethods.remove(sig)) {
currentMethod = sig;
return new MethodVisitor(Opcodes.ASM5) {
public void visitMethodInsn(int opcode, String owner, String name,
diff -Nru cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/CallbackGenerator.java cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/CallbackGenerator.java
--- cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/CallbackGenerator.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/CallbackGenerator.java 2017-03-06 19:24:07.000000000 +0000
@@ -31,6 +31,6 @@
int getIndex(MethodInfo method);
void emitCallback(CodeEmitter ce, int index);
Signature getImplSignature(MethodInfo method);
- void emitInvoke(CodeEmitter e, MethodInfo method);
+ void emitLoadArgsAndInvoke(CodeEmitter e, MethodInfo method);
}
}
diff -Nru cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java
--- cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java 2017-03-06 19:24:07.000000000 +0000
@@ -1129,7 +1129,7 @@
}
}
- final Map bridgeToTarget = new BridgeMethodResolver(declToBridge).resolveAll();
+ final Map bridgeToTarget = new BridgeMethodResolver(declToBridge, getClassLoader()).resolveAll();
Set seenGen = new HashSet();
CodeEmitter se = ce.getStaticHook();
@@ -1155,19 +1155,22 @@
public Signature getImplSignature(MethodInfo method) {
return rename(method.getSignature(), ((Integer)positions.get(method)).intValue());
}
- public void emitInvoke(CodeEmitter e, MethodInfo method) {
+ public void emitLoadArgsAndInvoke(CodeEmitter e, MethodInfo method) {
// If this is a bridge and we know the target was called from invokespecial,
// then we need to invoke_virtual w/ the bridge target instead of doing
// a super, because super may itself be using super, which would bypass
// any proxies on the target.
Signature bridgeTarget = (Signature)bridgeToTarget.get(method.getSignature());
if (bridgeTarget != null) {
- // TODO: this assumes that the target has wider or the same type
- // parameters than the current.
- // In reality this should always be true because otherwise we wouldn't
- // have had a bridge doing an invokespecial.
- // If it isn't true, we would need to checkcast each argument
- // against the target's argument types
+ // checkcast each argument against the target's argument types
+ for (int i = 0; i < bridgeTarget.getArgumentTypes().length; i++) {
+ e.load_arg(i);
+ Type target = bridgeTarget.getArgumentTypes()[i];
+ if (!target.equals(method.getSignature().getArgumentTypes()[i])) {
+ e.checkcast(target);
+ }
+ }
+
e.invoke_virtual_this(bridgeTarget);
Type retType = method.getSignature().getReturnType();
@@ -1185,6 +1188,7 @@
e.checkcast(retType);
}
} else {
+ e.load_args();
e.super_invoke(method.getSignature());
}
}
diff -Nru cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/MethodInterceptorGenerator.java cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/MethodInterceptorGenerator.java
--- cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/MethodInterceptorGenerator.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/MethodInterceptorGenerator.java 2017-03-06 19:24:07.000000000 +0000
@@ -139,8 +139,7 @@
e.throw_exception(ABSTRACT_METHOD_ERROR, method.toString() + " is abstract" );
} else {
e.load_this();
- e.load_args();
- context.emitInvoke(e, method);
+ context.emitLoadArgsAndInvoke(e, method);
}
}
diff -Nru cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/NoOpGenerator.java cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/NoOpGenerator.java
--- cglib-3.2.4/cglib/src/main/java/net/sf/cglib/proxy/NoOpGenerator.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/main/java/net/sf/cglib/proxy/NoOpGenerator.java 2017-03-06 19:24:07.000000000 +0000
@@ -32,8 +32,7 @@
TypeUtils.isPublic(method.getModifiers()))) {
CodeEmitter e = EmitUtils.begin_method(ce, method);
e.load_this();
- e.load_args();
- context.emitInvoke(e, method);
+ context.emitLoadArgsAndInvoke(e, method);
e.return_value();
e.end_method();
}
diff -Nru cglib-3.2.4/cglib/src/test/java/net/sf/cglib/core/TestTinyBitSet.java cglib-3.2.5/cglib/src/test/java/net/sf/cglib/core/TestTinyBitSet.java
--- cglib-3.2.4/cglib/src/test/java/net/sf/cglib/core/TestTinyBitSet.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/test/java/net/sf/cglib/core/TestTinyBitSet.java 2017-03-06 19:24:07.000000000 +0000
@@ -15,52 +15,79 @@
*/
package net.sf.cglib.core;
-import net.sf.cglib.CodeGenTestCase;
-import junit.framework.*;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
public class TestTinyBitSet extends TestCase {
+
+ private TinyBitSet b = new TinyBitSet();
+
public void testGetSetClear() {
- TinyBitSet b = new TinyBitSet();
- assertTrue(!b.get(5));
- b.set(5);
- assertTrue(b.get(5));
- b.clear(5);
- assertTrue(!b.get(5));
+ // get, set, clear, set bits 0 - 31
+ for (int index = 0; index < 32; index++) {
+ assertFalse(b.get(index));
+ b.set(index);
+ assertTrue(b.get(index));
+ b.clear(index);
+ assertFalse(b.get(index));
+ b.set(index);
+ }
+ // after setting bits 0-31, get bits 32 and above reports true;
+ assertTrue(b.get(32));
+ assertTrue(b.get(255));
+ assertTrue(b.get(256));
+ assertTrue(b.get(1000000));
}
-
+
+ public void testGetSetClear2() {
+ for (int index = 2; index > 0; index *= 2) {
+ b.set(index);
+ assertTrue(b.get(index));
+ b.clear(index);
+ assertFalse(b.get(index));
+ b.set(index);
+ }
+ }
+
public void testLength() {
- TinyBitSet b = new TinyBitSet();
+ assertEquals(0, b.length());
b.set(10);
- assertTrue(b.length() == 11);
+ assertEquals(11, b.length());
b.set(15);
- assertTrue(b.length() == 16);
+ assertEquals(16, b.length());
b.set(14);
- assertTrue(b.length() == 16);
+ assertEquals(16, b.length());
}
public void testCardinality() {
- TinyBitSet b = new TinyBitSet();
- assertTrue(b.cardinality() == 0);
+ assertEquals(0, b.cardinality());
b.set(1);
- assertTrue(b.cardinality() == 1);
+ assertEquals(1, b.cardinality());
b.set(4);
- assertTrue(b.cardinality() == 2);
+ assertEquals(2, b.cardinality());
b.set(10);
- assertTrue(b.cardinality() == 3);
+ assertEquals(3, b.cardinality());
b.set(10);
- assertTrue(b.cardinality() == 3);
+ assertEquals(3, b.cardinality());
b.clear(10);
- assertTrue(b.cardinality() == 2);
+ assertEquals(2, b.cardinality());
+ }
+
+ /** Causes infinite loop */
+ public void set31InfiniteLoopCardinality() {
+ b.set(31);
+ assertEquals(1, b.cardinality()); // infinite loop...
}
public TestTinyBitSet(String testName) {
super(testName);
}
-
+
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
-
+
public static Test suite() {
return new TestSuite(TestTinyBitSet.class);
}
diff -Nru cglib-3.2.4/cglib/src/test/java/net/sf/cglib/proxy/TestEnhancer.java cglib-3.2.5/cglib/src/test/java/net/sf/cglib/proxy/TestEnhancer.java
--- cglib-3.2.4/cglib/src/test/java/net/sf/cglib/proxy/TestEnhancer.java 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib/src/test/java/net/sf/cglib/proxy/TestEnhancer.java 2017-03-06 19:24:07.000000000 +0000
@@ -15,6 +15,7 @@
*/
package net.sf.cglib.proxy;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -26,8 +27,9 @@
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
-
+import java.util.Map;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -38,6 +40,9 @@
import net.sf.cglib.core.Predicate;
import net.sf.cglib.core.ReflectUtils;
import net.sf.cglib.reflect.FastClass;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
/**
*@author Juozas Baliuka
@@ -1256,9 +1261,163 @@
intf.aMethod(null);
assertEquals(Arrays.asList(Concrete.class), paramTypes);
}
-
-
-
+
+ public void testBridgeParameterCheckcast() throws Exception {
+
+ // If the compiler used for Z omits the bridge method, and X is compiled with javac,
+ // javac will generate an invokespecial bridge in X.
+
+ // public interface I {
+ // public A f(B b);
+ // }
+ // public abstract class Z implements I {
+ // public U f(Long id) {
+ // return null;
+ // }
+ // }
+ // public class X extends Z {}
+
+ final Map classes = new HashMap();
+
+ {
+ ClassWriter cw = new ClassWriter(0);
+ cw.visit(
+ 49,
+ Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
+ "I",
+ "Ljava/lang/Object;",
+ "java/lang/Object",
+ null);
+ {
+ MethodVisitor mv =
+ cw.visitMethod(
+ Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT,
+ "f",
+ "(Ljava/lang/Object;)Ljava/lang/Object;",
+ "(TB;)TA;",
+ null);
+ mv.visitEnd();
+ }
+ cw.visitEnd();
+ classes.put("I.class", cw.toByteArray());
+ }
+ {
+ ClassWriter cw = new ClassWriter(0);
+ cw.visit(
+ 49,
+ Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_ABSTRACT,
+ "Z",
+ "Ljava/lang/Object;LI;",
+ "java/lang/Object",
+ new String[] {"I"});
+ {
+ MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(Opcodes.ALOAD, 0);
+ mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V", false);
+ mv.visitInsn(Opcodes.RETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ }
+ {
+ MethodVisitor mv =
+ cw.visitMethod(
+ Opcodes.ACC_PUBLIC,
+ "f",
+ "(Ljava/lang/String;)Ljava/lang/Number;",
+ "(Ljava/lang/String;)TU;",
+ null);
+ mv.visitCode();
+ mv.visitInsn(Opcodes.ACONST_NULL);
+ mv.visitInsn(Opcodes.ARETURN);
+ mv.visitMaxs(1, 2);
+ mv.visitEnd();
+ }
+ cw.visitEnd();
+ classes.put("Z.class", cw.toByteArray());
+ }
+ {
+ ClassWriter cw = new ClassWriter(0);
+ cw.visit(
+ 49, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, "X", "LZ;", "Z", null);
+ {
+ MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(Opcodes.ALOAD, 0);
+ mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "Z", "", "()V", false);
+ mv.visitInsn(Opcodes.RETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ }
+ {
+ MethodVisitor mv =
+ cw.visitMethod(
+ Opcodes.ACC_PUBLIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_SYNTHETIC,
+ "f",
+ "(Ljava/lang/Object;)Ljava/lang/Object;",
+ null,
+ null);
+ mv.visitCode();
+ mv.visitVarInsn(Opcodes.ALOAD, 0);
+ mv.visitVarInsn(Opcodes.ALOAD, 1);
+ mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/String");
+ mv.visitMethodInsn(
+ Opcodes.INVOKESPECIAL, "Z", "f", "(Ljava/lang/String;)Ljava/lang/Number;", false);
+ mv.visitInsn(Opcodes.ARETURN);
+ mv.visitMaxs(2, 2);
+ mv.visitEnd();
+ }
+
+ cw.visitEnd();
+
+ classes.put("X.class", cw.toByteArray());
+ }
+
+ ClassLoader classLoader =
+ new ClassLoader(getClass().getClassLoader()) {
+ @Override
+ public InputStream getResourceAsStream(String name) {
+ InputStream is = super.getResourceAsStream(name);
+ if (is != null) {
+ return is;
+ }
+ if (classes.containsKey(name)) {
+ return new ByteArrayInputStream(classes.get(name));
+ }
+ return null;
+ }
+
+ public Class findClass(String name) throws ClassNotFoundException {
+ byte[] ba = classes.get(name.replace('.', '/') + ".class");
+ if (ba != null) {
+ return defineClass(name, ba, 0, ba.length);
+ }
+ throw new ClassNotFoundException(name);
+ }
+ };
+
+ List retTypes = new ArrayList();
+ List paramTypes = new ArrayList();
+ Interceptor interceptor = new Interceptor(retTypes, paramTypes);
+
+ Enhancer e = new Enhancer();
+ e.setClassLoader(classLoader);
+ e.setSuperclass(classLoader.loadClass("X"));
+ e.setCallback(interceptor);
+
+ Object c = e.create();
+
+ for (Method m : c.getClass().getDeclaredMethods()) {
+ if (m.getName().equals("f") && m.getReturnType().equals(Object.class)) {
+ m.invoke(c, new Object[] {null});
+ }
+ }
+
+ // f(Object)Object should bridge to f(Number)String
+ assertEquals(Arrays.asList(Object.class, Number.class), retTypes);
+ assertEquals(Arrays.asList(Object.class, String.class), paramTypes);
+ }
+
static class ErasedType {}
static class RetType extends ErasedType {}
static class Refined extends RetType {}
diff -Nru cglib-3.2.4/cglib-integration-test/pom.xml cglib-3.2.5/cglib-integration-test/pom.xml
--- cglib-3.2.4/cglib-integration-test/pom.xml 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib-integration-test/pom.xml 2017-03-06 19:24:07.000000000 +0000
@@ -9,7 +9,7 @@
cglib
cglib-parent
- 3.2.4
+ 3.2.5
diff -Nru cglib-3.2.4/cglib-jmh/pom.xml cglib-3.2.5/cglib-jmh/pom.xml
--- cglib-3.2.4/cglib-jmh/pom.xml 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib-jmh/pom.xml 2017-03-06 19:24:07.000000000 +0000
@@ -7,7 +7,7 @@
cglib-parent
cglib
- 3.2.4
+ 3.2.5
4.0.0
diff -Nru cglib-3.2.4/cglib-nodep/pom.xml cglib-3.2.5/cglib-nodep/pom.xml
--- cglib-3.2.4/cglib-nodep/pom.xml 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib-nodep/pom.xml 2017-03-06 19:24:07.000000000 +0000
@@ -9,7 +9,7 @@
cglib
cglib-parent
- 3.2.4
+ 3.2.5
diff -Nru cglib-3.2.4/cglib-sample/pom.xml cglib-3.2.5/cglib-sample/pom.xml
--- cglib-3.2.4/cglib-sample/pom.xml 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/cglib-sample/pom.xml 2017-03-06 19:24:07.000000000 +0000
@@ -9,7 +9,7 @@
cglib
cglib-parent
- 3.2.4
+ 3.2.5
diff -Nru cglib-3.2.4/debian/changelog cglib-3.2.5/debian/changelog
--- cglib-3.2.4/debian/changelog 2016-07-14 21:47:16.000000000 +0000
+++ cglib-3.2.5/debian/changelog 2017-06-19 14:12:40.000000000 +0000
@@ -1,3 +1,10 @@
+cglib (3.2.5-1) unstable; urgency=medium
+
+ * Team upload.
+ * New upstream release
+
+ -- Emmanuel Bourg Mon, 19 Jun 2017 16:12:40 +0200
+
cglib (3.2.4-1) unstable; urgency=medium
* Team upload.
diff -Nru cglib-3.2.4/debian/patches/04-optional-ant-dependency.patch cglib-3.2.5/debian/patches/04-optional-ant-dependency.patch
--- cglib-3.2.4/debian/patches/04-optional-ant-dependency.patch 2016-07-14 21:45:14.000000000 +0000
+++ cglib-3.2.5/debian/patches/04-optional-ant-dependency.patch 2017-06-19 14:12:15.000000000 +0000
@@ -14,7 +14,7 @@
--- a/pom.xml
+++ b/pom.xml
-@@ -214,7 +214,6 @@
+@@ -227,7 +227,6 @@
org.apache.ant
ant
1.9.6
diff -Nru cglib-3.2.4/pom.xml cglib-3.2.5/pom.xml
--- cglib-3.2.4/pom.xml 2016-06-24 15:28:08.000000000 +0000
+++ cglib-3.2.5/pom.xml 2017-03-06 19:24:07.000000000 +0000
@@ -14,7 +14,7 @@
cglib
cglib-parent
- 3.2.4
+ 3.2.5
pom
Code Generation Library
@@ -54,7 +54,7 @@
1.5
1.5
- 5.1
+ 5.2
${java.compiler.argument}