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:51:16 UTC
[groovy] branch GROOVY_4_0_X 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 GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
new e9e05278bf GROOVY-9771: SC: private field access without revisit
e9e05278bf is described below
commit e9e05278bf686819693bc9b270af237533e776bc
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 3a0d78de31..019fc98fe2 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
@@ -377,10 +377,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;
}
@@ -404,7 +411,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);