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 2019/12/19 01:40:15 UTC

[groovy] 01/01: GROOVY-9342: load static "this" type for static access of properties

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

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

commit be25d286951d4eb28ae654367671fbf10baa9b1d
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Dec 18 19:30:11 2019 -0600

    GROOVY-9342: load static "this" type for static access of properties
---
 .../org/codehaus/groovy/classgen/asm/WriterController.java |  5 ++---
 .../groovy/classgen/asm/sc/StaticTypesLambdaWriter.java    | 12 ++++++++----
 src/test/groovy/transform/stc/LambdaTest.groovy            | 14 +++++++++++++-
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index 1db4a89..6eae8ab 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -19,7 +19,6 @@
 package org.codehaus.groovy.classgen.asm;
 
 import org.codehaus.groovy.GroovyBugError;
-import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.ConstructorNode;
 import org.codehaus.groovy.ast.InterfaceHelperClassNode;
@@ -41,6 +40,7 @@ import java.util.List;
 import java.util.Map;
 
 import static org.apache.groovy.util.SystemUtil.getBooleanSafe;
+import static org.codehaus.groovy.ast.ClassHelper.isGeneratedFunction;
 
 public class WriterController {
 
@@ -283,8 +283,7 @@ public class WriterController {
     }
 
     public boolean isInClosure() {
-        return classNode.getOuterClass() != null
-                && ClassHelper.isGeneratedFunction(classNode);
+        return classNode.getOuterClass() != null && isGeneratedFunction(classNode);
     }
 
     public boolean isInClosureConstructor() {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
index cfce5c5..a47131c 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
@@ -28,7 +28,6 @@ import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.builder.AstStringCompiler;
 import org.codehaus.groovy.ast.expr.ClosureExpression;
-import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.LambdaExpression;
 import org.codehaus.groovy.ast.expr.VariableExpression;
@@ -60,6 +59,7 @@ import static org.codehaus.groovy.ast.ClassHelper.SERIALIZABLE_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.SERIALIZEDLAMBDA_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.findSAM;
+import static org.codehaus.groovy.ast.ClassHelper.isGeneratedFunction;
 import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.block;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
@@ -175,7 +175,11 @@ public class StaticTypesLambdaWriter extends LambdaWriter implements AbstractFun
         mv.visitInsn(DUP);
 
         if (controller.isStaticMethod() || compileStack.isInSpecialConstructorCall() || !accessingInstanceMembers) {
-            operandStack.pushConstant(ConstantExpression.NULL);
+            ClassNode classNode = controller.getClassNode();
+            while (isGeneratedFunction(classNode)) {
+                classNode = classNode.getOuterClass();
+            }
+            classX(classNode).visit(controller.getAcg());
         } else {
             mv.visitVarInsn(ALOAD, 0);
             operandStack.push(controller.getClassNode());
@@ -210,9 +214,9 @@ public class StaticTypesLambdaWriter extends LambdaWriter implements AbstractFun
         return lambdaSharedVariableParameters;
     }
 
-    private String createAbstractMethodDesc(final ClassNode functionalInterface, final ClassNode lambdaClassNode) {
+    private String createAbstractMethodDesc(final ClassNode functionalInterface, final ClassNode lambdaClass) {
         List<Parameter> lambdaSharedVariables = new LinkedList<>();
-        prependParameter(lambdaSharedVariables, "__lambda_this", lambdaClassNode);
+        prependParameter(lambdaSharedVariables, "__lambda_this", lambdaClass);
         return BytecodeHelper.getMethodDescriptor(functionalInterface, lambdaSharedVariables.toArray(Parameter.EMPTY_ARRAY));
     }
 
diff --git a/src/test/groovy/transform/stc/LambdaTest.groovy b/src/test/groovy/transform/stc/LambdaTest.groovy
index 48cf528..eb0af34 100644
--- a/src/test/groovy/transform/stc/LambdaTest.groovy
+++ b/src/test/groovy/transform/stc/LambdaTest.groovy
@@ -1053,7 +1053,7 @@ final class LambdaTest {
     }
 
     @Test // GROOVY-9332
-    void testStaticInitializeBlocks() {
+    void testStaticInitializeBlocks1() {
         assertScript '''
             @groovy.transform.CompileStatic
             class Test1 {
@@ -1078,6 +1078,18 @@ final class LambdaTest {
         '''
     }
 
+    @Test // GROOVY-9342
+    void testStaticInitializeBlocks3() {
+        assertScript '''
+            @groovy.transform.CompileStatic
+            class Test1 {
+                static int acc = 1
+                static { [1, 2, 3].forEach((Integer i) -> acc += i) }
+            }
+            assert Test1.acc == 7
+        '''
+    }
+
     @Test
     void testAccessingThis1() {
         assertScript '''