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:30 UTC
[5/6] groovy git commit: Minor refactoring: remove the duplicated
code further
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);
+ }
}