You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2018/02/06 09:10:26 UTC

[1/6] groovy git commit: Minor refactoring: remove the duplicated code

Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_6_X f08bb6bc3 -> 0d9733bed


Minor refactoring: remove the duplicated code

(cherry picked from commit ae713cb)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/eb75c425
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/eb75c425
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/eb75c425

Branch: refs/heads/GROOVY_2_6_X
Commit: eb75c4257d7f052a0ae1df807e35a2be8049ee07
Parents: f08bb6b
Author: sunlan <su...@apache.org>
Authored: Tue Feb 6 08:57:16 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Tue Feb 6 17:09:25 2018 +0800

----------------------------------------------------------------------
 .../groovy/classgen/asm/BytecodeHelper.java     | 46 ++++++++++---------
 .../groovy/classgen/asm/OperandStack.java       | 47 ++++++--------------
 2 files changed, 40 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/eb75c425/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
index d9eea08..491cd7b 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -508,26 +508,6 @@ public class BytecodeHelper implements Opcodes {
         ret.append(end);
     }
 
-    public static void load(MethodVisitor mv, ClassNode type, int idx) {
-        if (type == ClassHelper.double_TYPE) {
-            mv.visitVarInsn(DLOAD, idx);
-        } else if (type == ClassHelper.float_TYPE) {
-            mv.visitVarInsn(FLOAD, idx);
-        } else if (type == ClassHelper.long_TYPE) {
-            mv.visitVarInsn(LLOAD, idx);
-        } else if (
-                type == ClassHelper.boolean_TYPE
-                        || type == ClassHelper.char_TYPE
-                        || type == ClassHelper.byte_TYPE
-                        || type == ClassHelper.int_TYPE
-                        || type == ClassHelper.short_TYPE) {
-            mv.visitVarInsn(ILOAD, idx);
-        } else {
-            mv.visitVarInsn(ALOAD, idx);
-        }
-    }
-    
-
     public static void doCast(MethodVisitor mv, ClassNode type) {
         if (type == ClassHelper.OBJECT_TYPE) return;
         if (ClassHelper.isPrimitiveType(type) && type != ClassHelper.VOID_TYPE) {
@@ -748,4 +728,30 @@ public class BytecodeHelper implements Opcodes {
         mv.visitLabel(trueLabel);
     }
 
+    public static void load(MethodVisitor mv, ClassNode type, int idx) {
+        storeOrLoadVar(mv, idx, type, DLOAD, FLOAD, LLOAD, ILOAD, ALOAD);
+    }
+
+    static void store(MethodVisitor mv, ClassNode type, int idx) {
+        storeOrLoadVar(mv, idx, type, DSTORE, FSTORE, LSTORE, ISTORE, ASTORE);
+    }
+
+    private static void storeOrLoadVar(MethodVisitor mv, int idx, ClassNode type, int dVarInsn, int fVarInsn, int lVarInsn, int iVarInsn, int aVarInsn) {
+        if (type == ClassHelper.double_TYPE) {
+            mv.visitVarInsn(dVarInsn, idx);
+        } else if (type == ClassHelper.float_TYPE) {
+            mv.visitVarInsn(fVarInsn, idx);
+        } else if (type == ClassHelper.long_TYPE) {
+            mv.visitVarInsn(lVarInsn, idx);
+        } else if (
+                type == ClassHelper.boolean_TYPE
+                        || type == ClassHelper.char_TYPE
+                        || type == ClassHelper.byte_TYPE
+                        || type == ClassHelper.int_TYPE
+                        || type == ClassHelper.short_TYPE) {
+            mv.visitVarInsn(iVarInsn, idx);
+        } else {
+            mv.visitVarInsn(aVarInsn, idx);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/eb75c425/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java b/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
index 213a82b..9ba551e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/OperandStack.java
@@ -39,7 +39,6 @@ import java.util.List;
 
 import static org.objectweb.asm.Opcodes.ACONST_NULL;
 import static org.objectweb.asm.Opcodes.ALOAD;
-import static org.objectweb.asm.Opcodes.ASTORE;
 import static org.objectweb.asm.Opcodes.BIPUSH;
 import static org.objectweb.asm.Opcodes.CHECKCAST;
 import static org.objectweb.asm.Opcodes.D2F;
@@ -47,7 +46,6 @@ import static org.objectweb.asm.Opcodes.D2I;
 import static org.objectweb.asm.Opcodes.D2L;
 import static org.objectweb.asm.Opcodes.DCONST_0;
 import static org.objectweb.asm.Opcodes.DCONST_1;
-import static org.objectweb.asm.Opcodes.DSTORE;
 import static org.objectweb.asm.Opcodes.DUP;
 import static org.objectweb.asm.Opcodes.DUP2;
 import static org.objectweb.asm.Opcodes.DUP2_X1;
@@ -59,7 +57,6 @@ import static org.objectweb.asm.Opcodes.F2L;
 import static org.objectweb.asm.Opcodes.FCONST_0;
 import static org.objectweb.asm.Opcodes.FCONST_1;
 import static org.objectweb.asm.Opcodes.FCONST_2;
-import static org.objectweb.asm.Opcodes.FSTORE;
 import static org.objectweb.asm.Opcodes.GETSTATIC;
 import static org.objectweb.asm.Opcodes.I2B;
 import static org.objectweb.asm.Opcodes.I2C;
@@ -75,13 +72,11 @@ import static org.objectweb.asm.Opcodes.ICONST_4;
 import static org.objectweb.asm.Opcodes.ICONST_5;
 import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
 import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
-import static org.objectweb.asm.Opcodes.ISTORE;
 import static org.objectweb.asm.Opcodes.L2D;
 import static org.objectweb.asm.Opcodes.L2F;
 import static org.objectweb.asm.Opcodes.L2I;
 import static org.objectweb.asm.Opcodes.LCONST_0;
 import static org.objectweb.asm.Opcodes.LCONST_1;
-import static org.objectweb.asm.Opcodes.LSTORE;
 import static org.objectweb.asm.Opcodes.NEW;
 import static org.objectweb.asm.Opcodes.POP;
 import static org.objectweb.asm.Opcodes.POP2;
@@ -278,16 +273,23 @@ public class OperandStack {
      * replace top level element with new element of given type
      */
     public void replace(ClassNode type) {
+        int size = ensureStackNotEmpty(stack);
+        stack.set(size - 1, type);
+    }
+
+    private int ensureStackNotEmpty(List<ClassNode> stack) {
         int size = stack.size();
+
         try {
-            if (size==0) throw new ArrayIndexOutOfBoundsException("size==0");
+            if (size == 0) throw new ArrayIndexOutOfBoundsException("size==0");
         } catch (ArrayIndexOutOfBoundsException ai) {
-            System.err.println("index problem in "+controller.getSourceUnit().getName());
+            System.err.println("index problem in " + controller.getSourceUnit().getName());
             throw ai;
         }
-        stack.set(size-1, type);
+
+        return size;
     }
-    
+
     /**
      * replace n top level elements with new element of given type
      */
@@ -650,22 +652,7 @@ public class OperandStack {
             mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V", false);
         } else {
             doGroovyCast(type);
-            if (type == ClassHelper.double_TYPE) {
-                mv.visitVarInsn(DSTORE, idx);
-            } else if (type == ClassHelper.float_TYPE) {
-                mv.visitVarInsn(FSTORE, idx);
-            } else if (type == ClassHelper.long_TYPE) {
-                mv.visitVarInsn(LSTORE, idx);
-            } else if (
-                    type == ClassHelper.boolean_TYPE
-                            || type == ClassHelper.char_TYPE
-                            || type == ClassHelper.byte_TYPE
-                            || type == ClassHelper.int_TYPE
-                            || type == ClassHelper.short_TYPE) {
-                mv.visitVarInsn(ISTORE, idx);
-            } else {
-                mv.visitVarInsn(ASTORE, idx);
-            }
+            BytecodeHelper.store(mv, type, idx);
         }
         // remove RHS value from operand stack
         remove(1);
@@ -688,13 +675,7 @@ public class OperandStack {
     }
 
     public ClassNode getTopOperand() {
-        int size = stack.size();
-        try {
-            if (size==0) throw new ArrayIndexOutOfBoundsException("size==0");
-        } catch (ArrayIndexOutOfBoundsException ai) {
-            System.err.println("index problem in "+controller.getSourceUnit().getName());
-            throw ai;
-        }
-        return stack.get(size-1);
+        int size = ensureStackNotEmpty(stack);
+        return stack.get(size - 1);
     }
 }


[5/6] groovy git commit: Minor refactoring: remove the duplicated code further

Posted by su...@apache.org.
Minor refactoring: remove the duplicated code further

(cherry picked from commit e0c3cdf)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/c46f9fcd
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/c46f9fcd
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/c46f9fcd

Branch: refs/heads/GROOVY_2_6_X
Commit: c46f9fcd9b6f1b6cf03fc55c756817c54b8a2b95
Parents: 15da82d
Author: sunlan <su...@apache.org>
Authored: Tue Feb 6 16:03:41 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Tue Feb 6 17:09:46 2018 +0800

----------------------------------------------------------------------
 .../groovy/classgen/asm/BytecodeHelper.java     | 44 ++++++------------
 .../classgen/asm/util/TypeDescriptionUtil.java  | 47 ++++++++++++++++----
 2 files changed, 53 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/c46f9fcd/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
index 4b812f1..a983af4 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -163,30 +163,23 @@ public class BytecodeHelper implements Opcodes {
      * @return the ASM type description
      */
     private static String getTypeDescription(ClassNode c, boolean end) {
-        StringBuilder buf = new StringBuilder();
         ClassNode d = c;
-        while (true) {
-            if (ClassHelper.isPrimitiveType(d.redirect())) {
-                d = d.redirect();
-                buf.append(TypeDescriptionUtil.getDescriptionByType(d));
-                return buf.toString();
-            } else if (d.isArray()) {
-                buf.append('[');
-                d = d.getComponentType();
-            } else {
-                buf.append('L');
-                String name = d.getName();
-                int len = name.length();
-                for (int i = 0; i < len; ++i) {
-                    char car = name.charAt(i);
-                    buf.append(car == '.' ? '/' : car);
-                }
-                if (end) buf.append(';');
-                return buf.toString();
+        if (ClassHelper.isPrimitiveType(d.redirect())) {
+            d = d.redirect();
+        }
+
+        String desc = TypeDescriptionUtil.getDescriptionByType(d);
+
+        if (!end) {
+            if (desc.endsWith(";")) {
+                desc = desc.substring(0, desc.length() - 1);
             }
         }
+
+        return desc;
     }
 
+
     /**
      * @return an array of ASM internal names of the type
      */
@@ -267,16 +260,7 @@ public class BytecodeHelper implements Opcodes {
             return "java.lang.Object;";
         }
 
-        if (name.equals("int")
-                || name.equals("long")
-                || name.equals("short")
-                || name.equals("float")
-                || name.equals("double")
-                || name.equals("byte")
-                || name.equals("char")
-                || name.equals("boolean")
-                || name.equals("void")
-                ) {
+        if (TypeDescriptionUtil.isPrimitiveType(name)) {
             return name;
         }
 
@@ -297,7 +281,7 @@ public class BytecodeHelper implements Opcodes {
             prefix = "[";
             name = name.substring(0, name.length() - 2);
 
-            return prefix + TypeDescriptionUtil.getDescriptionByName(name) + (TypeDescriptionUtil.isPrimitiveType(name) ? "" : name.replace('/', '.') + ";");
+            return prefix + TypeDescriptionUtil.getDescriptionByName(name);
         }
 
         return name.replace('/', '.');

http://git-wip-us.apache.org/repos/asf/groovy/blob/c46f9fcd/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java b/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
index 18a6e8d..2f7349a 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
@@ -19,6 +19,7 @@
 
 package org.codehaus.groovy.classgen.asm.util;
 
+import groovy.lang.Tuple2;
 import org.apache.groovy.util.Maps;
 import org.codehaus.groovy.ast.ClassNode;
 
@@ -34,6 +35,9 @@ import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
 
+/**
+ * A utility for extracting type description
+ */
 public class TypeDescriptionUtil {
     private static final String REF_DESCRIPTION = "L";
     private static final Map<ClassNode, String> TYPE_TO_DESCRIPTION_MAP = Maps.of(
@@ -69,21 +73,48 @@ public class TypeDescriptionUtil {
     }
 
     public static String getDescriptionByType(ClassNode type) {
-        if (null == type) {
-            return REF_DESCRIPTION;
-        }
-
         String desc = TYPE_TO_DESCRIPTION_MAP.get(type);
 
-        return null == desc ? REF_DESCRIPTION : desc;
+        if (null == desc) { // reference type
+            if (!type.isArray()) {
+                return makeRefDescription(type.getName());
+            }
+
+            StringBuilder arrayDescription = new StringBuilder(32);
+            Tuple2<ClassNode, Integer> arrayInfo = extractArrayInfo(type);
+
+            for (int i = 0, dimension = arrayInfo.getSecond(); i < dimension; i++) {
+                arrayDescription.append("[");
+            }
+
+            ClassNode componentType = arrayInfo.getFirst();
+            return arrayDescription.append(getDescriptionByType(componentType)).toString();
+        }
+
+        return desc;
     }
 
     public static String getDescriptionByName(String name) {
-        if (null == name) {
-            return REF_DESCRIPTION;
+        ClassNode type = NAME_TO_TYPE_MAP.get(name);
+
+        if (null == type) {
+            return makeRefDescription(name);
         }
 
-        return getDescriptionByType(NAME_TO_TYPE_MAP.get(name));
+        return getDescriptionByType(type);
+    }
+
+    private static String makeRefDescription(String name) {
+        return REF_DESCRIPTION + name.replace('.', '/') + ";";
     }
 
+    private static Tuple2<ClassNode, Integer> extractArrayInfo(ClassNode type) {
+        int dimension = 0;
+
+        do {
+            dimension++;
+        } while ((type = type.getComponentType()).isArray());
+
+        return new Tuple2<ClassNode, Integer>(type, dimension);
+    }
 }


[6/6] groovy git commit: Minor refactoring: remove the duplicated code further

Posted by su...@apache.org.
Minor refactoring: remove the duplicated code further

(cherry picked from commit 6b208c1)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/0d9733be
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/0d9733be
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/0d9733be

Branch: refs/heads/GROOVY_2_6_X
Commit: 0d9733bed475fe1fb2bb2ec1cad511878472dbbe
Parents: c46f9fc
Author: sunlan <su...@apache.org>
Authored: Tue Feb 6 16:37:16 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Tue Feb 6 17:09:50 2018 +0800

----------------------------------------------------------------------
 .../groovy/classgen/asm/BytecodeHelper.java     | 29 ++++++--------------
 1 file changed, 9 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/0d9733be/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
index a983af4..25fa258 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -124,24 +124,15 @@ public class BytecodeHelper implements Opcodes {
      * @return the ASM type description for class loading
      */
     public static String getClassLoadingTypeDescription(ClassNode c) {
-        StringBuilder buf = new StringBuilder();
-        boolean array = false;
-        while (true) {
-            if (c.isArray()) {
-                buf.append('[');
-                c = c.getComponentType();
-                array = true;
-            } else {
-                if (ClassHelper.isPrimitiveType(c)) {
-                    buf.append(getTypeDescription(c));
-                } else {
-                    if (array) buf.append('L');
-                    buf.append(c.getName());
-                    if (array) buf.append(';');
-                }
-                return buf.toString();
+        String desc = TypeDescriptionUtil.getDescriptionByType(c);
+
+        if (!c.isArray()) {
+            if (desc.startsWith("L") && desc.endsWith(";")) {
+                desc = desc.substring(1, desc.length() - 1); // remove "L" and ";"
             }
         }
+
+        return desc.replace('/', '.');
     }
 
     /**
@@ -170,10 +161,8 @@ public class BytecodeHelper implements Opcodes {
 
         String desc = TypeDescriptionUtil.getDescriptionByType(d);
 
-        if (!end) {
-            if (desc.endsWith(";")) {
-                desc = desc.substring(0, desc.length() - 1);
-            }
+        if (!end && desc.endsWith(";")) {
+            desc = desc.substring(0, desc.length() - 1);
         }
 
         return desc;


[3/6] groovy git commit: Minor refactoring: remove the duplicated code further

Posted by su...@apache.org.
Minor refactoring: remove the duplicated code further

(cherry picked from commit 314738a)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/160cb076
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/160cb076
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/160cb076

Branch: refs/heads/GROOVY_2_6_X
Commit: 160cb076144c8a3c69e436cc22910be23a664c76
Parents: 3da3673
Author: sunlan <su...@apache.org>
Authored: Tue Feb 6 11:25:39 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Tue Feb 6 17:09:35 2018 +0800

----------------------------------------------------------------------
 .../org/codehaus/groovy/ast/ClassHelper.java    | 11 +--
 .../groovy/classgen/asm/BytecodeHelper.java     | 84 +++++++-----------
 .../classgen/asm/util/TypeDescriptionUtil.java  | 89 ++++++++++++++++++++
 3 files changed, 120 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/160cb076/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 98a1ba2..3626242 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
@@ -28,6 +28,7 @@ import groovy.lang.MetaClass;
 import groovy.lang.Range;
 import groovy.lang.Reference;
 import groovy.lang.Script;
+import org.codehaus.groovy.classgen.asm.util.TypeDescriptionUtil;
 import org.codehaus.groovy.runtime.GeneratedClosure;
 import org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport;
 import org.codehaus.groovy.transform.trait.Traits;
@@ -321,15 +322,7 @@ public class ClassHelper {
      * @see #make(String)
      */
     public static boolean isPrimitiveType(ClassNode cn) {
-        return cn == boolean_TYPE ||
-                cn == char_TYPE ||
-                cn == byte_TYPE ||
-                cn == short_TYPE ||
-                cn == int_TYPE ||
-                cn == long_TYPE ||
-                cn == float_TYPE ||
-                cn == double_TYPE ||
-                cn == VOID_TYPE;
+        return TypeDescriptionUtil.isPrimitiveType(cn);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/groovy/blob/160cb076/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
index 7ebdc3a..4b812f1 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -25,6 +25,7 @@ import org.codehaus.groovy.ast.GenericsType;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.decompiled.DecompiledClassNode;
+import org.codehaus.groovy.classgen.asm.util.TypeDescriptionUtil;
 import org.codehaus.groovy.reflection.ReflectionCache;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.objectweb.asm.Label;
@@ -33,6 +34,16 @@ import org.objectweb.asm.Opcodes;
 
 import java.lang.reflect.Modifier;
 
+import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.boolean_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.byte_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.char_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.float_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
+
 /**
  * A helper class for bytecode generation with AsmClassGenerator.
  *
@@ -157,27 +168,7 @@ public class BytecodeHelper implements Opcodes {
         while (true) {
             if (ClassHelper.isPrimitiveType(d.redirect())) {
                 d = d.redirect();
-                char car;
-                if (d == ClassHelper.int_TYPE) {
-                    car = 'I';
-                } else if (d == ClassHelper.VOID_TYPE) {
-                    car = 'V';
-                } else if (d == ClassHelper.boolean_TYPE) {
-                    car = 'Z';
-                } else if (d == ClassHelper.byte_TYPE) {
-                    car = 'B';
-                } else if (d == ClassHelper.char_TYPE) {
-                    car = 'C';
-                } else if (d == ClassHelper.short_TYPE) {
-                    car = 'S';
-                } else if (d == ClassHelper.double_TYPE) {
-                    car = 'D';
-                } else if (d == ClassHelper.float_TYPE) {
-                    car = 'F';
-                } else /* long */ {
-                    car = 'J';
-                }
-                buf.append(car);
+                buf.append(TypeDescriptionUtil.getDescriptionByType(d));
                 return buf.toString();
             } else if (d.isArray()) {
                 buf.append('[');
@@ -305,28 +296,11 @@ public class BytecodeHelper implements Opcodes {
         if (name.endsWith("[]")) { // todo need process multi
             prefix = "[";
             name = name.substring(0, name.length() - 2);
-            if (name.equals("int")) {
-                return prefix + "I";
-            } else if (name.equals("long")) {
-                return prefix + "J";
-            } else if (name.equals("short")) {
-                return prefix + "S";
-            } else if (name.equals("float")) {
-                return prefix + "F";
-            } else if (name.equals("double")) {
-                return prefix + "D";
-            } else if (name.equals("byte")) {
-                return prefix + "B";
-            } else if (name.equals("char")) {
-                return prefix + "C";
-            } else if (name.equals("boolean")) {
-                return prefix + "Z";
-            } else {
-                return prefix + "L" + name.replace('/', '.') + ";";
-            }
+
+            return prefix + TypeDescriptionUtil.getDescriptionByName(name) + (TypeDescriptionUtil.isPrimitiveType(name) ? "" : name.replace('/', '.') + ";");
         }
-        return name.replace('/', '.');
 
+        return name.replace('/', '.');
     }
 
     /*public void dup() {
@@ -487,7 +461,7 @@ public class BytecodeHelper implements Opcodes {
 
     public static void doCast(MethodVisitor mv, ClassNode type) {
         if (type == ClassHelper.OBJECT_TYPE) return;
-        if (ClassHelper.isPrimitiveType(type) && type != ClassHelper.VOID_TYPE) {
+        if (ClassHelper.isPrimitiveType(type) && type != VOID_TYPE) {
             unbox(mv, type);
         } else {
             mv.visitTypeInsn(
@@ -639,22 +613,22 @@ public class BytecodeHelper implements Opcodes {
      * @param type primitive type to convert
      */
     public static void convertPrimitiveToBoolean(MethodVisitor mv, ClassNode type) {
-        if (type == ClassHelper.boolean_TYPE) {
+        if (type == boolean_TYPE) {
             return;
         }
         // Special handling is done for floating point types in order to
         // handle checking for 0 or NaN values.
-        if (type == ClassHelper.double_TYPE) {
+        if (type == double_TYPE) {
             convertDoubleToBoolean(mv);
             return;
-        } else if (type == ClassHelper.float_TYPE) {
+        } else if (type == float_TYPE) {
             convertFloatToBoolean(mv);
             return;
         }
         Label trueLabel = new Label();
         Label falseLabel = new Label();
         // Convert long to int for IFEQ comparison using LCMP
-        if (type==ClassHelper.long_TYPE) {
+        if (type== long_TYPE) {
             mv.visitInsn(LCONST_0);
             mv.visitInsn(LCMP);
         }
@@ -846,20 +820,20 @@ public class BytecodeHelper implements Opcodes {
         }
 
         public void handle() {
-            if (type == ClassHelper.double_TYPE) {
+            if (type == double_TYPE) {
                 handleDoubleType();
-            } else if (type == ClassHelper.float_TYPE) {
+            } else if (type == float_TYPE) {
                 handleFloatType();
-            } else if (type == ClassHelper.long_TYPE) {
+            } else if (type == long_TYPE) {
                 handleLongType();
             } else if (
-                    type == ClassHelper.boolean_TYPE
-                            || type == ClassHelper.char_TYPE
-                            || type == ClassHelper.byte_TYPE
-                            || type == ClassHelper.int_TYPE
-                            || type == ClassHelper.short_TYPE) {
+                    type == boolean_TYPE
+                            || type == char_TYPE
+                            || type == byte_TYPE
+                            || type == int_TYPE
+                            || type == short_TYPE) {
                 handleIntType();
-            } else if (type == ClassHelper.VOID_TYPE) {
+            } else if (type == VOID_TYPE) {
                 handleVoidType();
             } else {
                 handleRefType();

http://git-wip-us.apache.org/repos/asf/groovy/blob/160cb076/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java b/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
new file mode 100644
index 0000000..18a6e8d
--- /dev/null
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
@@ -0,0 +1,89 @@
+/*
+ *  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 org.codehaus.groovy.classgen.asm.util;
+
+import org.apache.groovy.util.Maps;
+import org.codehaus.groovy.ast.ClassNode;
+
+import java.util.Map;
+
+import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.boolean_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.byte_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.char_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.float_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
+
+public class TypeDescriptionUtil {
+    private static final String REF_DESCRIPTION = "L";
+    private static final Map<ClassNode, String> TYPE_TO_DESCRIPTION_MAP = Maps.of(
+            int_TYPE, "I",
+            VOID_TYPE,"V",
+            boolean_TYPE, "Z",
+            byte_TYPE, "B",
+            char_TYPE, "C",
+            short_TYPE, "S",
+            double_TYPE, "D",
+            float_TYPE, "F",
+            long_TYPE, "J"
+    );
+
+    private static final Map<String, ClassNode> NAME_TO_TYPE_MAP = Maps.of(
+            "int", int_TYPE,
+            "void", VOID_TYPE,
+            "boolean", boolean_TYPE,
+            "byte", byte_TYPE,
+            "char", char_TYPE,
+            "short", short_TYPE,
+            "double", double_TYPE,
+            "float", float_TYPE,
+            "long", long_TYPE
+    );
+
+    public static boolean isPrimitiveType(String name) {
+        return NAME_TO_TYPE_MAP.containsKey(name);
+    }
+
+    public static boolean isPrimitiveType(ClassNode type) {
+        return TYPE_TO_DESCRIPTION_MAP.containsKey(type);
+    }
+
+    public static String getDescriptionByType(ClassNode type) {
+        if (null == type) {
+            return REF_DESCRIPTION;
+        }
+
+        String desc = TYPE_TO_DESCRIPTION_MAP.get(type);
+
+        return null == desc ? REF_DESCRIPTION : desc;
+    }
+
+    public static String getDescriptionByName(String name) {
+        if (null == name) {
+            return REF_DESCRIPTION;
+        }
+
+        return getDescriptionByType(NAME_TO_TYPE_MAP.get(name));
+    }
+
+}


[4/6] groovy git commit: Bump gradle version to 4.5.1

Posted by su...@apache.org.
Bump gradle version to 4.5.1

(cherry picked from commit f3990c1)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/15da82d0
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/15da82d0
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/15da82d0

Branch: refs/heads/GROOVY_2_6_X
Commit: 15da82d08a2786a5bad93284c06bfbd49ccb479b
Parents: 160cb07
Author: sunlan <su...@apache.org>
Authored: Tue Feb 6 11:27:00 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Tue Feb 6 17:09:42 2018 +0800

----------------------------------------------------------------------
 gradle.properties                        | 2 +-
 gradle/wrapper/gradle-wrapper.properties | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/15da82d0/gradle.properties
----------------------------------------------------------------------
diff --git a/gradle.properties b/gradle.properties
index edffe2c..0a11b60 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -17,7 +17,7 @@ groovyVersion = 2.6.0-SNAPSHOT
 # bundle version format: major('.'minor('.'micro('.'qualifier)?)?)? (first 3 only digits)
 groovyBundleVersion = 2.6.0.SNAPSHOT
 
-gradle_version=4.5
+gradle_version=4.5.1
 
 groovyJUnit_ms=512m
 groovyJUnit_mx=1g

http://git-wip-us.apache.org/repos/asf/groovy/blob/15da82d0/gradle/wrapper/gradle-wrapper.properties
----------------------------------------------------------------------
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index be280be..568c50b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip


[2/6] groovy git commit: Minor refactoring: remove the duplicated code further

Posted by su...@apache.org.
Minor refactoring: remove the duplicated code further

(cherry picked from commit 871df9b)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3da36731
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3da36731
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3da36731

Branch: refs/heads/GROOVY_2_6_X
Commit: 3da3673187f29b031ea74426a628c5928babd4fa
Parents: eb75c42
Author: sunlan <su...@apache.org>
Authored: Tue Feb 6 09:54:36 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Tue Feb 6 17:09:29 2018 +0800

----------------------------------------------------------------------
 .../groovy/classgen/asm/BytecodeHelper.java     | 216 +++++++++++++++----
 1 file changed, 170 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/3da36731/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
index 491cd7b..7ebdc3a 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -333,29 +333,6 @@ public class BytecodeHelper implements Opcodes {
         mv.visitInsn(DUP);
     }*/
 
-    public static void doReturn(MethodVisitor mv, ClassNode returnType) {
-        if (returnType == ClassHelper.double_TYPE) {
-            mv.visitInsn(DRETURN);
-        } else if (returnType == ClassHelper.float_TYPE) {
-            mv.visitInsn(FRETURN);
-        } else if (returnType == ClassHelper.long_TYPE) {
-            mv.visitInsn(LRETURN);
-        } else if (
-                returnType == ClassHelper.boolean_TYPE
-                        || returnType == ClassHelper.char_TYPE
-                        || returnType == ClassHelper.byte_TYPE
-                        || returnType == ClassHelper.int_TYPE
-                        || returnType == ClassHelper.short_TYPE) {
-            //byte,short,boolean,int are all IRETURN
-            mv.visitInsn(IRETURN);
-        } else if (returnType == ClassHelper.VOID_TYPE) {
-            mv.visitInsn(RETURN);
-        } else {
-            mv.visitInsn(ARETURN);
-        }
-
-    }
-
     private static boolean hasGenerics(Parameter[] param) {
         if (param.length == 0) return false;
         for (int i = 0; i < param.length; i++) {
@@ -668,10 +645,10 @@ public class BytecodeHelper implements Opcodes {
         // Special handling is done for floating point types in order to
         // handle checking for 0 or NaN values.
         if (type == ClassHelper.double_TYPE) {
-            convertDoubleToBoolean(mv, type);
+            convertDoubleToBoolean(mv);
             return;
         } else if (type == ClassHelper.float_TYPE) {
-            convertFloatToBoolean(mv, type);
+            convertFloatToBoolean(mv);
             return;
         }
         Label trueLabel = new Label();
@@ -690,7 +667,7 @@ public class BytecodeHelper implements Opcodes {
         mv.visitLabel(trueLabel);
     }
 
-    private static void convertDoubleToBoolean(MethodVisitor mv, ClassNode type) {
+    private static void convertDoubleToBoolean(MethodVisitor mv) {
         Label trueLabel = new Label();
         Label falseLabel = new Label();
         Label falseLabelWithPop = new Label();
@@ -709,7 +686,7 @@ public class BytecodeHelper implements Opcodes {
         mv.visitLabel(trueLabel);
     }
 
-    private static void convertFloatToBoolean(MethodVisitor mv, ClassNode type) {
+    private static void convertFloatToBoolean(MethodVisitor mv) {
         Label trueLabel = new Label();
         Label falseLabel = new Label();
         Label falseLabelWithPop = new Label();
@@ -728,30 +705,177 @@ public class BytecodeHelper implements Opcodes {
         mv.visitLabel(trueLabel);
     }
 
+    public static void doReturn(MethodVisitor mv, ClassNode type) {
+        new ReturnVarHandler(mv, type).handle();
+    }
+
     public static void load(MethodVisitor mv, ClassNode type, int idx) {
-        storeOrLoadVar(mv, idx, type, DLOAD, FLOAD, LLOAD, ILOAD, ALOAD);
+        new LoadVarHandler(mv, type, idx).handle();
     }
 
-    static void store(MethodVisitor mv, ClassNode type, int idx) {
-        storeOrLoadVar(mv, idx, type, DSTORE, FSTORE, LSTORE, ISTORE, ASTORE);
+    public static void store(MethodVisitor mv, ClassNode type, int idx) {
+        new StoreVarHandler(mv, type, idx).handle();
     }
 
-    private static void storeOrLoadVar(MethodVisitor mv, int idx, ClassNode type, int dVarInsn, int fVarInsn, int lVarInsn, int iVarInsn, int aVarInsn) {
-        if (type == ClassHelper.double_TYPE) {
-            mv.visitVarInsn(dVarInsn, idx);
-        } else if (type == ClassHelper.float_TYPE) {
-            mv.visitVarInsn(fVarInsn, idx);
-        } else if (type == ClassHelper.long_TYPE) {
-            mv.visitVarInsn(lVarInsn, idx);
-        } else if (
-                type == ClassHelper.boolean_TYPE
-                        || type == ClassHelper.char_TYPE
-                        || type == ClassHelper.byte_TYPE
-                        || type == ClassHelper.int_TYPE
-                        || type == ClassHelper.short_TYPE) {
-            mv.visitVarInsn(iVarInsn, idx);
-        } else {
-            mv.visitVarInsn(aVarInsn, idx);
+    private static class ReturnVarHandler extends PrimitiveTypeHandler {
+        private MethodVisitor mv;
+
+        public ReturnVarHandler(MethodVisitor mv, ClassNode type) {
+            super(type);
+            this.mv = mv;
+        }
+
+        @Override
+        protected void handleDoubleType() {
+            mv.visitInsn(DRETURN);
+        }
+
+        @Override
+        protected void handleFloatType() {
+            mv.visitInsn(FRETURN);
+        }
+
+        @Override
+        protected void handleLongType() {
+            mv.visitInsn(LRETURN);
+        }
+
+        @Override
+        protected void handleIntType() {
+            mv.visitInsn(IRETURN);
+        }
+
+        @Override
+        protected void handleVoidType() {
+            mv.visitInsn(RETURN);
+        }
+
+        @Override
+        protected void handleRefType() {
+            mv.visitInsn(ARETURN);
+        }
+    }
+
+    private static class LoadVarHandler extends PrimitiveTypeHandler {
+        private MethodVisitor mv;
+        private int idx;
+
+        public LoadVarHandler(MethodVisitor mv, ClassNode type, int idx) {
+            super(type);
+            this.mv = mv;
+            this.idx = idx;
         }
+
+        @Override
+        protected void handleDoubleType() {
+            mv.visitVarInsn(DLOAD, idx);
+        }
+
+        @Override
+        protected void handleFloatType() {
+            mv.visitVarInsn(FLOAD, idx);
+        }
+
+        @Override
+        protected void handleLongType() {
+            mv.visitVarInsn(LLOAD, idx);
+        }
+
+        @Override
+        protected void handleIntType() {
+            mv.visitVarInsn(ILOAD, idx);
+        }
+
+        @Override
+        protected void handleVoidType() {
+            // do nothing
+        }
+
+        @Override
+        protected void handleRefType() {
+            mv.visitVarInsn(ALOAD, idx);
+        }
+    }
+
+    private static class StoreVarHandler extends PrimitiveTypeHandler {
+        private MethodVisitor mv;
+        private int idx;
+
+        public StoreVarHandler(MethodVisitor mv, ClassNode type, int idx) {
+            super(type);
+            this.mv = mv;
+            this.idx = idx;
+        }
+
+        @Override
+        protected void handleDoubleType() {
+            mv.visitVarInsn(DSTORE, idx);
+        }
+
+        @Override
+        protected void handleFloatType() {
+            mv.visitVarInsn(FSTORE, idx);
+        }
+
+        @Override
+        protected void handleLongType() {
+            mv.visitVarInsn(LSTORE, idx);
+        }
+
+        @Override
+        protected void handleIntType() {
+            mv.visitVarInsn(ISTORE, idx);
+        }
+
+        @Override
+        protected void handleVoidType() {
+            // do nothing
+        }
+
+        @Override
+        protected void handleRefType() {
+            mv.visitVarInsn(ASTORE, idx);
+        }
+    }
+
+    private static abstract class PrimitiveTypeHandler {
+        private ClassNode type;
+
+        public PrimitiveTypeHandler(ClassNode type) {
+            this.type = type;
+        }
+
+        public void handle() {
+            if (type == ClassHelper.double_TYPE) {
+                handleDoubleType();
+            } else if (type == ClassHelper.float_TYPE) {
+                handleFloatType();
+            } else if (type == ClassHelper.long_TYPE) {
+                handleLongType();
+            } else if (
+                    type == ClassHelper.boolean_TYPE
+                            || type == ClassHelper.char_TYPE
+                            || type == ClassHelper.byte_TYPE
+                            || type == ClassHelper.int_TYPE
+                            || type == ClassHelper.short_TYPE) {
+                handleIntType();
+            } else if (type == ClassHelper.VOID_TYPE) {
+                handleVoidType();
+            } else {
+                handleRefType();
+            }
+        }
+
+        protected abstract void handleDoubleType();
+        protected abstract void handleFloatType();
+        protected abstract void handleLongType();
+
+        /**
+         * boolean, char, byte, int, short types are handle in the same way
+         */
+        protected abstract void handleIntType();
+
+        protected abstract void handleVoidType();
+        protected abstract void handleRefType();
     }
 }