You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/04/12 02:02:37 UTC

[groovy] branch GROOVY-10031 created (now 9363980)

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a change to branch GROOVY-10031
in repository https://gitbox.apache.org/repos/asf/groovy.git.


      at 9363980  GROOVY-10031: write NEWARRAY/ANEWARRAY for all single-dimensional arrays

This branch includes the following new commits:

     new 9363980  GROOVY-10031: write NEWARRAY/ANEWARRAY for all single-dimensional arrays

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[groovy] 01/01: GROOVY-10031: write NEWARRAY/ANEWARRAY for all single-dimensional arrays

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY-10031
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 93639802e3ea118a1129207b5b28acef70e90e01
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Apr 11 20:57:53 2021 -0500

    GROOVY-10031: write NEWARRAY/ANEWARRAY for all single-dimensional arrays
---
 .../groovy/classgen/AsmClassGenerator.java         | 16 ++---
 src/test/groovy/MultiDimArraysTest.groovy          | 79 +++++++++++++---------
 2 files changed, 55 insertions(+), 40 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index bfbd856..0617092 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -1643,8 +1643,6 @@ public class AsmClassGenerator extends ClassGenerator {
     @Override
     public void visitArrayExpression(final ArrayExpression expression) {
         MethodVisitor mv = controller.getMethodVisitor();
-        ClassNode elementType = expression.getElementType();
-        String arrayTypeName = BytecodeHelper.getClassInternalName(elementType);
 
         int size = 0;
         int dimensions = 0;
@@ -1655,15 +1653,18 @@ public class AsmClassGenerator extends ClassGenerator {
             for (Expression element : expression.getSizeExpression()) {
                 if (element == ConstantExpression.EMPTY_EXPRESSION) break;
                 dimensions += 1;
-                // let's convert to an int
+                // convert to an int
                 element.visit(this);
                 controller.getOperandStack().doGroovyCast(ClassHelper.int_TYPE);
             }
             controller.getOperandStack().remove(dimensions);
         }
 
+        ClassNode arrayType = expression.getType();
+        ClassNode elementType = arrayType.getComponentType();
+
         int storeIns = AASTORE;
-        if (expression.hasInitializer()) {
+        if (!elementType.isArray() || expression.hasInitializer()) {
             if (ClassHelper.isPrimitiveType(elementType)) {
                 int primType = 0;
                 if (elementType == ClassHelper.boolean_TYPE) {
@@ -1693,11 +1694,10 @@ public class AsmClassGenerator extends ClassGenerator {
                 }
                 mv.visitIntInsn(NEWARRAY, primType);
             } else {
-                mv.visitTypeInsn(ANEWARRAY, arrayTypeName);
+                mv.visitTypeInsn(ANEWARRAY, BytecodeHelper.getClassInternalName(elementType));
             }
         } else {
-            arrayTypeName = BytecodeHelper.getTypeDescription(expression.getType());
-            mv.visitMultiANewArrayInsn(arrayTypeName, dimensions);
+            mv.visitMultiANewArrayInsn(BytecodeHelper.getTypeDescription(arrayType), dimensions);
         }
 
         for (int i = 0; i < size; i += 1) {
@@ -1714,7 +1714,7 @@ public class AsmClassGenerator extends ClassGenerator {
             controller.getOperandStack().remove(1);
         }
 
-        controller.getOperandStack().push(expression.getType());
+        controller.getOperandStack().push(arrayType);
     }
 
     @Override
diff --git a/src/test/groovy/MultiDimArraysTest.groovy b/src/test/groovy/MultiDimArraysTest.groovy
index 8e2d22d..28a77bc 100644
--- a/src/test/groovy/MultiDimArraysTest.groovy
+++ b/src/test/groovy/MultiDimArraysTest.groovy
@@ -26,58 +26,73 @@ import groovy.test.GroovyTestCase
 class MultiDimArraysTest extends GroovyTestCase {
 
     void testCallTwoDimStringArray() {
-        def someArrayOfStringArrays = new SomeClass().anArrayOfStringArrays()
-        assert 1 == someArrayOfStringArrays.size()
-        assert someArrayOfStringArrays[0][0] == 'whatever'
+        assertScript '''
+            def someArrayOfStringArrays = new groovy.SomeClass().anArrayOfStringArrays()
+            assert 1 == someArrayOfStringArrays.size()
+            assert someArrayOfStringArrays[0][0] == 'whatever'
+        '''
     }
 
     void testCallTwoDimStringArrayWorkaround() {
-        def someArrayOfStringArrays = new SomeClass().anArrayOfStringArraysWorkaround()
-        assert 1 == someArrayOfStringArrays.size()
-        assert "whatever" == someArrayOfStringArrays[0][0]
-        for (i in 0..<someArrayOfStringArrays.size()) {
-            assert someArrayOfStringArrays[i]
-        }
+        assertScript '''
+            def someArrayOfStringArrays = new groovy.SomeClass().anArrayOfStringArraysWorkaround()
+            assert 1 == someArrayOfStringArrays.size()
+            assert "whatever" == someArrayOfStringArrays[0][0]
+            for (i in 0..<someArrayOfStringArrays.size()) {
+                assert someArrayOfStringArrays[i]
+            }
+        '''
     }
 
     void testCallTwoDimStringArrayWorkaroundWithNull() {
-        def someArrayOfStringArrays = new SomeClass().anArrayOfStringArraysWorkaround()
-        assert 1 == someArrayOfStringArrays.size()
-        assert "whatever" == someArrayOfStringArrays[0][0]
-        someArrayOfStringArrays.each() { assert it }
+        assertScript '''
+            def someArrayOfStringArrays = new groovy.SomeClass().anArrayOfStringArraysWorkaround()
+            assert 1 == someArrayOfStringArrays.size()
+            assert "whatever" == someArrayOfStringArrays[0][0]
+            someArrayOfStringArrays.each() { assert it }
+        '''
     }
 
     void testInsideGroovyMultiDimReplacement() {
-        Object[] someArrayOfStringArrays = [["a", "a", "a"], ["b", "b", "b", null]]
-        assert "a" == someArrayOfStringArrays[0][0]
-        someArrayOfStringArrays.each() { assert it }
+        assertScript '''
+            Object[] someArrayOfStringArrays = [["a", "a", "a"], ["b", "b", "b", null]]
+            assert "a" == someArrayOfStringArrays[0][0]
+            someArrayOfStringArrays.each() { assert it }
+        '''
     }
 
     void testMultiDimCreationWithSizes() {
-        Object[][] objectArray = new Object[2][5]
-        assert objectArray.length == 2
-        objectArray.each {
-            assert it.length == 5
-            it.each { assert it == null }
-        }
+        assertScript '''
+            Object[][] objectArray = new Object[2][5]
+            assert objectArray.length == 2
+            objectArray.each {
+                assert it.length == 5
+                it.each { assert it == null }
+            }
+        '''
     }
 
     void testMultiDimCreationWithoutSizeAtEnd() {
-        def array = new int[5][6][]
-        assert array.class.name == "[[[I"
-        assert array[0].class.name == "[[I"
-        assert array[0][0] == null
+        assertScript '''
+            def array = new int[5][6][]
+            assert array.class.name == "[[[I"
+            assert array[0].class.name == "[[I"
+            assert array[0][0] == null
+        '''
     }
 
     void testMultiDimArrayForCustomClass() {
-        def ff = new MultiDimArraysTest[3][4]
-        assert "[[Lgroovy.MultiDimArraysTest;" == ff.class.name;
+        assertScript '''
+            def arr = new groovy.MultiDimArraysTest[3][4]
+            assert arr.class.name == '[[Lgroovy.MultiDimArraysTest;'
+        '''
     }
 
     void testIntArrayIncrement() {
-        int[][] x = new int[10][10]
-        x[1][1] += 5
-        assert x[1][1] == 5
+        assertScript '''
+            int[][] x = new int[10][10]
+            x[1][1] += 5
+            assert x[1][1] == 5
+        '''
     }
 }
-