< prev index next >
src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
Print this page
rev 49071 : 8198888: Reduce string allocation churn in InvokerBytecodeGenerator
Reviewed-by: psandoz, plevart
@@ -91,10 +91,14 @@
/** ASM bytecode generation. */
private ClassWriter cw;
private MethodVisitor mv;
+ /** Single element internal class name lookup cache. */
+ private Class<?> lastClass;
+ private String lastInternalName;
+
private static final MemberName.Factory MEMBERNAME_FACTORY = MemberName.getFactory();
private static final Class<?> HOST_CLASS = LambdaForm.class;
/** Main constructor; other constructors delegate to this one. */
private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize,
@@ -600,17 +604,22 @@
throw new InternalError("unknown return type: " + type);
}
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('.', '/');
+
+ if (c == lastClass) {
+ return lastInternalName;
+ }
+ lastClass = c;
+ return lastInternalName = c.getName().replace('.', '/');
}
private static MemberName resolveFrom(String name, MethodType type, Class<?> holder) {
MemberName member = new MemberName(holder, name, type, REF_invokeStatic);
MemberName resolvedMember = MemberName.getFactory().resolveOrNull(REF_invokeStatic, member, holder);
< prev index next >