Repository: groovy Updated Branches: refs/heads/native-lambda 2823724cd -> dbcac60f6
Remove `Lambda` class Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/552e0103 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/552e0103 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/552e0103 Branch: refs/heads/native-lambda Commit: 552e01039aaad874a1409f4029df132817c7b0bb Parents: 2823724 Author: sunlan <sun...@apache.org> Authored: Wed Jan 31 16:35:37 2018 +0800 Committer: sunlan <sun...@apache.org> Committed: Wed Jan 31 16:35:37 2018 +0800 ---------------------------------------------------------------------- src/main/groovy/groovy/lang/Lambda.java | 79 -------------------- .../org/codehaus/groovy/ast/ClassHelper.java | 7 +- .../asm/sc/StaticTypesLambdaWriter.java | 45 +++++------ 3 files changed, 22 insertions(+), 109 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/552e0103/src/main/groovy/groovy/lang/Lambda.java ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/lang/Lambda.java b/src/main/groovy/groovy/lang/Lambda.java deleted file mode 100644 index 6cf2a63..0000000 --- a/src/main/groovy/groovy/lang/Lambda.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package groovy.lang; - -import org.apache.groovy.internal.util.UncheckedThrow; -import org.codehaus.groovy.GroovyBugError; -import org.codehaus.groovy.runtime.InvokerInvocationException; - -import static org.codehaus.groovy.classgen.asm.sc.StaticTypesLambdaWriter.SAM_NAME; - -/** - * Represents any lambda object in Groovy. - * - * @since 3.0.0 - */ -public abstract class Lambda<V> extends Closure<V> { - private Object lambdaObject; - - public Lambda(Object owner, Object thisObject) { - super(owner, thisObject); - } - - /** - * Constructor used when the "this" object for the Lambda is null. - * This is rarely the case in normal Groovy usage. - * - * @param owner the Lambda owner - */ - public Lambda(Object owner) { - super(owner); - } - - @Override - public V call(Object... args) { - String methodName; - try { - methodName = (String) this.getClass().getField(SAM_NAME).get(lambdaObject); - } catch (IllegalAccessException e) { - throw new GroovyBugError("Failed to access field " + SAM_NAME + " of " + this.getClass(), e); - } catch (NoSuchFieldException e) { - throw new GroovyBugError("Failed to find field " + SAM_NAME + " in " + this.getClass(), e); - } - - try { - return (V) getMetaClass().invokeMethod(lambdaObject, methodName, args); - } catch (InvokerInvocationException e) { - UncheckedThrow.rethrow(e.getCause()); - return null; // unreachable statement - } catch (Exception e) { - return (V) throwRuntimeException(e); - } - } - - public Object getLambdaObject() { - return lambdaObject; - } - - public void setLambdaObject(Object lambdaObject) { - this.lambdaObject = lambdaObject; - } - -} http://git-wip-us.apache.org/repos/asf/groovy/blob/552e0103/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 ed984ce..5f5fc3f 100644 --- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java +++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java @@ -24,7 +24,6 @@ import groovy.lang.GString; import groovy.lang.GroovyInterceptable; import groovy.lang.GroovyObject; import groovy.lang.GroovyObjectSupport; -import groovy.lang.Lambda; import groovy.lang.MetaClass; import groovy.lang.Range; import groovy.lang.Reference; @@ -60,7 +59,7 @@ public class ClassHelper { private static final Class[] classes = new Class[]{ Object.class, Boolean.TYPE, Character.TYPE, Byte.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Double.TYPE, Float.TYPE, Void.TYPE, - Closure.class, Lambda.class, GString.class, List.class, Map.class, Range.class, + Closure.class, GString.class, List.class, Map.class, Range.class, Pattern.class, Script.class, String.class, Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, Double.class, Float.class, BigDecimal.class, BigInteger.class, @@ -76,7 +75,7 @@ public class ClassHelper { public static final ClassNode DYNAMIC_TYPE = makeCached(Object.class), OBJECT_TYPE = DYNAMIC_TYPE, VOID_TYPE = makeCached(Void.TYPE), - CLOSURE_TYPE = makeCached(Closure.class), LAMBDA_TYPE = makeCached(Lambda.class), + CLOSURE_TYPE = makeCached(Closure.class), GSTRING_TYPE = makeCached(GString.class), LIST_TYPE = makeWithoutCaching(List.class), MAP_TYPE = makeWithoutCaching(Map.class), RANGE_TYPE = makeCached(Range.class), PATTERN_TYPE = makeCached(Pattern.class), STRING_TYPE = makeCached(String.class), @@ -116,7 +115,7 @@ public class ClassHelper { OBJECT_TYPE, boolean_TYPE, char_TYPE, byte_TYPE, short_TYPE, int_TYPE, long_TYPE, double_TYPE, float_TYPE, - VOID_TYPE, CLOSURE_TYPE, LAMBDA_TYPE, GSTRING_TYPE, + VOID_TYPE, CLOSURE_TYPE, GSTRING_TYPE, LIST_TYPE, MAP_TYPE, RANGE_TYPE, PATTERN_TYPE, SCRIPT_TYPE, STRING_TYPE, Boolean_TYPE, Character_TYPE, Byte_TYPE, Short_TYPE, Integer_TYPE, Long_TYPE, http://git-wip-us.apache.org/repos/asf/groovy/blob/552e0103/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 96a07d8..35d2269 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 @@ -61,7 +61,6 @@ import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC; import static org.objectweb.asm.Opcodes.ALOAD; import static org.objectweb.asm.Opcodes.DUP; import static org.objectweb.asm.Opcodes.INVOKESPECIAL; -import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL; import static org.objectweb.asm.Opcodes.NEW; /** @@ -111,7 +110,7 @@ public class StaticTypesLambdaWriter extends LambdaWriter { ClassNode lambdaWrapperClassNode = getOrAddLambdaClass(expression, ACC_PUBLIC | (isInterface ? ACC_STATIC : 0) | ACC_SYNTHETIC, abstractMethodNode); MethodNode syntheticLambdaMethodNode = lambdaWrapperClassNode.getMethods(DO_CALL).get(0); - BytecodeVariable lambdaWrapperVariable = newGroovyLambdaWrapperAndLoad(lambdaWrapperClassNode, syntheticLambdaMethodNode); + newGroovyLambdaWrapperAndLoad(lambdaWrapperClassNode, syntheticLambdaMethodNode); loadEnclosingClassInstance(); @@ -145,8 +144,6 @@ public class StaticTypesLambdaWriter extends LambdaWriter { (Ljava/lang/Integer;)Ljava/lang/Object; ] DUP <-------------- FIXME ADDED ON PURPOSE, WE SHOULD REMOVE IT AFTER FIND BETTER SOLUTION - DUP <-------------- FIXME ADDED ON PURPOSE, WE SHOULD REMOVE IT AFTER FIND BETTER SOLUTION - DUP <-------------- FIXME ADDED ON PURPOSE, WE SHOULD REMOVE IT AFTER FIND BETTER SOLUTION DUP ALOAD 0 SWAP @@ -159,31 +156,27 @@ public class StaticTypesLambdaWriter extends LambdaWriter { ALOAD 1 POP POP - POP - POP */ mv.visitInsn(DUP); - mv.visitInsn(DUP); - 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(); } - - saveLambdaObjectInWrapper(lambdaWrapperVariable); - operandStack.replace(lambdaType.redirect(), 2); - } - - private void saveLambdaObjectInWrapper(BytecodeVariable lambdaWrapperVariable) { - MethodVisitor mv = controller.getMethodVisitor(); - OperandStack operandStack = controller.getOperandStack(); - - mv.visitInsn(DUP); - operandStack.loadOrStoreVariable(lambdaWrapperVariable, false); - operandStack.swap(); - - mv.visitMethodInsn( - INVOKEVIRTUAL, "groovy/lang/Lambda", "setLambdaObject", "(Ljava/lang/Object;)V", false); } private ClassNode getLambdaType(LambdaExpression expression) { @@ -232,9 +225,9 @@ public class StaticTypesLambdaWriter extends LambdaWriter { Parameter[] lambdaWrapperClassConstructorParameters = constructorNode.getParameters(); mv.visitMethodInsn(INVOKESPECIAL, lambdaWrapperClassInternalName, INIT, BytecodeHelper.getMethodDescriptor(ClassHelper.VOID_TYPE, lambdaWrapperClassConstructorParameters), lambdaWrapperClassNode.isInterface()); OperandStack operandStack = controller.getOperandStack(); - operandStack.replace(ClassHelper.LAMBDA_TYPE, lambdaWrapperClassConstructorParameters.length); + operandStack.replace(ClassHelper.CLOSURE_TYPE, lambdaWrapperClassConstructorParameters.length); - BytecodeVariable variable = controller.getCompileStack().defineVariable(new VariableExpression(LAMBDA_WRAPPER, ClassHelper.LAMBDA_TYPE), false); + BytecodeVariable variable = controller.getCompileStack().defineVariable(new VariableExpression(LAMBDA_WRAPPER, ClassHelper.CLOSURE_TYPE), false); operandStack.storeVar(variable); operandStack.loadOrStoreVariable(variable, false); @@ -315,7 +308,7 @@ public class StaticTypesLambdaWriter extends LambdaWriter { String name = genLambdaClassName(); boolean staticMethodOrInStaticClass = controller.isStaticMethod() || classNode.isStaticClass(); - InnerClassNode answer = new InnerClassNode(classNode, name, mods, ClassHelper.LAMBDA_TYPE.getPlainNodeReference()); + InnerClassNode answer = new InnerClassNode(classNode, name, mods, ClassHelper.CLOSURE_TYPE.getPlainNodeReference()); answer.setEnclosingMethod(controller.getMethodNode()); answer.setSynthetic(true); answer.setUsingGenerics(outerClass.isUsingGenerics());