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 0c2ed94544 GROOVY-10687: SC: replace access bridge methods with direct 
construction
0c2ed94544 is described below

commit 0c2ed94544df0e30795d317533816436d07fc7b2
Author: Eric Milles <[email protected]>
AuthorDate: Tue Sep 24 15:51:19 2024 -0500

    GROOVY-10687: SC: replace access bridge methods with direct construction
---
 .../classgen/asm/sc/StaticInvocationWriter.java    | 44 ++++++++++------------
 .../transform/stc/StaticTypeCheckingVisitor.java   |  4 +-
 .../asm/sc/StaticCompileConstructorsTest.groovy    |  4 +-
 3 files changed, 26 insertions(+), 26 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index cffa427daa..ab190ee44b 100644
--- 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
+++ 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
@@ -139,35 +139,31 @@ public class StaticInvocationWriter extends 
InvocationWriter {
             cn = new ConstructorNode(mn.getModifiers(), mn.getParameters(), 
mn.getExceptions(), mn.getCode());
             cn.setDeclaringClass(mn.getDeclaringClass());
         }
-        TupleExpression args = makeArgumentList(call.getArguments());
-        if (cn.isPrivate()) {
-            ClassNode classNode = controller.getClassNode();
-            ClassNode declaringClass = cn.getDeclaringClass();
-            if (declaringClass != classNode) {
-                MethodNode bridge = null;
-                if (call.getNodeMetaData(StaticTypesMarker.PV_METHODS_ACCESS) 
!= null) {
-                    Map<MethodNode, MethodNode> bridgeMethods = 
declaringClass.getNodeMetaData(StaticCompilationMetadataKeys.PRIVATE_BRIDGE_METHODS);
-                    if (bridgeMethods != null) bridge = bridgeMethods.get(cn);
-                }
-                if (bridge instanceof ConstructorNode) {
-                    ArgumentListExpression newArgs = args(nullX());
-                    for (Expression arg: args) {
-                        newArgs.addExpression(arg);
-                    }
-                    cn = (ConstructorNode) bridge;
-                    args = newArgs;
-                } else {
-                    controller.getSourceUnit().addError(new SyntaxException(
-                            "Cannot call private constructor for " + 
declaringClass.toString(false) + " from class " + classNode.toString(false),
-                            call
-                    ));
-                }
+        ClassNode declaringClass = cn.getDeclaringClass();
+        ClassNode enclosingClass = controller.getClassNode();
+        List<Expression> argList = call.getArguments() instanceof 
TupleExpression
+                ? ((TupleExpression) call.getArguments()).getExpressions() : 
List.of(call.getArguments());
+        if (!AsmClassGenerator.isMemberDirectlyAccessible(cn.getModifiers(), 
declaringClass, enclosingClass)) {
+            MethodNode bridge = null;
+            if (call.getNodeMetaData(StaticTypesMarker.PV_METHODS_ACCESS) != 
null) {
+                Map<MethodNode, MethodNode> bridgeMethods = 
declaringClass.getNodeMetaData(StaticCompilationMetadataKeys.PRIVATE_BRIDGE_METHODS);
+                if (bridgeMethods != null) bridge = bridgeMethods.get(cn);
+            }
+            if (bridge instanceof ConstructorNode) {
+                cn = (ConstructorNode) bridge;
+                argList = new ArrayList<>(argList);
+                argList.add(0, nullX());
+            } else {
+                controller.getSourceUnit().addError(new SyntaxException(
+                        "Cannot call private constructor for " + 
declaringClass.toString(false) + " from class " + 
enclosingClass.toString(false),
+                        call
+                ));
             }
         }
 
         String ownerDescriptor = prepareConstructorCall(cn);
         int before = controller.getOperandStack().getStackLength();
-        loadArguments(args.getExpressions(), cn.getParameters());
+        loadArguments(argList, cn.getParameters());
         finnishConstructorCall(cn, ownerDescriptor, 
controller.getOperandStack().getStackLength() - before);
     }
 
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 9bec90bd6e..db5446a4e5 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -600,7 +600,9 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
         ClassNode enclosingClass = typeCheckingContext.getEnclosingClassNode();
         if (declaringClass != enclosingClass || 
typeCheckingContext.getEnclosingClosure() != null) {
             if (mn.isPrivate() && getNestHost(declaringClass) == 
getNestHost(enclosingClass)) {
-                if (mn.isConstructor()) 
declaringClass.getNodeMetaData(PV_METHODS_ACCESS, k -> new 
LinkedHashSet<MethodNode>()).add(mn);
+                if (source instanceof MethodReferenceExpression // 
GROOVY-11301: access bridge for lambda
+                        && 
Float.parseFloat(getSourceUnit().getConfiguration().getTargetBytecode()) < 15)
+                    declaringClass.getNodeMetaData(PV_METHODS_ACCESS, k -> new 
LinkedHashSet<MethodNode>()).add(mn);
                 source.putNodeMetaData(PV_METHODS_ACCESS, mn);
             } else if (mn.isProtected() && !inSamePackage(enclosingClass, 
declaringClass)
                     && (!implementsInterfaceOrIsSubclassOf(enclosingClass, 
declaringClass)
diff --git 
a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileConstructorsTest.groovy
 
b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileConstructorsTest.groovy
index 89569cd829..c9d8050965 100644
--- 
a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileConstructorsTest.groovy
+++ 
b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileConstructorsTest.groovy
@@ -71,10 +71,12 @@ class StaticCompileConstructorsTest extends 
ConstructorsSTCTest implements Stati
                 static class Bar {
                     static Foo makeFoo(String s) { new Foo(s) }
                 }
-
             }
             assert Foo.Bar.makeFoo('pls').s == 'pls'
         '''
+        String bar = astTrees['Foo$Bar'][1]
+        assert bar.contains('NEW Foo')
+        assert bar.contains('INVOKESPECIAL Foo.<init> (Ljava/lang/String;)V')
     }
 
     void testPrivateConstructorFromAnonymousInnerClass() {

Reply via email to