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/28 02:27:31 UTC

groovy git commit: Minor refactoring: remove duplicated code of `ProxyGeneratorAdapter`

Repository: groovy
Updated Branches:
  refs/heads/master 90dde8534 -> 1937901a6


Minor refactoring: remove duplicated code of `ProxyGeneratorAdapter`


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

Branch: refs/heads/master
Commit: 1937901a6d439450ae542dc219ebc1d8b4f5b479
Parents: 90dde85
Author: sunlan <su...@apache.org>
Authored: Wed Feb 28 10:27:22 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Wed Feb 28 10:27:22 2018 +0800

----------------------------------------------------------------------
 .../org/codehaus/groovy/ast/ClassHelper.java    |   4 +-
 .../groovy/classgen/asm/BytecodeHelper.java     |  10 +-
 .../classgen/asm/util/TypeDescriptionUtil.java  | 120 -----------
 .../groovy/classgen/asm/util/TypeUtil.java      | 200 +++++++++++++++++++
 .../groovy/runtime/ProxyGeneratorAdapter.java   |  82 +++-----
 5 files changed, 232 insertions(+), 184 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/1937901a/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 fa93fb4..2e034fb 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
@@ -29,7 +29,7 @@ import groovy.lang.Range;
 import groovy.lang.Reference;
 import groovy.lang.Script;
 import org.apache.groovy.util.Maps;
-import org.codehaus.groovy.classgen.asm.util.TypeDescriptionUtil;
+import org.codehaus.groovy.classgen.asm.util.TypeUtil;
 import org.codehaus.groovy.runtime.GeneratedClosure;
 import org.codehaus.groovy.runtime.GeneratedLambda;
 import org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport;
