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 16:59:41 UTC

[groovy] branch GROOVY-10034 created (now abeced9)

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

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


      at abeced9  GROOVY-10034: do not cast non-primitive array when target is Object[]

This branch includes the following new commits:

     new abeced9  GROOVY-10034: do not cast non-primitive array when target is Object[]

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-10034: do not cast non-primitive array when target is Object[]

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

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

commit abeced9ca81397feb2f2457fe33cb4519f97a8d2
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Apr 12 11:59:27 2021 -0500

    GROOVY-10034: do not cast non-primitive array when target is Object[]
---
 .../org/codehaus/groovy/classgen/asm/OperandStack.java  |  6 ++++++
 src/test/groovy/bugs/Groovy10034.groovy                 | 17 +++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java b/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
index 4de5957..ec75c58 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
@@ -338,6 +338,12 @@ public class OperandStack {
             return;
         }
 
+        // GROOVY-10034: no need to cast non-primitive array when target is "java.lang.Object[]"
+        if (targetType.isArray() && targetType.getComponentType().equals(ClassHelper.OBJECT_TYPE)
+                && top.isArray() && !ClassHelper.isPrimitiveType(top.getComponentType())) {
+            return;
+        }
+
         boolean primTarget = ClassHelper.isPrimitiveType(targetType);
         boolean primTop = ClassHelper.isPrimitiveType(top);
 
diff --git a/src/test/groovy/bugs/Groovy10034.groovy b/src/test/groovy/bugs/Groovy10034.groovy
new file mode 100644
index 0000000..670ac36
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy10034.groovy
@@ -0,0 +1,17 @@
+package groovy.bugs
+
+import org.codehaus.groovy.classgen.asm.AbstractBytecodeTestCase
+
+final class Groovy10034 extends AbstractBytecodeTestCase {
+    void testObjectArrayParam() {
+        def result = compile method:'test', '''
+            @groovy.transform.CompileStatic
+            def test() {
+                ["x"].toArray(new String[0])
+            }
+        '''
+        int offset = result.indexOf('ANEWARRAY java/lang/String', result.indexOf('--BEGIN--'))
+        assert result.hasStrictSequence(['ANEWARRAY java/lang/String','INVOKEINTERFACE java/util/List.toArray'], offset)
+        // there should be no 'INVOKEDYNAMIC cast' instruction here: ^
+    }
+}