Repository: groovy Updated Branches: refs/heads/native-lambda dffe45b54 -> 005aa6c05
Update the comment on the workaround Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/005aa6c0 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/005aa6c0 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/005aa6c0 Branch: refs/heads/native-lambda Commit: 005aa6c0594ccacc6d0322f6633d74ee54ad18eb Parents: dffe45b Author: sunlan <[email protected]> Authored: Tue Feb 6 08:32:22 2018 +0800 Committer: sunlan <[email protected]> Committed: Tue Feb 6 08:32:35 2018 +0800 ---------------------------------------------------------------------- .../asm/sc/StaticTypesLambdaWriter.java | 53 ++++++++------------ 1 file changed, 21 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/005aa6c0/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 ab9d0f3..ab45f9c 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 @@ -130,53 +130,42 @@ public class StaticTypesLambdaWriter extends LambdaWriter { if (null != expression.getNodeMetaData(INFERRED_LAMBDA_TYPE)) { // FIXME declaring variable whose initial value is a lambda, e.g. `Function<Integer, String> f = (Integer e) -> 'a' + e` - // Groovy will `POP` multiple times...(expecting `POP` only once), as a hack, `DUP` to duplicate the element of operand stack: + // Groovy will `POP` automatically, use `DUP` to duplicate the element of operand stack: /* - L2 - ASTORE 0 - ALOAD 0 - ACONST_NULL INVOKEDYNAMIC apply(LTest1$_p_lambda1;LTest1;)Ljava/util/function/Function; [ // handle kind 0x6 : 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; // arguments: (Ljava/lang/Object;)Ljava/lang/Object;, // handle kind 0x5 : INVOKEVIRTUAL - Test1$_p_lambda1.doCall(LTest1;Ljava/lang/Integer;)Ljava/lang/Object;, - (Ljava/lang/Integer;)Ljava/lang/Object; + Test1$_p_lambda1.doCall(LTest1;Ljava/lang/Integer;)Ljava/lang/String;, + (Ljava/lang/Integer;)Ljava/lang/String; ] - DUP <-------------- FIXME ADDED ON PURPOSE, WE SHOULD REMOVE IT AFTER FIND BETTER SOLUTION - DUP + DUP <-------------- FIXME ADDED ON PURPOSE, WE SHOULD REMOVE IT AFTER FIND BETTER SOLUTION + ASTORE 0 + L2 ALOAD 0 - SWAP - INVOKEVIRTUAL groovy/lang/Lambda.setLambdaObject (Ljava/lang/Object;)V - LDC Ljava/util/function/Function;.class - INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType (Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; - CHECKCAST java/util/function/Function - ASTORE 1 - L3 - ALOAD 1 - POP + POP <-------------- Since operand stack is not empty, the `POP`s are issued by `controller.getOperandStack().popDownTo(mark);` in the method `org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement`, but when we try to `operandStack.pop();` instead of `mv.visitInsn(DUP);`, we will get AIOOBE... POP */ mv.visitInsn(DUP); /* -org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: -General error during class generation: size==0 - -java.lang.ArrayIndexOutOfBoundsException: size==0 - at org.codehaus.groovy.classgen.asm.OperandStack.getTopOperand(OperandStack.java:693) - at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.evaluateEqual(BinaryExpressionHelper.java:397) - at org.codehaus.groovy.classgen.asm.sc.StaticTypesBinaryExpressionMultiTypeDispatcher.evaluateEqual(StaticTypesBinaryExpressionMultiTypeDispatcher.java:179) - at org.codehaus.groovy.classgen.AsmClassGenerator.visitDeclarationExpression(AsmClassGenerator.java:694) - at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89) - at org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:633) - at org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:681) - at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42) - */ -// operandStack.pop(); + org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: + General error during class generation: size==0 + + java.lang.ArrayIndexOutOfBoundsException: size==0 + at org.codehaus.groovy.classgen.asm.OperandStack.getTopOperand(OperandStack.java:693) + at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.evaluateEqual(BinaryExpressionHelper.java:397) + at org.codehaus.groovy.classgen.asm.sc.StaticTypesBinaryExpressionMultiTypeDispatcher.evaluateEqual(StaticTypesBinaryExpressionMultiTypeDispatcher.java:179) + at org.codehaus.groovy.classgen.AsmClassGenerator.visitDeclarationExpression(AsmClassGenerator.java:694) + at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89) + at org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:633) + at org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:681) + at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42) + */ + // operandStack.pop(); } }
