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/02/19 16:44:48 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-8448: "this.name" from anon. inner class

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

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


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new 034e50e  GROOVY-8448: "this.name" from anon. inner class
034e50e is described below

commit 034e50e98c4f05cfa351d996a6bf2ff851d026e4
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Feb 5 12:41:28 2022 -0600

    GROOVY-8448: "this.name" from anon. inner class
    
    Conflicts:
    	src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
---
 .../org/codehaus/groovy/classgen/AsmClassGenerator.java   |  8 +++++++-
 src/test/gls/innerClass/InnerClassTest.groovy             | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 22a677e..4cd347d 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -1095,8 +1095,14 @@ public class AsmClassGenerator extends ClassGenerator {
                     } else {
                         fieldNode = classNode.getDeclaredField(name);
                     }
+                    // GROOVY-8448: "this.name" from anon. inner class
+                    if (fieldNode != null && !expression.isImplicitThis()
+                            && (fieldNode.getModifiers() & ACC_SYNTHETIC) != 0
+                            && fieldNode.getType().equals(ClassHelper.REFERENCE_TYPE)) {
+                        fieldNode = null;
+                    }
+                    // GROOVY-5259, GROOVY-9501, GROOVY-9569, GROOVY-9650, GROOVY-9655, GROOVY-9665, GROOVY-9683, GROOVY-9695
                     if (fieldNode == null && !isValidFieldNodeForByteCodeAccess(getField(classNode, name), classNode)) {
-                        // GROOVY-9501, GROOVY-9569, GROOVY-9650, GROOVY-9655, GROOVY-9665, GROOVY-9683, GROOVY-9695
                         if (checkStaticOuterField(expression, name)) return;
                     }
                 } else {
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index 618d9d4..98c6e09 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -51,6 +51,21 @@ final class InnerClassTest {
         '''
     }
 
+    @Test // GROOVY-8448
+    void testAccessLocalVariableVsGetterInAIC() {
+        assertScript '''
+            def x = 'local' // shared variable written as field in AIC
+            def c = new java.util.concurrent.Callable<String>() {
+                def getX() { 'getter' }
+                @Override String call() {
+                    x + ' then ' + this.x
+                }
+            }
+            String result = c()
+            assert result == 'local then getter'
+        '''
+    }
+
     @Test
     void testAccessLocalVariableFromClosureInAIC() {
         assertScript '''