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) {
