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
+ '''
}
}
-