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