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 2022/04/01 16:48:20 UTC

[groovy] branch master updated (8e1ffe6 -> b33b882)

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

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


    from 8e1ffe6  GROOVY-10564: Bump jackson databind version to 2.13.2.2
     new 5260908  GROOVY-10558: no spread for one argument in inner class `methodMissing`
     new b33b882  dynamic dispatch without GString expression

The 2 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.


Summary of changes:
 .../groovy/classgen/InnerClassVisitorHelper.java   | 77 ++++++++--------------
 src/test/gls/innerClass/InnerClassTest.groovy      | 21 ++++++
 2 files changed, 49 insertions(+), 49 deletions(-)

[groovy] 02/02: dynamic dispatch without GString expression

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

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

commit b33b88267e29ccbbd73e15d2c784505f46ea8324
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Apr 1 11:17:34 2022 -0500

    dynamic dispatch without GString expression
---
 .../groovy/classgen/InnerClassVisitorHelper.java   | 40 +++++++---------------
 1 file changed, 13 insertions(+), 27 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
index 8d0202b..e508caa 100644
--- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
@@ -24,16 +24,11 @@ import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.InnerClassNode;
 import org.codehaus.groovy.ast.Parameter;
-import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.Expression;
-import org.codehaus.groovy.ast.expr.GStringExpression;
 import org.codehaus.groovy.ast.expr.SpreadExpression;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
 import org.objectweb.asm.Opcodes;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
@@ -59,42 +54,29 @@ public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
     }
 
     protected static void setPropertyGetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
-        block.addStatement(returnS(propX(target, dynName(parameters[0]))));
+        block.addStatement(returnS(propX(target, varX(parameters[0]))));
     }
 
     protected static void setPropertySetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
-        block.addStatement(stmt(assignX(propX(target, dynName(parameters[0])), varX(parameters[1]))));
+        block.addStatement(stmt(assignX(propX(target, varX(parameters[0])), varX(parameters[1]))));
     }
 
     protected static void setMethodDispatcherCode    (final BlockStatement block, final Expression target, final Parameter[] parameters) {
-        // if (!(args instanceof Object[])) return target."$name"(args)
+        // if (!(args instanceof Object[])) return target.(name)(args)
         block.addStatement(ifS(
             notX(isInstanceOfX(varX(parameters[1]), OBJECT_ARRAY)),
-            returnS(callX(target, dynName(parameters[0]), varX(parameters[1])))));
+            returnS(callX(target, varX(parameters[0]), varX(parameters[1])))));
 
-        // if (((Object[])args).length == 1) return target."$name"(args[0])
+        // if (((Object[])args).length == 1) return target.(name)(args[0])
         block.addStatement(ifS(
             eqX(propX(castX(OBJECT_ARRAY, varX(parameters[1])), "length"), constX(1, true)),
-            returnS(callX(target, dynName(parameters[0]), indexX(castX(OBJECT_ARRAY, varX(parameters[1])), constX(0, true))))));
-
-        // return target."$name"(*args)
-        block.addStatement(returnS(callX(target, dynName(parameters[0]), new SpreadExpression(varX(parameters[1])))));
-    }
+            returnS(callX(target, varX(parameters[0]), indexX(castX(OBJECT_ARRAY, varX(parameters[1])), constX(0, true))))));
 
-    private static Expression dynName(final Parameter p) {
-        List<ConstantExpression> gStringStrings = new ArrayList<>();
-        gStringStrings.add(new ConstantExpression(""));
-        gStringStrings.add(new ConstantExpression(""));
-
-        List<Expression> gStringValues = new ArrayList<>();
-        gStringValues.add(varX(p));
-
-        return new GStringExpression("$name", gStringStrings, gStringValues);
+        // return target.(name)(*args)
+        block.addStatement(returnS(callX(target, varX(parameters[0]), new SpreadExpression(varX(parameters[1])))));
     }
 
-    protected static boolean isStatic(final InnerClassNode cn) {
-        return cn.getDeclaredField("this$0") == null;
-    }
+    //--------------------------------------------------------------------------
 
     protected static ClassNode getClassNode(final ClassNode cn, final boolean isStatic) {
         return isStatic ? ClassHelper.CLASS_Type : cn; // TODO: Set class type parameter?
@@ -109,6 +91,10 @@ public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
         return count;
     }
 