@@ -318,7 +318,7 @@ public class ClassHelper {
      * @see #make(String)
      */
     public static boolean isPrimitiveType(ClassNode cn) {
-        return TypeDescriptionUtil.isPrimitiveType(cn);
+        return TypeUtil.isPrimitiveType(cn);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/groovy/blob/1937901a/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 197ac9c..b5880fd 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -25,7 +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.classgen.asm.util.TypeUtil;
 import org.codehaus.groovy.reflection.ReflectionCache;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.objectweb.asm.Label;
@@ -126,7 +126,7 @@ public class BytecodeHelper implements Opcodes {
      * @return the ASM type description for class loading
      */
     public static String getClassLoadingTypeDescription(ClassNode c) {
-        String desc = TypeDescriptionUtil.getDescriptionByType(c);
+        String desc = TypeUtil.getDescriptionByType(c);
 
         if (!c.isArray()) {
             if (desc.startsWith("L") && desc.endsWith(";")) {
@@ -161,7 +161,7 @@ public class BytecodeHelper implements Opcodes {
             d = d.redirect();
         }
 
-        String desc = TypeDescriptionUtil.getDescriptionByType(d);
+        String desc = TypeUtil.getDescriptionByType(d);
 
         if (!end && desc.endsWith(";")) {
             desc = desc.substring(0, desc.length() - 1);
@@ -251,7 +251,7 @@ public class BytecodeHelper implements Opcodes {
             return "java.lang.Object;";
         }
 
-        if (TypeDescriptionUtil.isPrimitiveType(name)) {
+        if (TypeUtil.isPrimitiveType(name)) {
             return name;
         }
 
@@ -272,7 +272,7 @@ public class BytecodeHelper implements Opcodes {
             prefix = "[";
             name = name.substring(0, name.length() - 2);
 
-            return prefix + TypeDescriptionUtil.getDescriptionByName(name);
+            return prefix + TypeUtil.getDescriptionByName(name);
         }
 
         return name.replace('/', '.');

http://git-wip-us.apache.org/repos/asf/groovy/blob/1937901a/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
deleted file mode 100644
index 2f7349a..0000000
--- a/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeDescriptionUtil.java
+++ /dev/null
@@ -1,120 +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 org.codehaus.groovy.classgen.asm.util;
-
-import groovy.lang.Tuple2;
-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;
-
-/**
- * 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(
-            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) {
-        String desc = TYPE_TO_DESCRIPTION_MAP.get(type);
-
-        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) {
-        ClassNode type = NAME_TO_TYPE_MAP.get(name);
-
-        if (null == type) {
-            return makeRefDescription(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);
-    }
-}

http://git-wip-us.apache.org/repos/asf/groovy/blob/1937901a/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeUtil.java b/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeUtil.java
new file mode 100644
index 0000000..483511d
--- /dev/null
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/util/TypeUtil.java
@@ -0,0 +1,200 @@
+/*
+ *  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 groovy.lang.Tuple2;
+import org.apache.groovy.util.Maps;
+import org.codehaus.groovy.ast.ClassNode;
+import org.objectweb.asm.Type;
+
+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;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.DLOAD;
+import static org.objectweb.asm.Opcodes.DRETURN;
+import static org.objectweb.asm.Opcodes.FLOAD;
+import static org.objectweb.asm.Opcodes.FRETURN;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.IRETURN;
+import static org.objectweb.asm.Opcodes.LLOAD;
+import static org.objectweb.asm.Opcodes.LRETURN;
+
+/**
+ * A utility for getting information of types
+ *
+ * @since 2.5.0
+ */
+public abstract class TypeUtil {
+    public static int getLoadInsnByType(Type type) {
+        Integer insn = PRIMITIVE_TYPE_TO_LOAD_INSN_MAP.get(type);
+
+        if (null != insn) {
+            return insn;
+        }
+
+        return ALOAD;
+    }
+
+    public static int getReturnInsnByType(Type type) {
+        Integer insn = PRIMITIVE_TYPE_TO_RETURN_INSN_MAP.get(type);
+
+        if (null != insn) {
+            return insn;
+        }
+
+        return ARETURN;
+    }
+
+    public static String getWrappedClassDescriptor(Type type) {
+        String desc = PRIMITIVE_TYPE_TO_WRAPPED_CLASS_DESCRIPTOR_MAP.get(type);
+
+        if (null != desc) {
+            return desc;
+        }
+
+        throw new IllegalArgumentException("Unexpected type class [" + type + "]");
+    }
+
+    public static boolean isPrimitiveType(Type type) {
+        return PRIMITIVE_TYPE_TO_LOAD_INSN_MAP.containsKey(type);
+    }
+
+    public static boolean isPrimitiveType(String name) {
+        return NAME_TO_PRIMITIVE_TYPE_MAP.containsKey(name);
+    }
+
+    public static boolean isPrimitiveType(ClassNode type) {
+        return PRIMITIVE_TYPE_TO_DESCRIPTION_MAP.containsKey(type);
+    }
+
+    public static String getDescriptionByType(ClassNode type) {
+        String desc = PRIMITIVE_TYPE_TO_DESCRIPTION_MAP.get(type);
+
+        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) {
+        ClassNode type = NAME_TO_PRIMITIVE_TYPE_MAP.get(name);
+
+        if (null == type) {
+            return makeRefDescription(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);
+    }
+
+    private static final String REF_DESCRIPTION = "L";
+    private static final Map<ClassNode, String> PRIMITIVE_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_PRIMITIVE_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
+    );
+
+    private static final Map<Type, Integer> PRIMITIVE_TYPE_TO_LOAD_INSN_MAP = Maps.of(
+            Type.BOOLEAN_TYPE, ILOAD,
+            Type.BYTE_TYPE, ILOAD,
+            Type.CHAR_TYPE, ILOAD,
+            Type.DOUBLE_TYPE, DLOAD,
+            Type.FLOAT_TYPE, FLOAD,
+            Type.INT_TYPE, ILOAD,
+            Type.LONG_TYPE, LLOAD,
+            Type.SHORT_TYPE, ILOAD
+    );
+
+    private static final Map<Type, Integer> PRIMITIVE_TYPE_TO_RETURN_INSN_MAP = Maps.of(
+            Type.BOOLEAN_TYPE, IRETURN,
+            Type.BYTE_TYPE, IRETURN,
+            Type.CHAR_TYPE, IRETURN,
+            Type.DOUBLE_TYPE, DRETURN,
+            Type.FLOAT_TYPE, FRETURN,
+            Type.INT_TYPE, IRETURN,
+            Type.LONG_TYPE, LRETURN,
+            Type.SHORT_TYPE, IRETURN
+    );
+
+    private static final Map<Type, String> PRIMITIVE_TYPE_TO_WRAPPED_CLASS_DESCRIPTOR_MAP = Maps.of(
+            Type.BOOLEAN_TYPE, "java/lang/Boolean",
+            Type.BYTE_TYPE, "java/lang/Byte",
+            Type.CHAR_TYPE, "java/lang/Character",
+            Type.DOUBLE_TYPE, "java/lang/Double",
+            Type.FLOAT_TYPE, "java/lang/Float",
+            Type.INT_TYPE, "java/lang/Integer",
+            Type.LONG_TYPE, "java/lang/Long",
+            Type.SHORT_TYPE, "java/lang/Short"
+    );
+}

http://git-wip-us.apache.org/repos/asf/groovy/blob/1937901a/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java b/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
index 2d3ca8a..47b6f3b 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
@@ -27,6 +27,7 @@ import groovy.transform.Trait;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.classgen.asm.BytecodeHelper;
+import org.codehaus.groovy.classgen.asm.util.TypeUtil;
 import org.codehaus.groovy.control.CompilationUnit;
 import org.codehaus.groovy.control.CompilerConfiguration;
 import org.codehaus.groovy.control.ErrorCollector;
@@ -725,13 +726,7 @@ public class ProxyGeneratorAdapter extends ClassVisitor implements Opcodes {
             mv.visitInsn(DUP);
             BytecodeHelper.pushConstant(mv, i);
             // primitive types must be boxed
-            if (isPrimitive(arg)) {
-                mv.visitIntInsn(getLoadInsn(arg), idx);
-                String wrappedType = getWrappedClassDescriptor(arg);
-                mv.visitMethodInsn(INVOKESTATIC, wrappedType, "valueOf", "(" + arg.getDescriptor() + ")L" + wrappedType + ";", false);
-            } else {
-                mv.visitVarInsn(ALOAD, idx); // load argument i
-            }
+            boxPrimitiveType(mv, idx, arg);
             size = Math.max(size, 5 + registerLen(arg));
             idx += registerLen(arg);
             mv.visitInsn(AASTORE); // store value into array
@@ -761,15 +756,8 @@ public class ProxyGeneratorAdapter extends ClassVisitor implements Opcodes {
             Type arg = args[i];
             mv.visitInsn(DUP); // stack size = 2
             BytecodeHelper.pushConstant(mv, i); // array index, stack size = 3
-            stackSize = 3;
             // primitive types must be boxed
-            if (isPrimitive(arg)) {
-                mv.visitIntInsn(getLoadInsn(arg), idx);
-                String wrappedType = getWrappedClassDescriptor(arg);
-                mv.visitMethodInsn(INVOKESTATIC, wrappedType, "valueOf", "(" + arg.getDescriptor() + ")L" + wrappedType + ";", false);
-            } else {
-                mv.visitVarInsn(ALOAD, idx); // load argument i
-            }
+            boxPrimitiveType(mv, idx, arg);
             idx += registerLen(arg);
             stackSize = Math.max(4, 3 + registerLen(arg));
             mv.visitInsn(AASTORE); // store value into array
@@ -804,6 +792,16 @@ public class ProxyGeneratorAdapter extends ClassVisitor implements Opcodes {
         return null;
     }
 
+    private void boxPrimitiveType(MethodVisitor mv, int idx, Type arg) {
+        if (isPrimitive(arg)) {
+            mv.visitIntInsn(getLoadInsn(arg), idx);
+            String wrappedType = getWrappedClassDescriptor(arg);
+            mv.visitMethodInsn(INVOKESTATIC, wrappedType, "valueOf", "(" + arg.getDescriptor() + ")L" + wrappedType + ";", false);
+        } else {
+            mv.visitVarInsn(ALOAD, idx); // load argument i
+        }
+    }
+
     private static void unwrapResult(final MethodVisitor mv, final String desc) {
         Type returnType = Type.getReturnType(desc);
         if (returnType == Type.VOID_TYPE) {
@@ -874,51 +872,20 @@ public class ProxyGeneratorAdapter extends ClassVisitor implements Opcodes {
         return new ReturnValueWrappingClosure(o);
     }
 
-    private static int getLoadInsn(final Type type) {
-        if (type == Type.BOOLEAN_TYPE) return ILOAD;
-        if (type == Type.BYTE_TYPE) return ILOAD;
-        if (type == Type.CHAR_TYPE) return ILOAD;
-        if (type == Type.DOUBLE_TYPE) return DLOAD;
-        if (type == Type.FLOAT_TYPE) return FLOAD;
-        if (type == Type.INT_TYPE) return ILOAD;
-        if (type == Type.LONG_TYPE) return LLOAD;
-        if (type == Type.SHORT_TYPE) return ILOAD;
-        return ALOAD;
-    }
-
-    private static int getReturnInsn(final Type type) {
-        if (type == Type.BOOLEAN_TYPE) return IRETURN;
-        if (type == Type.BYTE_TYPE) return IRETURN;
-        if (type == Type.CHAR_TYPE) return IRETURN;
-        if (type == Type.DOUBLE_TYPE) return DRETURN;
-        if (type == Type.FLOAT_TYPE) return FRETURN;
-        if (type == Type.INT_TYPE) return IRETURN;
-        if (type == Type.LONG_TYPE) return LRETURN;
-        if (type == Type.SHORT_TYPE) return IRETURN;
-        return ARETURN;
-    }
-
-    private static boolean isPrimitive(final Type arg) {
-        return arg == Type.BOOLEAN_TYPE
-                || arg == Type.BYTE_TYPE
-                || arg == Type.CHAR_TYPE
-                || arg == Type.DOUBLE_TYPE
-                || arg == Type.FLOAT_TYPE
-                || arg == Type.INT_TYPE
-                || arg == Type.LONG_TYPE
-                || arg == Type.SHORT_TYPE;
+    private static int getLoadInsn(Type type) {
+        return TypeUtil.getLoadInsnByType(type);
+    }
+
+    private static int getReturnInsn(Type type) {
+        return TypeUtil.getReturnInsnByType(type);
+    }
+
+    private static boolean isPrimitive(Type type) {
+        return TypeUtil.isPrimitiveType(type);
     }
 
     private static String getWrappedClassDescriptor(Type type) {
-        if (type == Type.BOOLEAN_TYPE) return "java/lang/Boolean";
-        if (type == Type.BYTE_TYPE) return "java/lang/Byte";
-        if (type == Type.CHAR_TYPE) return "java/lang/Character";
-        if (type == Type.DOUBLE_TYPE) return "java/lang/Double";
-        if (type == Type.FLOAT_TYPE) return "java/lang/Float";
-        if (type == Type.INT_TYPE) return "java/lang/Integer";
-        if (type == Type.LONG_TYPE) return "java/lang/Long";
-        if (type == Type.SHORT_TYPE) return "java/lang/Short";
-        throw new IllegalArgumentException("Unexpected type class [" + type + "]");
+        return TypeUtil.getWrappedClassDescriptor(type);
     }
 
     private static class InnerLoader extends GroovyClassLoader {
@@ -987,6 +954,7 @@ public class ProxyGeneratorAdapter extends ClassVisitor implements Opcodes {
     }
 
     private static class ReturnValueWrappingClosure<V> extends Closure<V> {
+        private static final long serialVersionUID = 1313135457715304501L;
         private final V value;
 
         public ReturnValueWrappingClosure(V returnValue) {