Bytecode Analysis for script: PersonScript

        class Person {
    String first
    String last
}

Person p = new Person()
p.first = 'Jenn'
p.last = 'Strater'

      
Groovyc Indy Static
Lines Removed 6 6 8
Total Lines - Before 253 170 161
Percentage of Lines Removed 2.4 3.5 5.0

Benchmarks

For parameter: null

Groovyc Indy Static
Benchmark Average - Before 386 422 344
Benchmark Average - After 401 432 331
Benchmark Std Dev - Before 4.86 10.26 15.52
Benchmark Std Dev - After 14.96 12.13 7.67

BEFORE

Groovyc (Legacy)

          Compiled from "PersonScript.groovy"
public class PersonScript extends groovy.lang.Script {
  public static transient boolean __$stMC;

  public PersonScript();
    Code:
       0: aload_0
       1: invokespecial #13                 // Method groovy/lang/Script."<init>":()V
       4: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       7: astore_1
       8: return

  public PersonScript(groovy.lang.Binding);
    Code:
       0: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_2
       4: aload_0
       5: aload_1
       6: invokespecial #22                 // Method groovy/lang/Script."<init>":(Lgroovy/lang/Binding;)V
       9: return

  public static void main(java.lang.String...);
    Code:
       0: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_1
       4: aload_1
       5: ldc           #27                 // int 0
       7: aaload
       8: ldc           #29                 // class org/codehaus/groovy/runtime/InvokerHelper
      10: ldc           #2                  // class PersonScript
      12: aload_0
      13: invokeinterface #35,  4           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.call:(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
      18: pop
      19: return

  public java.lang.Object run();
    Code:
       0: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_1
       4: aload_1
       5: ldc           #40                 // int 1
       7: aaload
       8: ldc           #42                 // class Person
      10: invokeinterface #46,  2           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.callConstructor:(Ljava/lang/Object;)Ljava/lang/Object;
      15: ldc           #42                 // class Person
      17: invokestatic  #52                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
      20: checkcast     #42                 // class Person
      23: astore_2
      24: aload_2
      25: pop
      26: ldc           #54                 // String Jenn
      28: astore_3
      29: aload_3
      30: ldc           #2                  // class PersonScript
      32: aload_2
      33: ldc           #56                 // String first
      35: checkcast     #58                 // class java/lang/String
      38: invokestatic  #62                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.setGroovyObjectProperty:(Ljava/lang/Object;Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)V
      41: aload_3
      42: pop
      43: ldc           #64                 // String Strater
      45: astore        4
      47: aload         4
      49: ldc           #2                  // class PersonScript
      51: aload_2
      52: ldc           #66                 // String last
      54: checkcast     #58                 // class java/lang/String
      57: invokestatic  #62                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.setGroovyObjectProperty:(Ljava/lang/Object;Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)V
      60: aload         4
      62: areturn
      63: aconst_null
      64: areturn

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #76                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class PersonScript
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #80                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #82                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #76                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #88                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #82                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #91                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

Invoke Dynamic

          Compiled from "PersonScript.groovy"
public class PersonScript extends groovy.lang.Script {
  public static transient boolean __$stMC;

  public PersonScript();
    Code:
       0: aload_0
       1: invokespecial #13                 // Method groovy/lang/Script."<init>":()V
       4: return

  public PersonScript(groovy.lang.Binding);
    Code:
       0: aload_0
       1: aload_1
       2: invokespecial #18                 // Method groovy/lang/Script."<init>":(Lgroovy/lang/Binding;)V
       5: return

  public static void main(java.lang.String...);
    Code:
       0: ldc           #24                 // class org/codehaus/groovy/runtime/InvokerHelper
       2: ldc           #2                  // class PersonScript
       4: aload_0
       5: invokedynamic #38,  0             // InvokeDynamic #0:invoke:(Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/String;)Ljava/lang/Object;
      10: pop
      11: return

  public java.lang.Object run();
    Code:
       0: ldc           #44                 // class Person
       2: invokedynamic #49,  0             // InvokeDynamic #1:init:(Ljava/lang/Class;)Ljava/lang/Object;
       7: invokedynamic #55,  0             // InvokeDynamic #2:cast:(Ljava/lang/Object;)LPerson;
      12: astore_1
      13: aload_1
      14: pop
      15: ldc           #57                 // String Jenn
      17: astore_2
      18: aload_2
      19: ldc           #2                  // class PersonScript
      21: aload_1
      22: ldc           #59                 // String first
      24: checkcast     #61                 // class java/lang/String
      27: invokestatic  #67                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.setGroovyObjectProperty:(Ljava/lang/Object;Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)V
      30: aload_2
      31: pop
      32: ldc           #69                 // String Strater
      34: astore_3
      35: aload_3
      36: ldc           #2                  // class PersonScript
      38: aload_1
      39: ldc           #71                 // String last
      41: checkcast     #61                 // class java/lang/String
      44: invokestatic  #67                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.setGroovyObjectProperty:(Ljava/lang/Object;Ljava/lang/Class;Lgroovy/lang/GroovyObject;Ljava/lang/String;)V
      47: aload_3
      48: areturn
      49: nop
      50: athrow

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #83                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class PersonScript
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #87                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #89                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #83                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #95                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #89                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #98                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

Static Compilation

