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/02/12 15:57:00 UTC

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

Daniel Sun created GROOVY-8989:
----------------------------------

             Summary: 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
             Fix For: 3.0.0-alpha-5


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)