Skip to content

Instantly share code, notes, and snippets.

@nobeans
Last active March 24, 2018 06:30
Show Gist options
  • Save nobeans/e6bda4e197836d9cafb37ab0123015a9 to your computer and use it in GitHub Desktop.
Save nobeans/e6bda4e197836d9cafb37ab0123015a9 to your computer and use it in GitHub Desktop.
GroovyのtraitとCompileStaticとの関係

GroovyのtraitとCompileStaticとの関係

Groovyのtraitでimplementsする側に@CompileStaticをつけた場合に、trait由来のコードに@CompileStaticの効果が出るのか気になったので、groovyConsoleのFinalizationのバイトコードを確認してみた。

結論として、CallSiteとか使われなくなるし、「効率的なバイトコードになってる」ようなんだけど、ちょっとまだよくわかってない。

trait側のint型へのキャストを無くしたバージョンでMyTrait@CompileStaticをつけると、型チェック違反でコンパイルエラーになるんだけど(期待通り)、 MyTraitじゃなくてMyClass側に@CompileStaticをつけた場合、型チェック違反にはならなかった。 なのに、効率的なコードになるというのどういうことなのかしら。 実行時エラーのリスクは低減できないけど、実行効率は良い、みたいな感じ?

サンプルコード

適当です。

import groovy.transform.CompileStatic

//@CompileStatic
trait MyTrait {
    int hoge(Object obj) {
        return ((int) obj) + 1234
        //return obj + 1234
    }
}

//@CompileStatic
class MyClass implements MyTrait {
    def fooMethod(String target){ // この辺、CompileStatic効果の出るコードってなんだっけ?と思ってググって見つけたきょんくんのコードをコピペしました
      def result = target * 3
      result.contains("G*")
    }
}

assert new MyClass().hoge(123) == 1357

MyTrait=CompileStatic, MyClass=CompileStatic

// class version 49.0 (49)
// access flags 0x21
public class MyClass implements MyTrait groovy/lang/GroovyObject  {

  // compiled from: script1521871958396.groovy

  // access flags 0x100A
  private static synthetic Lorg/codehaus/groovy/reflection/ClassInfo; $staticClassInfo

  // access flags 0x1089
  public static transient synthetic Z __$stMC

  // access flags 0x1082
  private transient synthetic Lgroovy/lang/MetaClass; metaClass

  // access flags 0x1
  public <init>()V
   L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    ALOAD 0
    INVOKEVIRTUAL MyClass.$getStaticMetaClass ()Lgroovy/lang/MetaClass;
    ASTORE 1
    ALOAD 1
    ALOAD 0
    SWAP
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ALOAD 1
    POP
    ALOAD 0
    INVOKESTATIC MyTrait$Trait$Helper.$init$ (LMyTrait;)V
    ACONST_NULL
    POP
   L1
    RETURN
    LOCALVARIABLE this LMyClass; L0 L1 0
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1
  public fooMethod(Ljava/lang/String;)Ljava/lang/Object;
   L0
    LINENUMBER 13 L0
    ALOAD 1
    ICONST_3
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKESTATIC org/codehaus/groovy/runtime/StringGroovyMethods.multiply (Ljava/lang/CharSequence;Ljava/lang/Number;)Ljava/lang/String;
    ASTORE 2
   L1
    ALOAD 2
    POP
   L2
    LINENUMBER 14 L2
    ALOAD 2
    LDC "G*"
    INVOKEVIRTUAL java/lang/String.contains (Ljava/lang/CharSequence;)Z
    INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
    ARETURN
   L3
    ACONST_NULL
    ARETURN
    LOCALVARIABLE this LMyClass; L0 L3 0
    LOCALVARIABLE target Ljava/lang/String; L0 L3 1
    LOCALVARIABLE result Ljava/lang/String; L1 L3 2
    MAXSTACK = 2
    MAXLOCALS = 3

