Oscar N created GROOVY-11632:
--------------------------------

             Summary: Optimise bytecode for list addition
                 Key: GROOVY-11632
                 URL: https://issues.apache.org/jira/browse/GROOVY-11632
             Project: Groovy
          Issue Type: Improvement
    Affects Versions: 5.0.0-alpha-12
            Reporter: Oscar N


Using the += or << operators to add to a collection involves calls to DGM 
methods and an indy call to the cast() metamethod. Having these operators 
directly call Collection#add() when no extension methods are registered would 
avoid some overhead and further improve @POJO support.

{code:groovy}
@CompileStatic
final class ListDeclaration {
    static void main(String[] args) {
        var list = []
        list += "Hello"
        list << "World"
        println list
    }
}
{code}

{code:java}
  // access flags 0x89
  public static varargs main([Ljava/lang/String;)V
   L0
    LINENUMBER 6 L0
    NEW java/util/ArrayList
    DUP
    INVOKESPECIAL java/util/ArrayList.<init> ()V
    ASTORE 1
   L1
    LINENUMBER 7 L1
    ALOAD 1
    LDC "Hello"
    INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.plus 
(Ljava/util/List;Ljava/lang/Object;)Ljava/util/List;
    INVOKEDYNAMIC cast(Ljava/util/List;)Ljava/util/ArrayList; [
      // handle kind 0x6 : INVOKESTATIC
      
org/codehaus/groovy/vmplugin/v8/IndyInterface.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;I)Ljava/lang/invoke/CallSite;
      // arguments:
      "()", 
      0
    ]
    ASTORE 1
   L2
    LINENUMBER 8 L2
    ALOAD 1
    LDC "World"
    INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.leftShift 
(Ljava/util/List;Ljava/lang/Object;)Ljava/util/List;
    POP
   L3
    LINENUMBER 9 L3
    LDC LListDeclaration;.class
    ALOAD 1
    INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.println 
(Ljava/lang/Object;Ljava/lang/Object;)V
    ACONST_NULL
    POP
   L4
    LINENUMBER 10 L4
    RETURN
    LOCALVARIABLE args [Ljava/lang/String; L0 L4 0
    LOCALVARIABLE list Ljava/util/ArrayList; L1 L4 1
    MAXSTACK = 2
    MAXLOCALS = 2
{code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to