[ 
https://issues.apache.org/jira/browse/GROOVY-11632?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Oscar N updated GROOVY-11632:
-----------------------------
    Description: 
Using the += or << operators to add to a collection involves calls to DGM 
methods and an indy call to cast. 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}

  was:
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}


> 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
>            Priority: Minor
>
> Using the += or << operators to add to a collection involves calls to DGM 
> methods and an indy call to cast. 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