          Compiled from "PersonScript.groovy"
public class PersonScript extends groovy.lang.Script {
  public static transient boolean __$stMC;

  public PersonScript();
    Code:
       0: aload_0
       1: invokespecial #13                 // Method groovy/lang/Script."<init>":()V
       4: return

  public PersonScript(groovy.lang.Binding);
    Code:
       0: aload_0
       1: aload_1
       2: invokespecial #18                 // Method groovy/lang/Script."<init>":(Lgroovy/lang/Binding;)V
       5: return

  public static void main(java.lang.String...);
    Code:
       0: ldc           #2                  // class PersonScript
       2: aload_0
       3: invokestatic  #28                 // Method org/codehaus/groovy/runtime/InvokerHelper.runScript:(Ljava/lang/Class;[Ljava/lang/String;)Ljava/lang/Object;
       6: pop
       7: return

  public java.lang.Object run();
    Code:
       0: new           #34                 // class Person
       3: dup
       4: invokespecial #35                 // Method Person."<init>":()V
       7: astore_1
       8: aload_1
       9: pop
      10: ldc           #37                 // String Jenn
      12: dup
      13: astore_2
      14: aload_1
      15: aload_2
      16: invokevirtual #41                 // Method Person.setFirst:(Ljava/lang/String;)V
      19: aconst_null
      20: pop
      21: pop
      22: ldc           #43                 // String Strater
      24: dup
      25: astore_3
      26: aload_1
      27: aload_3
      28: invokevirtual #46                 // Method Person.setLast:(Ljava/lang/String;)V
      31: aconst_null
      32: pop
      33: areturn
      34: aconst_null
      35: areturn

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #56                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class PersonScript
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #62                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #64                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #56                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #70                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #64                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #73                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

AFTER

Groovyc (Legacy)

          Compiled from "PersonScript.groovy"
public class Person implements groovy.lang.GroovyObject {
  public static transient boolean __$stMC;

  public Person();
    Code:
       0: aload_0
       1: invokespecial #22                 // Method java/lang/Object."<init>":()V
       4: invokestatic  #26                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       7: astore_1
       8: aload_0
       9: invokevirtual #30                 // Method $getStaticMetaClass:()Lgroovy/lang/MetaClass;
      12: astore_2
      13: aload_2
      14: aload_0
      15: swap
      16: putfield      #32                 // Field metaClass:Lgroovy/lang/MetaClass;
      19: return

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #38                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class Person
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #44                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #46                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #38                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #52                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #46                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #55                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn

  public groovy.lang.MetaClass getMetaClass();
    Code:
       0: aload_0
       1: getfield      #32                 // Field metaClass:Lgroovy/lang/MetaClass;
       4: dup
       5: ifnull        9
       8: areturn
       9: pop
      10: aload_0
      11: dup
      12: invokevirtual #30                 // Method $getStaticMetaClass:()Lgroovy/lang/MetaClass;
      15: putfield      #32                 // Field metaClass:Lgroovy/lang/MetaClass;
      18: aload_0
      19: getfield      #32                 // Field metaClass:Lgroovy/lang/MetaClass;
      22: areturn

  public void setMetaClass(groovy.lang.MetaClass);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #32                 // Field metaClass:Lgroovy/lang/MetaClass;
       5: return

  public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
    Code:
       0: aload_0
       1: invokevirtual #60                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: aload_2
       7: invokeinterface #65,  4           // InterfaceMethod groovy/lang/MetaClass.invokeMethod:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
      12: areturn

  public java.lang.Object getProperty(java.lang.String);
    Code:
       0: aload_0
       1: invokevirtual #60                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: invokeinterface #70,  3           // InterfaceMethod groovy/lang/MetaClass.getProperty:(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
      11: areturn

  public void setProperty(java.lang.String, java.lang.Object);
    Code:
       0: aload_0
       1: invokevirtual #60                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: aload_2
       7: invokeinterface #75,  4           // InterfaceMethod groovy/lang/MetaClass.setProperty:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V
      12: return

  public java.lang.String getFirst();
    Code:
       0: aload_0
       1: getfield      #79                 // Field first:Ljava/lang/String;
       4: areturn

