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)