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/10/22 19:34:16 UTC

[groovy] branch master updated: GROOVY-9771: SC: private field access without revisit

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


The following commit(s) were added to refs/heads/master by this push:
     new 29c4858934 GROOVY-9771: SC: private field access without revisit
29c4858934 is described below

commit 29c485893478da32166dc01058a0b14fb20c90ea
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Oct 22 14:23:18 2022 -0500

    GROOVY-9771: SC: private field access without revisit
---
 ...taticTypesBinaryExpressionMultiTypeDispatcher.java | 19 ++++++-------------
 .../classgen/asm/sc/StaticTypesCallSiteWriter.java    | 14 ++++++++++----
 2 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
index 6ac606ad9b..fd002236da 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
@@ -44,7 +44,6 @@ import org.codehaus.groovy.classgen.asm.VariableSlotLoader;
 import org.codehaus.groovy.classgen.asm.WriterController;
 import org.codehaus.groovy.syntax.Token;
 import org.codehaus.groovy.syntax.TokenUtil;
-import org.codehaus.groovy.transform.sc.StaticCompilationVisitor;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 
@@ -55,6 +54,10 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.apache.groovy.ast.tools.ExpressionUtils.isThisExpression;
 import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveChar;
+import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveDouble;
+import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveFloat;
+import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveLong;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.binX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
@@ -68,10 +71,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
 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.isPrimitiveChar;
-import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveDouble;
-import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveFloat;
-import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveLong;
 import static org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys.PRIVATE_FIELDS_MUTATORS;
 import static org.codehaus.groovy.transform.sc.StaticCompilationVisitor.ARRAYLIST_ADD_METHOD;
 import static org.codehaus.groovy.transform.sc.StaticCompilationVisitor.ARRAYLIST_CLASSNODE;
@@ -393,17 +392,11 @@ public class StaticTypesBinaryExpressionMultiTypeDispatcher extends BinaryExpres
 
         if (receiverType.isArray() && !safe && binExpWriter[getOperandType(receiverType.getComponentType())].arraySet(true)) {
             super.assignToArray(enclosing, receiver, subscript, rhsValueLoader, safe);
-        } else {
-            /*
-             * This code path is needed because ACG creates array access expressions
-             */
 
-            // GROOVY-6061
-            if (rhsValueLoader instanceof VariableSlotLoader && enclosing instanceof BinaryExpression) {
+        } else { // this code path is needed because ACG creates array access expressions
+            if (rhsValueLoader instanceof VariableSlotLoader && enclosing instanceof BinaryExpression) { // GROOVY-6061
                 rhsValueLoader.putNodeMetaData(INFERRED_TYPE, controller.getTypeChooser().resolveType(enclosing, controller.getClassNode()));
             }
-            // GROOVY-9771
-            receiver.visit(new StaticCompilationVisitor(controller.getSourceUnit(), controller.getClassNode()));
 
             // replace assignment to a subscript operator with a method call
             // e.g. x[5] = 10 -> methodCall(x, "putAt", [5, 10])
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
index c77ee7d05c..c62659d25e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
@@ -379,10 +379,17 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter {
                 if (accessors != null) {
                     MethodNode methodNode = accessors.get(fieldName);
                     if (methodNode != null) {
-                        MethodCallExpression call = callX(receiver, methodNode.getName(), args(field.isStatic() ? nullX() : receiver));
-                        call.setImplicitThis(implicitThis);
+                        Expression thisObject;
+                        if (field.isStatic()) {
+                            thisObject = nullX();
+                        } else if (!isThisExpression(receiver)) {
+                            thisObject = receiver;
+                        } else { // GROOVY-7304, GROOVY-9771, GROOVY-9872
+                            thisObject = propX(classX(receiverType), "this");
+                        }
+
+                        MethodCallExpression call = callX(classX(receiverType), methodNode.getName(), thisObject);
                         call.setMethodTarget(methodNode);
-                        call.setSafe(safe);
                         call.visit(controller.getAcg());
                         return true;
                     }
@@ -406,7 +413,6 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter {
                     expr = castX(thisType, call);
                 } else {
                     expr = propX(classX(outerClass), "this");
-                    ((PropertyExpression) expr).setImplicitThis(true);
                 }
                 expr.setSourcePosition(receiver);
                 expr.putNodeMetaData(StaticTypesMarker.INFERRED_TYPE, thisType);