  public void setFirst(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #79                 // Field first:Ljava/lang/String;
       5: return

  public java.lang.String getLast();
    Code:
       0: aload_0
       1: getfield      #84                 // Field last:Ljava/lang/String;
       4: areturn

  public void setLast(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #84                 // Field last:Ljava/lang/String;
       5: return
}

        

Invoke Dynamic

          Compiled from "PersonScript.groovy"
public class Person implements groovy.lang.GroovyObject {
  public static transient boolean __$stMC;

  public Person();
    Code:
       0: aload_0
       1: invokespecial #20                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: invokevirtual #24                 // Method $getStaticMetaClass:()Lgroovy/lang/MetaClass;
       8: astore_1
       9: aload_1
      10: aload_0
      11: swap
      12: putfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
      15: return

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #32                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class Person
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #38                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #40                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #32                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #46                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #40                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #49                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn

  public groovy.lang.MetaClass getMetaClass();
    Code:
       0: aload_0
       1: getfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
       4: dup
       5: ifnull        9
       8: areturn
       9: pop
      10: aload_0
      11: dup
      12: invokevirtual #24                 // Method $getStaticMetaClass:()Lgroovy/lang/MetaClass;
      15: putfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
      18: aload_0
      19: getfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
      22: areturn

  public void setMetaClass(groovy.lang.MetaClass);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
       5: return

  public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
    Code:
       0: aload_0
       1: invokevirtual #56                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: aload_2
       7: invokeinterface #59,  4           // InterfaceMethod groovy/lang/MetaClass.invokeMethod:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
      12: areturn

  public java.lang.Object getProperty(java.lang.String);
    Code:
       0: aload_0
       1: invokevirtual #56                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: invokeinterface #64,  3           // InterfaceMethod groovy/lang/MetaClass.getProperty:(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
      11: areturn

  public void setProperty(java.lang.String, java.lang.Object);
    Code:
       0: aload_0
       1: invokevirtual #56                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: aload_2
       7: invokeinterface #69,  4           // InterfaceMethod groovy/lang/MetaClass.setProperty:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V
      12: return

  public java.lang.String getFirst();
    Code:
       0: aload_0
       1: getfield      #73                 // Field first:Ljava/lang/String;
       4: areturn

  public void setFirst(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #73                 // Field first:Ljava/lang/String;
       5: return

  public java.lang.String getLast();
    Code:
       0: aload_0
       1: getfield      #78                 // Field last:Ljava/lang/String;
       4: areturn

  public void setLast(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #78                 // Field last:Ljava/lang/String;
       5: return
}

        

Static Compilation

          Compiled from "PersonScript.groovy"
public class Person implements groovy.lang.GroovyObject {
  public static transient boolean __$stMC;

  public Person();
    Code:
       0: aload_0
       1: invokespecial #20                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: invokevirtual #24                 // Method $getStaticMetaClass:()Lgroovy/lang/MetaClass;
       8: astore_1
       9: aload_1
      10: aload_0
      11: swap
      12: putfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
      15: return

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #32                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class Person
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #38                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #40                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #32                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #46                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #40                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #49                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn

  public groovy.lang.MetaClass getMetaClass();
    Code:
       0: aload_0
       1: getfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
       4: dup
       5: ifnull        9
       8: areturn
       9: pop
      10: aload_0
      11: dup
      12: invokevirtual #24                 // Method $getStaticMetaClass:()Lgroovy/lang/MetaClass;
      15: putfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
      18: aload_0
      19: getfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
      22: areturn

  public void setMetaClass(groovy.lang.MetaClass);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #26                 // Field metaClass:Lgroovy/lang/MetaClass;
       5: return

  public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
    Code:
       0: aload_0
       1: invokevirtual #54                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: aload_2
       7: invokeinterface #59,  4           // InterfaceMethod groovy/lang/MetaClass.invokeMethod:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
      12: areturn

  public java.lang.Object getProperty(java.lang.String);
    Code:
       0: aload_0
       1: invokevirtual #54                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: invokeinterface #64,  3           // InterfaceMethod groovy/lang/MetaClass.getProperty:(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
      11: areturn

  public void setProperty(java.lang.String, java.lang.Object);
    Code:
       0: aload_0
       1: invokevirtual #54                 // Method getMetaClass:()Lgroovy/lang/MetaClass;
       4: aload_0
       5: aload_1
       6: aload_2
       7: invokeinterface #69,  4           // InterfaceMethod groovy/lang/MetaClass.setProperty:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V
      12: return

  public java.lang.String getFirst();
    Code:
       0: aload_0
       1: getfield      #73                 // Field first:Ljava/lang/String;
       4: areturn

  public void setFirst(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #73                 // Field first:Ljava/lang/String;
       5: return

  public java.lang.String getLast();
    Code:
       0: aload_0
       1: getfield      #78                 // Field last:Ljava/lang/String;
       4: areturn

  public void setLast(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #78                 // Field last:Ljava/lang/String;
       5: return
}