You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/06/13 09:47:37 UTC
[groovy] 05/06: reduce nesting
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 570361e99ff8f8e59b11638ad9cf9958060be1b5
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Jun 9 11:11:13 2020 -0500
reduce nesting
(cherry picked from commit 20bc8ad74bb7aeaf6c26f1315eda3a2c48ef6473)
---
.../classgen/asm/sc/StaticInvocationWriter.java | 142 +++++++++++----------
1 file changed, 74 insertions(+), 68 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 72fbe89..bb6e934 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
@@ -18,7 +18,6 @@
*/
package org.codehaus.groovy.classgen.asm.sc;
-import org.codehaus.groovy.ast.ASTNode;
import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.ConstructorNode;
@@ -177,8 +176,10 @@ public class StaticInvocationWriter extends InvocationWriter {
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.getLineNumber(), call.getColumnNumber(), mn.getLastLineNumber(), call.getLastColumnNumber()));
+ controller.getSourceUnit().addError(new SyntaxException(
+ "Cannot call private constructor for " + declaringClass.toString(false) + " from class " + classNode.toString(false),
+ call
+ ));
}
}
}
@@ -274,6 +275,8 @@ public class StaticInvocationWriter extends InvocationWriter {
protected boolean writeDirectMethodCall(final MethodNode target, final boolean implicitThis, final Expression receiver, final TupleExpression args) {
if (target == null) return false;
+ ClassNode classNode = controller.getClassNode();
+
if (target instanceof ExtensionMethodNode) {
ExtensionMethodNode emn = (ExtensionMethodNode) target;
MethodVisitor mv = controller.getMethodVisitor();
@@ -286,7 +289,6 @@ public class StaticInvocationWriter extends InvocationWriter {
argumentList.add(nullX());
} else {
boolean isThisOrSuper = isThisExpression(receiver) || isSuperExpression(receiver);
- ClassNode classNode = controller.getClassNode();
Expression fixedReceiver = null;
if (isThisOrSuper && classNode.getOuterClass() != null && controller.isInGeneratedFunction()) {
ClassNode current = classNode.getOuterClass();
@@ -319,75 +321,76 @@ public class StaticInvocationWriter extends InvocationWriter {
}
controller.getOperandStack().push(returnType);
return true;
- } else {
- if (target == StaticTypeCheckingVisitor.CLOSURE_CALL_VARGS) {
- // wrap arguments into an array
- ArrayExpression arr = new ArrayExpression(ClassHelper.OBJECT_TYPE, args.getExpressions());
- return super.writeDirectMethodCall(target, implicitThis, receiver, args(arr));
+ }
+
+ if (target == StaticTypeCheckingVisitor.CLOSURE_CALL_VARGS) {
+ // wrap arguments into an array
+ Expression arr = new ArrayExpression(ClassHelper.OBJECT_TYPE, args.getExpressions());
+ return super.writeDirectMethodCall(target, implicitThis, receiver, args(arr));
+ }
+
+ if (!target.isPublic()
+ && controller.isInGeneratedFunction()
+ && target.getDeclaringClass() != classNode) {
+ if (!tryBridgeMethod(target, receiver, implicitThis, args, classNode)) {
+ // replace call with an invoker helper call
+ MethodNode methodNode = target.isStatic() ? INVOKERHELPER_INVOKESTATICMETHOD : INVOKERHELPER_INVOKEMETHOD;
+ MethodCallExpression mce = callX(
+ classX(INVOKERHELPER_CLASSNODE),
+ methodNode.getName(),
+ args(
+ target.isStatic() ? classX(target.getDeclaringClass()) : receiver,
+ constX(target.getName()),
+ new ArrayExpression(ClassHelper.OBJECT_TYPE, args.getExpressions())
+ )
+ );
+ mce.setMethodTarget(methodNode);
+ mce.visit(controller.getAcg());
}
- ClassNode classNode = controller.getClassNode();
- if (classNode.isDerivedFrom(ClassHelper.CLOSURE_TYPE)
- && controller.isInGeneratedFunction()
- && !target.isPublic()
- && target.getDeclaringClass() != classNode) {
- if (!tryBridgeMethod(target, receiver, implicitThis, args, classNode)) {
- // replace call with an invoker helper call
- ArrayExpression arr = new ArrayExpression(ClassHelper.OBJECT_TYPE, args.getExpressions());
- MethodCallExpression mce = callX(
- classX(INVOKERHELPER_CLASSNODE),
- target.isStatic() ? "invokeStaticMethod" : "invokeMethodSafe",
- args(
- target.isStatic() ? classX(target.getDeclaringClass()) : receiver,
- constX(target.getName()),
- arr
- )
- );
- mce.setMethodTarget(target.isStatic() ? INVOKERHELPER_INVOKESTATICMETHOD : INVOKERHELPER_INVOKEMETHOD);
- mce.visit(controller.getAcg());
- return true;
- }
+ return true;
+ }
+
+ if (target.isPrivate() && tryPrivateMethod(target, implicitThis, receiver, args, classNode)) {
+ return true;
+ }
+
+ Expression fixedReceiver = null;
+ boolean fixedImplicitThis = implicitThis;
+ if (target.isProtected()) {
+ ClassNode node = receiver == null ? ClassHelper.OBJECT_TYPE : controller.getTypeChooser().resolveType(receiver, controller.getClassNode());
+ if (!implicitThis && !isThisExpression(receiver) && !isSuperExpression(receiver) && !samePackageName(node, classNode)
+ && StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf(node,target.getDeclaringClass())) {
+ controller.getSourceUnit().addError(new SyntaxException(
+ "Method " + target.getName() + " is protected in " + target.getDeclaringClass().toString(false),
+ receiver != null ? receiver : args
+ ));
+ } else if (!node.isDerivedFrom(target.getDeclaringClass()) && tryBridgeMethod(target, receiver, implicitThis, args, classNode)) {
return true;
}
- Expression fixedReceiver = null;
- boolean fixedImplicitThis = implicitThis;
- if (target.isPrivate()) {
- if (tryPrivateMethod(target, implicitThis, receiver, args, classNode)) return true;
- } else if (target.isProtected()) {
- ClassNode node = receiver == null ? ClassHelper.OBJECT_TYPE : controller.getTypeChooser().resolveType(receiver, controller.getClassNode());
- if (!implicitThis && !isThisExpression(receiver) && !isSuperExpression(receiver) && !samePackageName(node, classNode)
- && StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf(node,target.getDeclaringClass())) {
- ASTNode src = receiver == null ? args : receiver;
- controller.getSourceUnit().addError(
- new SyntaxException("Method " + target.getName() + " is protected in " + target.getDeclaringClass().toString(false),
- src.getLineNumber(), src.getColumnNumber(), src.getLastLineNumber(), src.getLastColumnNumber()));
- } else if (!node.isDerivedFrom(target.getDeclaringClass()) && tryBridgeMethod(target, receiver, implicitThis, args, classNode)) {
- return true;
- }
- } else if (target.isPublic() && receiver != null) {
- if (implicitThis
- && !classNode.isDerivedFrom(target.getDeclaringClass())
- && !classNode.implementsInterface(target.getDeclaringClass())
- && classNode.getOuterClass() != null && controller.isInGeneratedFunction()) {
- ClassNode current = classNode.getOuterClass();
- fixedReceiver = varX("thisObject", current);
- // adjust for multiple levels of nesting if needed
- while (current.getOuterClass() != null && !target.getDeclaringClass().equals(current)) {
- FieldNode thisField = current.getField("this$0");
- current = current.getOuterClass();
- if (thisField != null) {
- fixedReceiver = propX(fixedReceiver, "this$0");
- fixedReceiver.setType(current);
- fixedImplicitThis = false;
- }
+ } else if (target.isPublic() && receiver != null) {
+ if (implicitThis
+ && !classNode.isDerivedFrom(target.getDeclaringClass())
+ && !classNode.implementsInterface(target.getDeclaringClass())
+ && classNode.getOuterClass() != null && controller.isInGeneratedFunction()) {
+ ClassNode current = classNode.getOuterClass();
+ fixedReceiver = varX("thisObject", current);
+ // adjust for multiple levels of nesting if needed
+ while (current.getOuterClass() != null && !target.getDeclaringClass().equals(current)) {
+ FieldNode thisField = current.getField("this$0");
+ current = current.getOuterClass();
+ if (thisField != null) {
+ fixedReceiver = propX(fixedReceiver, "this$0");
+ fixedReceiver.setType(current);
+ fixedImplicitThis = false;
}
}
}
- if (receiver != null && !isSuperExpression(receiver)) {
- // in order to avoid calls to castToType, which is the dynamic behaviour, we make sure that we call CHECKCAST instead then replace the top operand type
- return super.writeDirectMethodCall(target, fixedImplicitThis, new CheckcastReceiverExpression(fixedReceiver != null ? fixedReceiver : receiver, target), args);
- }
- return super.writeDirectMethodCall(target, implicitThis, receiver, args);
}
+ if (receiver != null && !isSuperExpression(receiver)) {
+ // in order to avoid calls to castToType, which is the dynamic behaviour, we make sure that we call CHECKCAST instead then replace the top operand type
+ return super.writeDirectMethodCall(target, fixedImplicitThis, new CheckcastReceiverExpression(fixedReceiver != null ? fixedReceiver : receiver, target), args);
+ }
+ return super.writeDirectMethodCall(target, implicitThis, receiver, args);
}
private boolean tryPrivateMethod(final MethodNode target, final boolean implicitThis, final Expression receiver, final TupleExpression args, final ClassNode classNode) {
@@ -407,8 +410,10 @@ public class StaticInvocationWriter extends InvocationWriter {
private void checkAndAddCannotCallPrivateMethodError(final MethodNode target, final Expression receiver, final ClassNode classNode, final ClassNode declaringClass) {
if (declaringClass != classNode) {
- controller.getSourceUnit().addError(new SyntaxException("Cannot call private method " + (target.isStatic() ? "static " : "") +
- declaringClass.toString(false) + "#" + target.getName() + " from class " + classNode.toString(false), receiver.getLineNumber(), receiver.getColumnNumber(), receiver.getLastLineNumber(), receiver.getLastColumnNumber()));
+ controller.getSourceUnit().addError(new SyntaxException(
+ "Cannot call private method " + (target.isStatic() ? "static " : "") + declaringClass.toString(false) + "#" + target.getName() + " from class " + classNode.toString(false),
+ receiver
+ ));
}
}
@@ -420,6 +425,7 @@ public class StaticInvocationWriter extends InvocationWriter {
return false;
}
+ @Override
protected void loadArguments(final List<Expression> argumentList, final Parameter[] para) {
if (para.length == 0) return;
ClassNode lastParaType = para[para.length - 1].getOriginType();