Bump generated bytecode version
Closed this issue · 1 comments
christophstrobl commented
ClassGeneratingEntityInstantiator & PropertyAccessorClassGenerator currently generate java 6 bytecode.
We should update those to at least V1_8 if not 17 to pass AotCache verification.
christophstrobl commented
The upgrade requires a bit more than just bumping Opcodes as newer versions will bark at the generated code.
java.lang.VerifyError: Bad local variable type
Exception Details:
Location:
org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.getProperty(Lorg/springframework/data/mapping/PersistentProperty;)Ljava/lang/Object; @131: aload_2
Reason:
Type top (current frame, locals[2]) is not assignable to reference type
Current Frame:
bci: @131
flags: { }
locals: { 'org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o', 'org/springframework/data/mapping/PersistentProperty' }
stack: { 'java/lang/invoke/MethodHandle' }
The decompiled method looks like this.
public Object getProperty(PersistentProperty property) {
Assert.notNull(property, "Property must not be null");
Object bean = this.bean;
switch (property.getName().hashCode()) {
case -2043145158:
return $syntheticProperty_getter.invoke(bean);
case -1476840328:
return $privateProperty_fieldGetter.invoke(bean);
case -1421140061:
return $protectedProperty_fieldGetter.invoke(bean);
case -1103489007:
return $publicField_fieldGetter.invoke(bean);
case -787569677:
return $wither_fieldGetter.invoke(bean);
case -684791137:
return $packageDefaultField_fieldGetter.invoke(bean);
case -425362594:
return $publicProperty_getter.invoke(bean);
case -347204197:
return $backing_fieldGetter.invoke(bean);
case 417854992:
return $packageDefaultProperty_fieldGetter.invoke(bean);
case 738681324:
return $protectedField_fieldGetter.invoke(bean);
case 977569079:
return $privateField_fieldGetter.invoke(bean);
case 1596987778:
return $immutable_fieldGetter.invoke(bean);
default:
throw new UnsupportedOperationException(String.format("No accessor to get property %s", property));
}
}while we see
public java.lang.Object getProperty(org.springframework.data.mapping.PersistentProperty arg0) { //(Lorg/springframework/data/mapping/PersistentProperty;)Ljava/lang/Object;
<sig:(Lorg/springframework/data/mapping/PersistentProperty<*>;)Ljava/lang/Object;> <localVar:index=0 , name=this , desc=Lorg/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o;, sig=null, start=L0, end=L13>
<localVar:index=1 , name=property , desc=Lorg/springframework/data/mapping/PersistentProperty;, sig=Lorg/springframework/data/mapping/PersistentProperty<*>;, start=L0, end=L13>
<localVar:index=2 , name=bean , desc=Ljava/lang/Object;, sig=null, start=L0, end=L13>
L0 {
aload 1
ldc "Property must not be null" (java.lang.String)
invokestatic org/springframework/util/Assert.notNull(Ljava/lang/Object;Ljava/lang/String;)V
aload 0 // reference to self
getfield org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.bean:java.lang.Object
astore 2
aload 1
invokeinterface org/springframework/data/mapping/PersistentProperty.getName()Ljava/lang/String;
invokevirtual java/lang/String.hashCode()I
lookupswitch:
val: -2043145158 -> L12
val: -1476840328 -> L8
val: -1421140061 -> L10
val: -1103489007 -> L4
val: -787569677 -> L7
val: -684791137 -> L2
val: -425362594 -> L11
val: -347204197 -> L5
val: 417854992 -> L9
val: 738681324 -> L3
val: 977569079 -> L1
val: 1596987778 -> L6
default -> L13
}
L1 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$privateField_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L2 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$packageDefaultField_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L3 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$protectedField_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L4 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$publicField_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L5 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$backing_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L6 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$immutable_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L7 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$wither_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L8 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$privateProperty_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L9 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$packageDefaultProperty_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L10 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$protectedProperty_fieldGetter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L11 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$publicProperty_getter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L12 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
getstatic org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o.$syntheticProperty_getter:java.lang.invoke.MethodHandle
aload 2
invokevirtual java/lang/invoke/MethodHandle.invoke(Ljava/lang/Object;)Ljava/lang/Object;
areturn
}
L13 {
f_new (Locals[2]: org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests$InnerPrivateType__Accessor_8f1e6o, org/springframework/data/mapping/PersistentProperty) (Stack[0])
new java/lang/UnsupportedOperationException
dup
ldc "No accessor to get property %s" (java.lang.String)
iconst_1
anewarray java/lang/Object
dup
iconst_0
aload 1
aastore
invokestatic java/lang/String.format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
invokespecial java/lang/UnsupportedOperationException.<init>(Ljava/lang/String;)V
athrow
}
}