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());

Reply via email to