From commits-return-5397-archive-asf-public=cust-asf.ponee.io@groovy.apache.org Tue Feb 6 10:14:13 2018 Return-Path: X-Original-To: archive-asf-public@eu.ponee.io Delivered-To: archive-asf-public@eu.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by mx-eu-01.ponee.io (Postfix) with ESMTP id D990F180771 for ; Tue, 6 Feb 2018 10:14:12 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id C8F80160C45; Tue, 6 Feb 2018 09:14:12 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id C964D160C5D for ; Tue, 6 Feb 2018 10:14:11 +0100 (CET) Received: (qmail 20965 invoked by uid 500); 6 Feb 2018 09:14:11 -0000 Mailing-List: contact commits-help@groovy.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@groovy.apache.org Delivered-To: mailing list commits@groovy.apache.org Received: (qmail 20819 invoked by uid 99); 6 Feb 2018 09:14:10 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 06 Feb 2018 09:14:10 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7B267F320A; Tue, 6 Feb 2018 09:14:10 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sunlan@apache.org To: commits@groovy.apache.org Date: Tue, 06 Feb 2018 09:14:14 -0000 Message-Id: <4ac9c5a6596b4f6baa78a483a9b8eb08@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [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/31c53110 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/31c53110 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/31c53110 Branch: refs/heads/GROOVY_2_5_X Commit: 31c53110f8b9384342849e675d63b5e0be990176 Parents: 05ad6a1 Author: sunlan Authored: Tue Feb 6 16:03:41 2018 +0800 Committer: sunlan Committed: Tue Feb 6 17:12:36 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/31c53110/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/31c53110/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 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 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 extractArrayInfo(ClassNode type) { + int dimension = 0; + + do { + dimension++; + } while ((type = type.getComponentType()).isArray()); + + return new Tuple2(type, dimension); + } }