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:22 UTC

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

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());