Skip to content

Commit 9d6d7ee

Browse files
committed
GROOVY-10031
1 parent 0500084 commit 9d6d7ee

File tree

4 files changed

+150
-5
lines changed

4 files changed

+150
-5
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic/GroovySimpleTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,21 @@ public void testArrayMulti6() {
182182
runConformTest(sources, "[[Ljava.lang.String;");
183183
}
184184

185+
@Test
186+
public void testArrayMulti7() {
187+
//@formatter:off
188+
String[] sources = {
189+
"Script.groovy",
190+
"int[][] array = new int[1][]\n" +
191+
"assert array.length == 1\n" +
192+
"assert array[0] == null\n" +
193+
"print array.class.name\n",
194+
};
195+
//@formatter:on
196+
197+
runConformTest(sources, "[[I");
198+
}
199+
185200
@Test
186201
public void testClosuresBasic() {
187202
//@formatter:off

base/org.codehaus.groovy25/src/org/codehaus/groovy/classgen/AsmClassGenerator.java

+45-1
Original file line numberDiff line numberDiff line change
@@ -1715,8 +1715,10 @@ public void loadWrapper(Expression argument) {
17151715

17161716
public void visitArrayExpression(ArrayExpression expression) {
17171717
MethodVisitor mv = controller.getMethodVisitor();
1718+
/* GRECLIPSE edit
17181719
ClassNode elementType = expression.getElementType();
17191720
String arrayTypeName = BytecodeHelper.getClassInternalName(elementType);
1721+
*/
17201722
List sizeExpression = expression.getSizeExpression();
17211723

17221724
int size = 0;
@@ -1736,6 +1738,7 @@ public void visitArrayExpression(ArrayExpression expression) {
17361738
BytecodeHelper.pushConstant(mv, size);
17371739
}
17381740

1741+
/* GRECLIPSE edit -- GROOVY-10031: use NEWARRAY/ANEWARRAY for flat array
17391742
int storeIns = AASTORE;
17401743
if (sizeExpression != null) {
17411744
arrayTypeName = BytecodeHelper.getTypeDescription(expression.getType());
@@ -1771,6 +1774,47 @@ public void visitArrayExpression(ArrayExpression expression) {
17711774
} else {
17721775
mv.visitTypeInsn(ANEWARRAY, arrayTypeName);
17731776
}
1777+
*/
1778+
ClassNode arrayType = expression.getType();
1779+
ClassNode elementType = arrayType.getComponentType();
1780+
1781+
int storeIns = AASTORE;
1782+
if (!elementType.isArray() || sizeExpression == null) {
1783+
if (ClassHelper.isPrimitiveType(elementType)) {
1784+
int primType = 0;
1785+
if (elementType == ClassHelper.boolean_TYPE) {
1786+
primType = T_BOOLEAN;
1787+
storeIns = BASTORE;
1788+
} else if (elementType == ClassHelper.byte_TYPE) {
1789+
primType = T_BYTE;
1790+
storeIns = BASTORE;
1791+
} else if (elementType == ClassHelper.char_TYPE) {
1792+
primType = T_CHAR;
1793+
storeIns = CASTORE;
1794+
} else if (elementType == ClassHelper.double_TYPE) {
1795+
primType = T_DOUBLE;
1796+
storeIns = DASTORE;
1797+
} else if (elementType == ClassHelper.float_TYPE) {
1798+
primType = T_FLOAT;
1799+
storeIns = FASTORE;
1800+
} else if (elementType == ClassHelper.int_TYPE) {
1801+
primType = T_INT;
1802+
storeIns = IASTORE;
1803+
} else if (elementType == ClassHelper.long_TYPE) {
1804+
primType = T_LONG;
1805+
storeIns = LASTORE;
1806+
} else if (elementType == ClassHelper.short_TYPE) {
1807+
primType = T_SHORT;
1808+
storeIns = SASTORE;
1809+
}
1810+
mv.visitIntInsn(NEWARRAY, primType);
1811+
} else {
1812+
mv.visitTypeInsn(ANEWARRAY, BytecodeHelper.getClassInternalName(elementType));
1813+
}
1814+
} else {
1815+
mv.visitMultiANewArrayInsn(BytecodeHelper.getTypeDescription(arrayType), dimensions);
1816+
}
1817+
// GRECLIPSE end
17741818

17751819
for (int i = 0; i < size; i++) {
17761820
mv.visitInsn(DUP);
@@ -1786,7 +1830,7 @@ public void visitArrayExpression(ArrayExpression expression) {
17861830
controller.getOperandStack().remove(1);
17871831
}
17881832

1789-
controller.getOperandStack().push(expression.getType());
1833+
controller.getOperandStack().push(arrayType);
17901834
}
17911835

17921836
public void visitClosureListExpression(ClosureListExpression expression) {

base/org.codehaus.groovy30/src/org/codehaus/groovy/classgen/AsmClassGenerator.java

+45-2
Original file line numberDiff line numberDiff line change
@@ -1602,9 +1602,10 @@ public void loadWrapper(final Expression argument) {
16021602
@Override
16031603
public void visitArrayExpression(final ArrayExpression expression) {
16041604
MethodVisitor mv = controller.getMethodVisitor();
1605+
/* GRECLIPSE edit
16051606
ClassNode elementType = expression.getElementType();
16061607
String arrayTypeName = BytecodeHelper.getClassInternalName(elementType);
1607-
1608+
*/
16081609
int size = 0;
16091610
int dimensions = 0;
16101611
if (expression.hasInitializer()) {
@@ -1621,6 +1622,7 @@ public void visitArrayExpression(final ArrayExpression expression) {
16211622
controller.getOperandStack().remove(dimensions);
16221623
}
16231624

1625+
/* GRECLIPSE edit -- GROOVY-10031: use NEWARRAY/ANEWARRAY for flat array
16241626
int storeIns = AASTORE;
16251627
if (expression.hasInitializer()) {
16261628
if (ClassHelper.isPrimitiveType(elementType)) {
@@ -1658,6 +1660,47 @@ public void visitArrayExpression(final ArrayExpression expression) {
16581660
arrayTypeName = BytecodeHelper.getTypeDescription(expression.getType());
16591661
mv.visitMultiANewArrayInsn(arrayTypeName, dimensions);
16601662
}
1663+
*/
1664+
ClassNode arrayType = expression.getType();
1665+
ClassNode elementType = arrayType.getComponentType();
1666+
1667+
int storeIns = AASTORE;
1668+
if (!elementType.isArray() || expression.hasInitializer()) {
1669+
if (ClassHelper.isPrimitiveType(elementType)) {
1670+
int primType = 0;
1671+
if (elementType == ClassHelper.boolean_TYPE) {
1672+
primType = T_BOOLEAN;
1673+
storeIns = BASTORE;
1674+
} else if (elementType == ClassHelper.byte_TYPE) {
1675+
primType = T_BYTE;
1676+
storeIns = BASTORE;
1677+
} else if (elementType == ClassHelper.char_TYPE) {
1678+
primType = T_CHAR;
1679+
storeIns = CASTORE;
1680+
} else if (elementType == ClassHelper.double_TYPE) {
1681+
primType = T_DOUBLE;
1682+
storeIns = DASTORE;
1683+
} else if (elementType == ClassHelper.float_TYPE) {
1684+
primType = T_FLOAT;
1685+
storeIns = FASTORE;
1686+
} else if (elementType == ClassHelper.int_TYPE) {
1687+
primType = T_INT;
1688+
storeIns = IASTORE;
1689+
} else if (elementType == ClassHelper.long_TYPE) {
1690+
primType = T_LONG;
1691+
storeIns = LASTORE;
1692+
} else if (elementType == ClassHelper.short_TYPE) {
1693+
primType = T_SHORT;
1694+
storeIns = SASTORE;
1695+
}
1696+
mv.visitIntInsn(NEWARRAY, primType);
1697+
} else {
1698+
mv.visitTypeInsn(ANEWARRAY, BytecodeHelper.getClassInternalName(elementType));
1699+
}
1700+
} else {
1701+
mv.visitMultiANewArrayInsn(BytecodeHelper.getTypeDescription(arrayType), dimensions);
1702+
}
1703+
// GRECLIPSE end
16611704

16621705
for (int i = 0; i < size; i += 1) {
16631706
mv.visitInsn(DUP);
@@ -1673,7 +1716,7 @@ public void visitArrayExpression(final ArrayExpression expression) {
16731716
controller.getOperandStack().remove(1);
16741717
}
16751718

1676-
controller.getOperandStack().push(expression.getType());
1719+
controller.getOperandStack().push(arrayType);
16771720
}
16781721

16791722
@Override

base/org.codehaus.groovy40/src/org/codehaus/groovy/classgen/AsmClassGenerator.java

+45-2
Original file line numberDiff line numberDiff line change
@@ -1669,9 +1669,10 @@ public void loadWrapper(final Expression argument) {
16691669
@Override
16701670
public void visitArrayExpression(final ArrayExpression expression) {
16711671
MethodVisitor mv = controller.getMethodVisitor();
1672+
/* GRECLIPSE edit
16721673
ClassNode elementType = expression.getElementType();
16731674
String arrayTypeName = BytecodeHelper.getClassInternalName(elementType);
1674-
1675+
*/
16751676
int size = 0;
16761677
int dimensions = 0;
16771678
if (expression.hasInitializer()) {
@@ -1688,6 +1689,7 @@ public void visitArrayExpression(final ArrayExpression expression) {
16881689
controller.getOperandStack().remove(dimensions);
16891690
}
16901691

1692+
/* GRECLIPSE edit -- GROOVY-10031: use NEWARRAY/ANEWARRAY for flat array
16911693
int storeIns = AASTORE;
16921694
if (expression.hasInitializer()) {
16931695
if (ClassHelper.isPrimitiveType(elementType)) {
@@ -1725,6 +1727,47 @@ public void visitArrayExpression(final ArrayExpression expression) {
17251727
arrayTypeName = BytecodeHelper.getTypeDescription(expression.getType());
17261728
mv.visitMultiANewArrayInsn(arrayTypeName, dimensions);
17271729
}
1730+
*/
1731+
ClassNode arrayType = expression.getType();
1732+
ClassNode elementType = arrayType.getComponentType();
1733+
1734+
int storeIns = AASTORE;
1735+
if (!elementType.isArray() || expression.hasInitializer()) {
1736+
if (ClassHelper.isPrimitiveType(elementType)) {
1737+
int primType = 0;
1738+
if (elementType == ClassHelper.boolean_TYPE) {
1739+
primType = T_BOOLEAN;
1740+
storeIns = BASTORE;
1741+
} else if (elementType == ClassHelper.byte_TYPE) {
1742+
primType = T_BYTE;
1743+
storeIns = BASTORE;
1744+
} else if (elementType == ClassHelper.char_TYPE) {
1745+
primType = T_CHAR;
1746+
storeIns = CASTORE;
1747+
} else if (elementType == ClassHelper.double_TYPE) {
1748+
primType = T_DOUBLE;
1749+
storeIns = DASTORE;
1750+
} else if (elementType == ClassHelper.float_TYPE) {
1751+
primType = T_FLOAT;
1752+
storeIns = FASTORE;
1753+
} else if (elementType == ClassHelper.int_TYPE) {
1754+
primType = T_INT;
1755+
storeIns = IASTORE;
1756+
} else if (elementType == ClassHelper.long_TYPE) {
1757+
primType = T_LONG;
1758+
storeIns = LASTORE;
1759+
} else if (elementType == ClassHelper.short_TYPE) {
1760+
primType = T_SHORT;
1761+
storeIns = SASTORE;
1762+
}
1763+
mv.visitIntInsn(NEWARRAY, primType);
1764+
} else {
1765+
mv.visitTypeInsn(ANEWARRAY, BytecodeHelper.getClassInternalName(elementType));
1766+
}
1767+
} else {
1768+
mv.visitMultiANewArrayInsn(BytecodeHelper.getTypeDescription(arrayType), dimensions);
1769+
}
1770+
// GRECLIPSE end
17281771

17291772
for (int i = 0; i < size; i += 1) {
17301773
mv.visitInsn(DUP);
@@ -1740,7 +1783,7 @@ public void visitArrayExpression(final ArrayExpression expression) {
17401783
controller.getOperandStack().remove(1);
17411784
}
17421785

1743-
controller.getOperandStack().push(expression.getType());
1786+
controller.getOperandStack().push(arrayType);
17441787
}
17451788

17461789
@Override

0 commit comments

Comments
 (0)