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