Repository: groovy Updated Branches: refs/heads/native-lambda 8616d8967 -> 0165fb276
Refine constructing BSM Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/0165fb27 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/0165fb27 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/0165fb27 Branch: refs/heads/native-lambda Commit: 0165fb276ef1df048da3cb69b7555710e1ba8801 Parents: 8616d89 Author: sunlan <[email protected]> Authored: Tue Jan 16 11:37:20 2018 +0800 Committer: sunlan <[email protected]> Committed: Tue Jan 16 11:37:20 2018 +0800 ---------------------------------------------------------------------- .../asm/sc/StaticTypesLambdaWriter.java | 32 ++++---------------- 1 file changed, 6 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/0165fb27/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 cbc6d31..f3679b3 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 @@ -97,7 +97,8 @@ public class StaticTypesLambdaWriter extends LambdaWriter { MethodNode abstractMethodNode = abstractMethodNodeList.get(0); String abstractMethodDesc = createMethodDescriptor(abstractMethodNode); - ClassNode lambdaClassNode = getOrAddLambdaClass(expression, ACC_PUBLIC | (controller.getClassNode().isInterface() ? ACC_STATIC : 0)); + boolean isInterface = controller.getClassNode().isInterface(); + ClassNode lambdaClassNode = getOrAddLambdaClass(expression, ACC_PUBLIC | (isInterface ? ACC_STATIC : 0)); MethodNode syntheticLambdaMethodNode = lambdaClassNode.getMethods(DO_CALL).get(0); MethodVisitor mv = controller.getMethodVisitor(); @@ -106,7 +107,7 @@ public class StaticTypesLambdaWriter extends LambdaWriter { mv.visitInvokeDynamicInsn( abstractMethodNode.getName(), createAbstractMethodDesc(syntheticLambdaMethodNode, parameterType), - createBootstrapMethod(), + createBootstrapMethod(isInterface), createBootstrapMethodArguments(abstractMethodDesc, lambdaClassNode, syntheticLambdaMethodNode) ); controller.getOperandStack().replace(parameterType.redirect(), lambdaSharedVariableParameters.length); @@ -137,13 +138,13 @@ public class StaticTypesLambdaWriter extends LambdaWriter { return methodDescriptor; } - private Handle createBootstrapMethod() { + private Handle createBootstrapMethod(boolean isInterface) { return new Handle( Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", - false + isInterface ); } @@ -237,25 +238,9 @@ public class StaticTypesLambdaWriter extends LambdaWriter { ); methodNode.putNodeMetaData(ORIGINAL_PARAMETERS_WITH_EXACT_TYPE, parametersWithExactType); methodNode.putNodeMetaData(LAMBDA_SHARED_VARIABLES, localVariableParameters); - methodNode.setSourcePosition(expression); - - LocalVariableReplacementVisitor localVariableReplacementVisitor = new LocalVariableReplacementVisitor(methodNode); - - localVariableReplacementVisitor.visitMethod(methodNode); - -// System.out.println(methodNode); - - /* - VariableScope varScope = expression.getVariableScope(); - if (varScope == null) { - throw new RuntimeException( - "Must have a VariableScope by now! for expression: " + expression + " class: " + answer.getName()); - } else { - methodNode.setVariableScope(varScope.copy()); - } - */ + new LocalVariableReplacementVisitor(methodNode).visitMethod(methodNode); } private Parameter[] createParametersWithExactType(LambdaExpression expression) { @@ -294,8 +279,6 @@ public class StaticTypesLambdaWriter extends LambdaWriter { public void visitVariableExpression(VariableExpression expression) { if (expression.isClosureSharedVariable()) { final String variableName = expression.getName(); -// System.out.println(">>>>>>>>>>>>>>>>>>>>>>\n"); -// System.out.println("1, " + variableName + ":" + expression.isClosureSharedVariable() + "::" + expression.getAccessedVariable()); Parameter[] parametersWithSameVariableName = Arrays.stream(methodNode.getParameters()) .filter(e -> variableName.equals(e.getName())) @@ -304,13 +287,10 @@ public class StaticTypesLambdaWriter extends LambdaWriter { if (parametersWithSameVariableName.length != 1) { throw new GroovyBugError(parametersWithSameVariableName.length + " parameters with same name " + variableName + " found(Expect only one matched)."); } -// System.out.println("2, " + variableName + ":" + parametersWithSameVariableName[0]); expression.setAccessedVariable(parametersWithSameVariableName[0]); expression.setClosureSharedVariable(false); -// System.out.println("<<<<<<<<<<<<<<<<<<<<<<\n"); - } super.visitVariableExpression(expression);
