Browse Source

Make CGLIB Enhancer compatible with Kotlin 2.2.20+

This commit refines Enhancer#emitMethods to support the changes
introduced by https://youtrack.jetbrains.com/issue/KT-76667.

See gh-35487
pull/35587/head
Juergen Hoeller 3 months ago committed by Sébastien Deleuze
parent
commit
3e37279db6
  1. 33
      spring-core/src/main/java/org/springframework/cglib/proxy/Enhancer.java

33
spring-core/src/main/java/org/springframework/cglib/proxy/Enhancer.java

@ -1278,29 +1278,32 @@ public class Enhancer extends AbstractClassGenerator { @@ -1278,29 +1278,32 @@ public class Enhancer extends AbstractClassGenerator {
Signature bridgeTarget = (Signature) bridgeToTarget.get(method.getSignature());
if (bridgeTarget != null) {
// checkcast each argument against the target's argument types
for (int i = 0; i < bridgeTarget.getArgumentTypes().length; i++) {
Type[] argTypes = method.getSignature().getArgumentTypes();
Type[] targetTypes = bridgeTarget.getArgumentTypes();
for (int i = 0; i < targetTypes.length; i++) {
e.load_arg(i);
Type target = bridgeTarget.getArgumentTypes()[i];
if (!target.equals(method.getSignature().getArgumentTypes()[i])) {
Type argType = argTypes[i];
Type target = targetTypes[i];
if (!target.equals(argType)) {
if (!TypeUtils.isPrimitive(target)) {
e.box(argType);
}
e.checkcast(target);
}
}
e.invoke_virtual_this(bridgeTarget);
// Not necessary to cast if the target & bridge have the same return type.
Type retType = method.getSignature().getReturnType();
// Not necessary to cast if the target & bridge have
// the same return type.
// (This conveniently includes void and primitive types,
// which would fail if casted. It's not possible to
// covariant from boxed to unbox (or vice versa), so no having
// to box/unbox for bridges).
// TODO: It also isn't necessary to checkcast if the return is
// assignable from the target. (This would happen if a subclass
// used covariant returns to narrow the return type within a bridge
// method.)
if (!retType.equals(bridgeTarget.getReturnType())) {
e.checkcast(retType);
Type target = bridgeTarget.getReturnType();
if (!target.equals(retType)) {
if (!TypeUtils.isPrimitive(target)) {
e.unbox(retType);
}
else {
e.checkcast(retType);
}
}
}
else {

Loading…
Cancel
Save