spring-projects/spring-data-commons

Bump generated bytecode version

Closed this issue · 1 comments

ClassGeneratingEntityInstantiator & PropertyAccessorClassGenerator currently generate java 6 bytecode.
We should update those to at least V1_8 if not 17 to pass AotCache verification.

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
         }
     }