+    protected static boolean isStatic(final InnerClassNode cn) {
+        return cn.getDeclaredField("this$0") == null;
+    }
+
     protected static boolean shouldHandleImplicitThisForInnerClass(final ClassNode cn) {
         final int explicitOrImplicitStatic = Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ENUM;
         return (cn.getModifiers() & explicitOrImplicitStatic) == 0 && (cn instanceof InnerClassNode && !((InnerClassNode) cn).isAnonymous());

[groovy] 01/02: GROOVY-10558: no spread for one argument in inner class `methodMissing`

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

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

commit 5260908f348fd867301dbcef3bb6f3ed7a476edf
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Apr 1 10:56:34 2022 -0500

    GROOVY-10558: no spread for one argument in inner class `methodMissing`
---
 .../groovy/classgen/InnerClassVisitorHelper.java   | 57 ++++++++++------------
 src/test/gls/innerClass/InnerClassTest.groovy      | 21 ++++++++
 2 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
index b781608..8d0202b 100644
--- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
@@ -34,58 +34,51 @@ import org.objectweb.asm.Opcodes;
 import java.util.ArrayList;
 import java.util.List;
 
-import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.castX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.eqX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.indexX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.isInstanceOfX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.notX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
-import static org.codehaus.groovy.ast.ClassHelper.isObjectType;
 
 public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
 
+    private static final ClassNode OBJECT_ARRAY = ClassHelper.OBJECT_TYPE.makeArray();
+
     protected static void addFieldInit(final Parameter p, final FieldNode fn, final BlockStatement block) {
         block.addStatement(assignS(fieldX(fn), varX(p)));
     }
 
     protected static void setPropertyGetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
-        block.addStatement(
-                returnS(
-                        propX(
-                                target,
-                                dynName(parameters[0])
-                        )
-                )
-        );
+        block.addStatement(returnS(propX(target, dynName(parameters[0]))));
     }
 
     protected static void setPropertySetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
-        block.addStatement(
-                stmt(
-                        assignX(
-                                propX(
-                                        target,
-                                        dynName(parameters[0])
-                                ),
-                                varX(parameters[1])
-                        )
-                )
-        );
+        block.addStatement(stmt(assignX(propX(target, dynName(parameters[0])), varX(parameters[1]))));
     }
 
-    protected static void setMethodDispatcherCode(final BlockStatement block, final Expression target, final Parameter[] parameters) {
-        block.addStatement(
-                returnS(
-                        callX(
-                                target,
-                                dynName(parameters[0]),
-                                args(new SpreadExpression(varX(parameters[1])))
-                        )
-                )
-        );
+    protected static void setMethodDispatcherCode    (final BlockStatement block, final Expression target, final Parameter[] parameters) {
+        // if (!(args instanceof Object[])) return target."$name"(args)
+        block.addStatement(ifS(
+            notX(isInstanceOfX(varX(parameters[1]), OBJECT_ARRAY)),
+            returnS(callX(target, dynName(parameters[0]), varX(parameters[1])))));
+
+        // if (((Object[])args).length == 1) return target."$name"(args[0])
+        block.addStatement(ifS(
+            eqX(propX(castX(OBJECT_ARRAY, varX(parameters[1])), "length"), constX(1, true)),
+            returnS(callX(target, dynName(parameters[0]), indexX(castX(OBJECT_ARRAY, varX(parameters[1])), constX(0, true))))));
+
+        // return target."$name"(*args)
+        block.addStatement(returnS(callX(target, dynName(parameters[0]), new SpreadExpression(varX(parameters[1])))));
     }
 
     private static Expression dynName(final Parameter p) {
@@ -109,7 +102,7 @@ public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
 
     protected static int getObjectDistance(ClassNode cn) {
         int count = 0;
-        while (cn != null && !isObjectType(cn)) {
+        while (cn != null && !ClassHelper.isObjectType(cn)) {
             cn = cn.getSuperClass();
             count += 1;
         }
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index 2765ffc..7b54078 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -1010,6 +1010,27 @@ final class InnerClassTest {
         '''
     }
 
+    @Test // GROOVY-10558
+    void testUsageOfOuterMethod6() {
+        assertScript '''
+            class Outer {
+                static byte[] hash(byte[] bytes) {
+                    bytes
+                }
+                static class Inner {
+                    def test(byte[] bytes) {
+                        hash(bytes)
+                    }
+                }
+            }
+
+            Object result = new Outer.Inner().test(new byte[1])
+            assert result instanceof byte[]
+            assert result.length == 1
+            assert result[0] == 0
+        '''
+    }
+
     @Test
     void testUsageOfOuterMethodOverridden() {
         assertScript '''