Repository: groovy
Updated Branches:
  refs/heads/native-lambda 8096d278f -> 6aeaa1c5a


Minor refactoring: cleanup code and refine the check of FunctionInterface


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/6aeaa1c5
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/6aeaa1c5
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/6aeaa1c5

Branch: refs/heads/native-lambda
Commit: 6aeaa1c5a7863af5d2c126a5bdf9da9aff2a8db6
Parents: 8096d27
Author: sunlan <[email protected]>
Authored: Fri Jan 12 22:15:11 2018 +0800
Committer: sunlan <[email protected]>
Committed: Fri Jan 12 22:15:11 2018 +0800

----------------------------------------------------------------------
 .../java/org/codehaus/groovy/ast/ClassHelper.java   |  2 ++
 .../classgen/asm/sc/StaticTypesLambdaWriter.java    | 16 ++++------------
 2 files changed, 6 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/6aeaa1c5/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java 
b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
index 27bc000..9fc8643 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
@@ -102,6 +102,8 @@ public class ClassHelper {
             Annotation_TYPE = makeCached(Annotation.class),
             ELEMENT_TYPE_TYPE = makeCached(ElementType.class),
 
+    FunctionalInterface_Type = 
ClassHelper.makeCached(FunctionalInterface.class),
+
     // uncached constants.
     CLASS_Type = makeWithoutCaching(Class.class), COMPARABLE_TYPE = 
makeWithoutCaching(Comparable.class),
             GENERATED_CLOSURE_Type = 
makeWithoutCaching(GeneratedClosure.class),

http://git-wip-us.apache.org/repos/asf/groovy/blob/6aeaa1c5/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
----------------------------------------------------------------------
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 9681ecd..cdb627b 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
@@ -80,8 +80,8 @@ public class StaticTypesLambdaWriter extends LambdaWriter {
                         .filter(MethodNode::isAbstract)
                         .collect(Collectors.toList());
 
-        if (!(isFunctionInterfaceAnnotationAttached(parameterType) && 
abstractMethodNodeList.size() == 1)) {
-            super.writeClosure(expression);
+        if (!(isFunctionInterface(parameterType) && 
abstractMethodNodeList.size() == 1)) {
+            super.writeLambda(expression);
             return;
         }
 
@@ -90,14 +90,6 @@ public class StaticTypesLambdaWriter extends LambdaWriter {
         String abstractMethodDesc = "()L" + 
parameterType.redirect().getPackageName().replace('.', '/') + "/" + 
parameterType.redirect().getNameWithoutPackage() + ";";
 
 
-        AsmClassGenerator acg = controller.getAcg();
-        ClassVisitor cw = acg.getClassVisitor();
-        cw.visitInnerClass(
-                "java/lang/invoke/MethodHandles$Lookup",
-                "java/lang/invoke/MethodHandles",
-                "Lookup",
-                ACC_PUBLIC + ACC_FINAL + ACC_STATIC);
-
         MethodVisitor mv = controller.getMethodVisitor();
         ClassNode lambdaEnclosingClassNode = getOrAddLambdaClass(expression, 
ACC_PUBLIC, abstractMethodNode);
         MethodNode syntheticLambdaMethodNode = 
lambdaEnclosingClassNode.getMethods(DO_CALL).get(0);
@@ -136,8 +128,8 @@ public class StaticTypesLambdaWriter extends LambdaWriter {
         );
     }
 
-    private boolean isFunctionInterfaceAnnotationAttached(ClassNode 
parameterType) {
-        return 
!parameterType.redirect().getAnnotations(ClassHelper.makeCached(FunctionalInterface.class)).isEmpty();
+    private boolean isFunctionInterface(ClassNode parameterType) {
+        return parameterType.redirect().isInterface() && 
!parameterType.redirect().getAnnotations(ClassHelper.FunctionalInterface_Type).isEmpty();
     }
 
     public ClassNode getOrAddLambdaClass(LambdaExpression expression, int 
mods, MethodNode abstractMethodNode) {

Reply via email to