  // access flags 0x1
  public hoge(Ljava/lang/Object;)I
  @Lorg/codehaus/groovy/transform/trait/Traits$TraitBridge;(traitClass=MyTrait.class, desc="(Ljava/lang/Object;)I")
   L0
    ALOAD 0
    ALOAD 1
    INVOKESTATIC MyTrait$Trait$Helper.hoge (LMyTrait;Ljava/lang/Object;)I
    IRETURN
   L1
    LDC 0
    IRETURN
    LOCALVARIABLE this LMyClass; L0 L1 0
    LOCALVARIABLE arg1 Ljava/lang/Object; L0 L1 1
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic MyTraittrait$super$hoge(Ljava/lang/Object;)I
   L0
    ALOAD 0
    INSTANCEOF groovy/lang/GeneratedGroovyProxy
    IFEQ L1
    ALOAD 0
    LDC Lgroovy/lang/GeneratedGroovyProxy;.class
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType (Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
    CHECKCAST groovy/lang/GeneratedGroovyProxy
    INVOKEINTERFACE groovy/lang/GeneratedGroovyProxy.getProxyTarget ()Ljava/lang/Object;
    LDC "hoge"
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 1
    AASTORE
    INVOKESTATIC org/codehaus/groovy/runtime/InvokerHelper.invokeMethod (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
    INVOKESTATIC org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.intUnbox (Ljava/lang/Object;)I
    IRETURN
    GOTO L2
   L1
    LDC Ljava/lang/Object;.class
    ALOAD 0
    LDC "hoge"
    CHECKCAST java/lang/String
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 1
    AASTORE
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.invokeMethodOnSuperN (Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;
    INVOKESTATIC org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.intUnbox (Ljava/lang/Object;)I
    IRETURN
   L2
    LDC 0
    IRETURN
    LOCALVARIABLE this LMyClass; L0 L2 0
    LOCALVARIABLE obj Ljava/lang/Object; L0 L2 1
    MAXSTACK = 7
    MAXLOCALS = 2

  // access flags 0x8
  static <clinit>()V
    LDC LMyClass;.class
    INVOKESTATIC MyTrait$Trait$Helper.$static$init$ (Ljava/lang/Class;)V
    ACONST_NULL
    POP
    RETURN
    MAXSTACK = 1
    MAXLOCALS = 0

  // access flags 0x1004
  protected synthetic $getStaticMetaClass()Lgroovy/lang/MetaClass;
    ALOAD 0
    INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
    LDC LMyClass;.class
    IF_ACMPEQ L0
    ALOAD 0
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass (Ljava/lang/Object;)Lgroovy/lang/MetaClass;
    ARETURN
   L0
    GETSTATIC MyClass.$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 MyClass.$staticClassInfo : Lorg/codehaus/groovy/reflection/ClassInfo;
   L1
    ALOAD 1
    INVOKEVIRTUAL org/codehaus/groovy/reflection/ClassInfo.getMetaClass ()Lgroovy/lang/MetaClass;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic getMetaClass()Lgroovy/lang/MetaClass;
    ALOAD 0
    GETFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    DUP
    IFNULL L0
    ARETURN
   L0
    POP
    ALOAD 0
    DUP
    INVOKEVIRTUAL MyClass.$getStaticMetaClass ()Lgroovy/lang/MetaClass;
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ALOAD 0
    GETFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1001
  public synthetic setMetaClass(Lgroovy/lang/MetaClass;)V
    ALOAD 0
    ALOAD 1
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    RETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic invokeMethod(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
    ALOAD 0
    INVOKEVIRTUAL MyClass.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;
    ARETURN
    MAXSTACK = 4
    MAXLOCALS = 3

  // access flags 0x1001
  public synthetic getProperty(Ljava/lang/String;)Ljava/lang/Object;
    ALOAD 0
    INVOKEVIRTUAL MyClass.getMetaClass ()Lgroovy/lang/MetaClass;
    ALOAD 0
    ALOAD 1
    INVOKEINTERFACE groovy/lang/MetaClass.getProperty (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
    ARETURN
    MAXSTACK = 3
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic setProperty(Ljava/lang/String;Ljava/lang/Object;)V
    ALOAD 0
    INVOKEVIRTUAL MyClass.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
    RETURN
    MAXSTACK = 4
    MAXLOCALS = 3
}

MyTrait=なし, MyClass=CompileStatic

// class version 49.0 (49)
// access flags 0x21
public class MyClass implements MyTrait groovy/lang/GroovyObject  {

  // compiled from: script1521871992377.groovy

  // access flags 0x100A
  private static synthetic Lorg/codehaus/groovy/reflection/ClassInfo; $staticClassInfo

  // access flags 0x1089
  public static transient synthetic Z __$stMC

  // access flags 0x1082
  private transient synthetic Lgroovy/lang/MetaClass; metaClass

  // access flags 0x1
  public <init>()V
   L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    ALOAD 0
    INVOKEVIRTUAL MyClass.$getStaticMetaClass ()Lgroovy/lang/MetaClass;
    ASTORE 1
    ALOAD 1
    ALOAD 0
    SWAP
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ALOAD 1
    POP
    ALOAD 0
    INVOKESTATIC MyTrait$Trait$Helper.$init$ (LMyTrait;)V
    ACONST_NULL
    POP
   L1
    RETURN
    LOCALVARIABLE this LMyClass; L0 L1 0
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1
  public fooMethod(Ljava/lang/String;)Ljava/lang/Object;
   L0
    LINENUMBER 13 L0
    ALOAD 1
    ICONST_3
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKESTATIC org/codehaus/groovy/runtime/StringGroovyMethods.multiply (Ljava/lang/CharSequence;Ljava/lang/Number;)Ljava/lang/String;
    ASTORE 2
   L1
    ALOAD 2
    POP
   L2
    LINENUMBER 14 L2
    ALOAD 2
    LDC "G*"
    INVOKEVIRTUAL java/lang/String.contains (Ljava/lang/CharSequence;)Z
    INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
    ARETURN
   L3
    ACONST_NULL
    ARETURN
    LOCALVARIABLE this LMyClass; L0 L3 0
    LOCALVARIABLE target Ljava/lang/String; L0 L3 1
    LOCALVARIABLE result Ljava/lang/String; L1 L3 2
    MAXSTACK = 2
    MAXLOCALS = 3

  // access flags 0x1
  public hoge(Ljava/lang/Object;)I
  @Lorg/codehaus/groovy/transform/trait/Traits$TraitBridge;(traitClass=MyTrait.class, desc="(Ljava/lang/Object;)I")
   L0
    ALOAD 0
    ALOAD 1
    INVOKESTATIC MyTrait$Trait$Helper.hoge (LMyTrait;Ljava/lang/Object;)I
    IRETURN
   L1
    LDC 0
    IRETURN
    LOCALVARIABLE this LMyClass; L0 L1 0
    LOCALVARIABLE arg1 Ljava/lang/Object; L0 L1 1
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic MyTraittrait$super$hoge(Ljava/lang/Object;)I
   L0
    ALOAD 0
    INSTANCEOF groovy/lang/GeneratedGroovyProxy
    IFEQ L1
    ALOAD 0
    LDC Lgroovy/lang/GeneratedGroovyProxy;.class
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType (Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
    CHECKCAST groovy/lang/GeneratedGroovyProxy
    INVOKEINTERFACE groovy/lang/GeneratedGroovyProxy.getProxyTarget ()Ljava/lang/Object;
    LDC "hoge"
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 1
    AASTORE
    INVOKESTATIC org/codehaus/groovy/runtime/InvokerHelper.invokeMethod (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
    INVOKESTATIC org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.intUnbox (Ljava/lang/Object;)I
    IRETURN
    GOTO L2
   L1
    LDC Ljava/lang/Object;.class
    ALOAD 0
    LDC "hoge"
    CHECKCAST java/lang/String
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 1
    AASTORE
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.invokeMethodOnSuperN (Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;
    INVOKESTATIC org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.intUnbox (Ljava/lang/Object;)I
    IRETURN
   L2
    LDC 0
    IRETURN
    LOCALVARIABLE this LMyClass; L0 L2 0
    LOCALVARIABLE obj Ljava/lang/Object; L0 L2 1
    MAXSTACK = 7
    MAXLOCALS = 2

  // access flags 0x8
  static <clinit>()V
    LDC LMyClass;.class
    INVOKESTATIC MyTrait$Trait$Helper.$static$init$ (Ljava/lang/Class;)V
    ACONST_NULL
    POP
    RETURN
    MAXSTACK = 1
    MAXLOCALS = 0

  // access flags 0x1004
  protected synthetic $getStaticMetaClass()Lgroovy/lang/MetaClass;
    ALOAD 0
    INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
    LDC LMyClass;.class
    IF_ACMPEQ L0
    ALOAD 0
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass (Ljava/lang/Object;)Lgroovy/lang/MetaClass;
    ARETURN
   L0
    GETSTATIC MyClass.$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 MyClass.$staticClassInfo : Lorg/codehaus/groovy/reflection/ClassInfo;
   L1
    ALOAD 1
    INVOKEVIRTUAL org/codehaus/groovy/reflection/ClassInfo.getMetaClass ()Lgroovy/lang/MetaClass;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic getMetaClass()Lgroovy/lang/MetaClass;
    ALOAD 0
    GETFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    DUP
    IFNULL L0
    ARETURN
   L0
    POP
    ALOAD 0
    DUP
    INVOKEVIRTUAL MyClass.$getStaticMetaClass ()Lgroovy/lang/MetaClass;
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ALOAD 0
    GETFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1001
  public synthetic setMetaClass(Lgroovy/lang/MetaClass;)V
    ALOAD 0
    ALOAD 1
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    RETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic invokeMethod(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
    ALOAD 0
    INVOKEVIRTUAL MyClass.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;
    ARETURN
    MAXSTACK = 4
    MAXLOCALS = 3

  // access flags 0x1001
  public synthetic getProperty(Ljava/lang/String;)Ljava/lang/Object;
    ALOAD 0
    INVOKEVIRTUAL MyClass.getMetaClass ()Lgroovy/lang/MetaClass;
    ALOAD 0
    ALOAD 1
    INVOKEINTERFACE groovy/lang/MetaClass.getProperty (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
    ARETURN
    MAXSTACK = 3
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic setProperty(Ljava/lang/String;Ljava/lang/Object;)V
    ALOAD 0
    INVOKEVIRTUAL MyClass.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
    RETURN
    MAXSTACK = 4
    MAXLOCALS = 3
}

MyTrait=なし, MyClass=なし

// class version 49.0 (49)
// access flags 0x21
public class MyClass implements MyTrait groovy/lang/GroovyObject  {

  // compiled from: script1521872006904.groovy

  // access flags 0x100A
  private static synthetic Lorg/codehaus/groovy/reflection/ClassInfo; $staticClassInfo

  // access flags 0x1089
  public static transient synthetic Z __$stMC

  // access flags 0x1082
  private transient synthetic Lgroovy/lang/MetaClass; metaClass

  // access flags 0x100A
  private static synthetic Ljava/lang/ref/SoftReference; $callSiteArray

  // access flags 0x1
  public <init>()V
   L0
    INVOKESTATIC MyClass.$getCallSiteArray ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
    ASTORE 1
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    ALOAD 0
    INVOKEVIRTUAL MyClass.$getStaticMetaClass ()Lgroovy/lang/MetaClass;
    ASTORE 2
    ALOAD 2
    ALOAD 0
    SWAP
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ALOAD 2
    POP
    ALOAD 1
    LDC 0
    AALOAD
    LDC LMyTrait$Trait$Helper;.class
    ALOAD 0
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    POP
   L1
    RETURN
    LOCALVARIABLE this LMyClass; L0 L1 0
    MAXSTACK = 3
    MAXLOCALS = 3

  // access flags 0x1
  public fooMethod(Ljava/lang/String;)Ljava/lang/Object;
   L0
    INVOKESTATIC MyClass.$getCallSiteArray ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
    ASTORE 2
   L1
    LINENUMBER 13 L1
    ALOAD 2
    LDC 1
    AALOAD
    ALOAD 1
    ICONST_3
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ASTORE 3
   L2
    ALOAD 3
    POP
   L3
    LINENUMBER 14 L3
    ALOAD 2
    LDC 2
    AALOAD
    ALOAD 3
    LDC "G*"
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    ARETURN
   L4
    ACONST_NULL
    ARETURN
    LOCALVARIABLE this LMyClass; L0 L4 0
    LOCALVARIABLE target Ljava/lang/String; L0 L4 1
    LOCALVARIABLE result Ljava/lang/Object; L2 L4 3
    MAXSTACK = 3
    MAXLOCALS = 4

  // access flags 0x1
  public hoge(Ljava/lang/Object;)I
  @Lorg/codehaus/groovy/transform/trait/Traits$TraitBridge;(traitClass=MyTrait.class, desc="(Ljava/lang/Object;)I")
   L0
    INVOKESTATIC MyClass.$getCallSiteArray ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
    ASTORE 2
    ALOAD 2
    LDC 3
    AALOAD
    LDC LMyTrait$Trait$Helper;.class
    ALOAD 0
    ALOAD 1
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    INVOKESTATIC org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.intUnbox (Ljava/lang/Object;)I
    IRETURN
   L1
    LDC 0
    IRETURN
    LOCALVARIABLE this LMyClass; L0 L1 0
    LOCALVARIABLE arg1 Ljava/lang/Object; L0 L1 1
    MAXSTACK = 4
    MAXLOCALS = 3

  // access flags 0x1001
  public synthetic MyTraittrait$super$hoge(Ljava/lang/Object;)I
   L0
    INVOKESTATIC MyClass.$getCallSiteArray ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
    ASTORE 2
    ALOAD 0
    INSTANCEOF groovy/lang/GeneratedGroovyProxy
    IFEQ L1
    ALOAD 2
    LDC 4
    AALOAD
    LDC Lorg/codehaus/groovy/runtime/InvokerHelper;.class
    ALOAD 2
    LDC 5
    AALOAD
    ALOAD 0
    LDC Lgroovy/lang/GeneratedGroovyProxy;.class
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType (Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
    CHECKCAST groovy/lang/GeneratedGroovyProxy
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;)Ljava/lang/Object;
    LDC "hoge"
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 1
    AASTORE
    INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.callStatic (Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    INVOKESTATIC org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.intUnbox (Ljava/lang/Object;)I
    IRETURN
    GOTO L2
   L1
    LDC Ljava/lang/Object;.class
    ALOAD 0
    LDC "hoge"
    CHECKCAST java/lang/String
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 1
    AASTORE
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.invokeMethodOnSuperN (Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;
    INVOKESTATIC org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.intUnbox (Ljava/lang/Object;)I
    IRETURN
   L2
    LDC 0
    IRETURN
    LOCALVARIABLE this LMyClass; L0 L2 0
    LOCALVARIABLE obj Ljava/lang/Object; L0 L2 1
    MAXSTACK = 8
    MAXLOCALS = 3

  // access flags 0x8
  static <clinit>()V
    LDC LMyClass;.class
    INVOKESTATIC MyTrait$Trait$Helper.$static$init$ (Ljava/lang/Class;)V
    ACONST_NULL
    POP
    RETURN
    MAXSTACK = 1
    MAXLOCALS = 0

  // access flags 0x1004
  protected synthetic $getStaticMetaClass()Lgroovy/lang/MetaClass;
    ALOAD 0
    INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
    LDC LMyClass;.class
    IF_ACMPEQ L0
    ALOAD 0
    INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass (Ljava/lang/Object;)Lgroovy/lang/MetaClass;
    ARETURN
   L0
    GETSTATIC MyClass.$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 MyClass.$staticClassInfo : Lorg/codehaus/groovy/reflection/ClassInfo;
   L1
    ALOAD 1
    INVOKEVIRTUAL org/codehaus/groovy/reflection/ClassInfo.getMetaClass ()Lgroovy/lang/MetaClass;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic getMetaClass()Lgroovy/lang/MetaClass;
    ALOAD 0
    GETFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    DUP
    IFNULL L0
    ARETURN
   L0
    POP
    ALOAD 0
    DUP
    INVOKEVIRTUAL MyClass.$getStaticMetaClass ()Lgroovy/lang/MetaClass;
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ALOAD 0
    GETFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    ARETURN
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1001
  public synthetic setMetaClass(Lgroovy/lang/MetaClass;)V
    ALOAD 0
    ALOAD 1
    PUTFIELD MyClass.metaClass : Lgroovy/lang/MetaClass;
    RETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic invokeMethod(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
    ALOAD 0
    INVOKEVIRTUAL MyClass.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;
    ARETURN
    MAXSTACK = 4
    MAXLOCALS = 3

  // access flags 0x1001
  public synthetic getProperty(Ljava/lang/String;)Ljava/lang/Object;
    ALOAD 0
    INVOKEVIRTUAL MyClass.getMetaClass ()Lgroovy/lang/MetaClass;
    ALOAD 0
    ALOAD 1
    INVOKEINTERFACE groovy/lang/MetaClass.getProperty (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
    ARETURN
    MAXSTACK = 3
    MAXLOCALS = 2

  // access flags 0x1001
  public synthetic setProperty(Ljava/lang/String;Ljava/lang/Object;)V
    ALOAD 0
    INVOKEVIRTUAL MyClass.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
    RETURN
    MAXSTACK = 4
    MAXLOCALS = 3

  // access flags 0x100A
  private static synthetic $createCallSiteArray_1([Ljava/lang/String;)V
    ALOAD 0
    LDC 0
    LDC "$init$"
    AASTORE
    ALOAD 0
    LDC 1
    LDC "multiply"
    AASTORE
    ALOAD 0
    LDC 2
    LDC "contains"
    AASTORE
    ALOAD 0
    LDC 3
    LDC "hoge"
    AASTORE
    ALOAD 0
    LDC 4
    LDC "invokeMethod"
    AASTORE
    ALOAD 0
    LDC 5
    LDC "getProxyTarget"
    AASTORE
    RETURN
    MAXSTACK = 3
    MAXLOCALS = 1

  // access flags 0x100A
  private static synthetic $createCallSiteArray()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray;
    LDC 6
    ANEWARRAY java/lang/String
    ASTORE 0
    ALOAD 0
    INVOKESTATIC MyClass.$createCallSiteArray_1 ([Ljava/lang/String;)V
    NEW org/codehaus/groovy/runtime/callsite/CallSiteArray
    DUP
    LDC LMyClass;.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 MyClass.$callSiteArray : Ljava/lang/ref/SoftReference;
    IFNULL L0
    GETSTATIC MyClass.$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
    INVOKESTATIC MyClass.$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 MyClass.$callSiteArray : Ljava/lang/ref/SoftReference;
   L1
    ALOAD 0
    GETFIELD org/codehaus/groovy/runtime/callsite/CallSiteArray.array : [Lorg/codehaus/groovy/runtime/callsite/CallSite;
    ARETURN
    MAXSTACK = 3
    MAXLOCALS = 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment