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

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

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

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new a228ca8  GROOVY-10031: write NEWARRAY/ANEWARRAY for all single-dimensional arrays
a228ca8 is described below

commit a228ca8329695452533b087d6ac5948c70952723
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 be5047d..f367735 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -1646,8 +1646,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;
@@ -1658,15 +1656,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) {
@@ -1696,11 +1697,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) {
@@ -1717,7 +1717,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
+        '''
     }
 }
-