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