# HG changeset patch # User redestad # Date 1519906086 -3600 # Thu Mar 01 13:08:06 2018 +0100 # Node ID 6ee54decc76a77a16088b98e9244b80976f86163 # Parent d7859531621b7c0ba166d8988b3b802acff8e0b3 8198888: Reduce string allocation churn in InvokerBytecodeGenerator Reviewed-by: TBD diff --git a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java --- a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -93,6 +93,9 @@ private ClassWriter cw; private MethodVisitor mv; + /** Internal name lookup cache. */ + private HashMap, String> nameMap; + private static final MemberName.Factory MEMBERNAME_FACTORY = MemberName.getFactory(); private static final Class HOST_CLASS = LambdaForm.class; @@ -602,13 +605,25 @@ mv.visitInsn(opcode); } - private static String getInternalName(Class c) { + private String getInternalName(Class c) { if (c == Object.class) return OBJ; else if (c == Object[].class) return OBJARY; else if (c == Class.class) return CLS; else if (c == MethodHandle.class) return MH; assert(VerifyAccess.isTypeVisible(c, Object.class)) : c.getName(); - return c.getName().replace('.', '/'); + + String name; + if (nameMap == null) { + nameMap = new HashMap<>(2); + name = null; + } else { + name = nameMap.get(c); + } + if (name == null) { + name = c.getName().replace('.', '/'); + nameMap.put(c, name); + } + return name; } private static MemberName resolveFrom(String name, MethodType type, Class holder) { diff --git a/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java b/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java --- a/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java +++ b/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java @@ -107,6 +107,11 @@ } public static String unparse(Class type) { + if (type == Object.class) { + return "Ljava/lang/Object;"; + } else if (type == int.class) { + return "I"; + } StringBuilder sb = new StringBuilder(); unparseSig(type, sb); return sb.toString(); @@ -148,6 +153,8 @@ char c = Wrapper.forBasicType(t).basicTypeChar(); if (c != 'L') { sb.append(c); + } else if (t == Object.class) { + sb.append("Ljava/lang/Object;"); } else { boolean lsemi = (!t.isArray()); if (lsemi) sb.append('L');