You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniel Sun (JIRA)" <ji...@apache.org> on 2019/03/16 12:42:00 UTC

[jira] [Updated] (GROOVY-8989) Support native interface default method

     [ https://issues.apache.org/jira/browse/GROOVY-8989?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Daniel Sun updated GROOVY-8989:
-------------------------------
    Fix Version/s:     (was: 3.0.0-beta-1)

> Support native interface default method
> ---------------------------------------
>
>                 Key: GROOVY-8989
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8989
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Daniel Sun
>            Priority: Major
>
> Currently, interface default methods are implemented using traits, i.e. the implementation is not native interface default methods. We must refine the implementation before 3.0.0 final released.
> As MOP needs to additional methods like the following, some of which are {{private}}, so we maybe have to generate bytecode of Java9+ version. As a result, Java9+ is required to run.
> {code:java}
>   // access flags 0x1004
>   protected synthetic $getStaticMetaClass()Lgroovy/lang/MetaClass;
>     ALOAD 0
>     INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
>     LDC LA;.class
>     IF_ACMPEQ L0
>     ALOAD 0
>     INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass (Ljava/lang/Object;)Lgroovy/lang/MetaClass;
>     ARETURN
>    L0
>    FRAME SAME
>     GETSTATIC A.$staticClassInfo : Lorg/codehaus/groovy/reflection/ClassInfo;
>     ASTORE 1
>     ALOAD 1
>     IFNONNULL L1
>     ALOAD 0
>     INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
>     INVOKESTATIC org/codehaus/groovy/reflection/ClassInfo.getClassInfo (Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
>     DUP
>     ASTORE 1
>     PUTSTATIC A.$staticClassInfo : Lorg/codehaus/groovy/reflection/ClassInfo;
>    L1
>    FRAME APPEND [org/codehaus/groovy/reflection/ClassInfo]
>     ALOAD 1
>     INVOKEVIRTUAL org/codehaus/groovy/reflection/ClassInfo.getMetaClass ()Lgroovy/lang/MetaClass;
>     ARETURN
>     MAXSTACK = 2
>     MAXLOCALS = 2
>   // access flags 0x1
>   public getMetaClass()Lgroovy/lang/MetaClass;
>   @Lgroovy/transform/Generated;()
>   @Lgroovy/transform/Internal;()
>     ALOAD 0
>     GETFIELD A.metaClass : Lgroovy/lang/MetaClass;
>     DUP
>     IFNULL L0
>     ARETURN
>    L0
>    FRAME SAME1 groovy/lang/MetaClass
>     POP
>     ALOAD 0
>     DUP
>     INVOKEVIRTUAL A.$getStaticMetaClass ()Lgroovy/lang/MetaClass;
>     PUTFIELD A.metaClass : Lgroovy/lang/MetaClass;
>     ALOAD 0
>     GETFIELD A.metaClass : Lgroovy/lang/MetaClass;
>     ARETURN
>     MAXSTACK = 2
>     MAXLOCALS = 1
>   // access flags 0x1
>   public setMetaClass(Lgroovy/lang/MetaClass;)V
>   @Lgroovy/transform/Generated;()
>   @Lgroovy/transform/Internal;()
>     ALOAD 0
>     ALOAD 1
>     PUTFIELD A.metaClass : Lgroovy/lang/MetaClass;
>     RETURN
>     MAXSTACK = 2
>     MAXLOCALS = 2
>   // access flags 0x1
>   public invokeMethod(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
>   @Lgroovy/transform/Generated;()
>   @Lgroovy/transform/Internal;()
>     ALOAD 0
>     INVOKEVIRTUAL A.getMetaClass ()Lgroovy/lang/MetaClass;
>     ALOAD 0
>     ALOAD 1
>     ALOAD 2
>     INVOKEINTERFACE groovy/lang/MetaClass.invokeMethod (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; (itf)
>     ARETURN
>     MAXSTACK = 4
>     MAXLOCALS = 3
>   // access flags 0x1
>   public getProperty(Ljava/lang/String;)Ljava/lang/Object;
>   @Lgroovy/transform/Generated;()
>   @Lgroovy/transform/Internal;()
>     ALOAD 0
>     INVOKEVIRTUAL A.getMetaClass ()Lgroovy/lang/MetaClass;
>     ALOAD 0
>     ALOAD 1
>     INVOKEINTERFACE groovy/lang/MetaClass.getProperty (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; (itf)
>     ARETURN
>     MAXSTACK = 3
>     MAXLOCALS = 2
>   // access flags 0x1
>   public setProperty(Ljava/lang/String;Ljava/lang/Object;)V
>   @Lgroovy/transform/Generated;()
>   @Lgroovy/transform/Internal;()
>     ALOAD 0
>     INVOKEVIRTUAL A.getMetaClass ()Lgroovy/lang/MetaClass;
>     ALOAD 0
>     ALOAD 1
>     ALOAD 2
>     INVOKEINTERFACE groovy/lang/MetaClass.setProperty (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V (itf)
>     RETURN
>     MAXSTACK = 4
>     MAXLOCALS = 3
>   // access flags 0x100A
>   private static synthetic $createCallSiteArray_1([Ljava/lang/String;)V
>     ALOAD 0
>     LDC 0
>     LDC "println"
>     AASTORE
>     RETURN
>     MAXSTACK = 3
>     MAXLOCALS = 1
>   // access flags 0x100A
>   private static synthetic $createCallSiteArray()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray;
>     LDC 1
>     ANEWARRAY java/lang/String
>     ASTORE 0
>     ALOAD 0
>     INVOKESTATIC A.$createCallSiteArray_1 ([Ljava/lang/String;)V
>     NEW org/codehaus/groovy/runtime/callsite/CallSiteArray
>     DUP
>     LDC LA;.class
>     ALOAD 0
>     INVOKESPECIAL org/codehaus/groovy/runtime/callsite/CallSiteArray.<init> (Ljava/lang/Class;[Ljava/lang/String;)V
>     ARETURN
>     MAXSTACK = 4
>     MAXLOCALS = 1
>   // access flags 0x100A
>   private static synthetic $getCallSiteArray()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
>     GETSTATIC A.$callSiteArray : Ljava/lang/ref/SoftReference;
>     IFNULL L0
>     GETSTATIC A.$callSiteArray : Ljava/lang/ref/SoftReference;
>     INVOKEVIRTUAL java/lang/ref/SoftReference.get ()Ljava/lang/Object;
>     CHECKCAST org/codehaus/groovy/runtime/callsite/CallSiteArray
>     DUP
>     ASTORE 0
>     IFNONNULL L1
>    L0
>    FRAME SAME
>     INVOKESTATIC A.$createCallSiteArray ()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray;
>     ASTORE 0
>     NEW java/lang/ref/SoftReference
>     DUP
>     ALOAD 0
>     INVOKESPECIAL java/lang/ref/SoftReference.<init> (Ljava/lang/Object;)V
>     PUTSTATIC A.$callSiteArray : Ljava/lang/ref/SoftReference;
>    L1
>    FRAME APPEND [org/codehaus/groovy/runtime/callsite/CallSiteArray]
>     ALOAD 0
>     GETFIELD org/codehaus/groovy/runtime/callsite/CallSiteArray.array : [Lorg/codehaus/groovy/runtime/callsite/CallSite;
>     ARETURN
>     MAXSTACK = 3
>     MAXLOCALS = 1
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)