--- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Thu Apr 13 16:01:13 2017 +0000
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Thu Apr 13 20:35:17 2017 +0000
@@ -73,6 +73,7 @@
private static final String LL_SIG = "(L" + OBJ + ";)L" + OBJ + ";";
private static final String LLV_SIG = "(L" + OBJ + ";L" + OBJ + ";)V";
private static final String CLASS_PREFIX = LF + "$";
+ private static final String SOURCE_PREFIX = "LambdaForm$";
/** Name of its super class*/
static final String INVOKER_SUPER_NAME = OBJ;
@@ -80,9 +81,6 @@
/** Name of new class */
private final String className;
- /** Name of the source file (for stack trace printing). */
- private final String sourceFile;
-
private final LambdaForm lambdaForm;
private final String invokerName;
private final MethodType invokerType;
@@ -109,8 +107,7 @@
if (DUMP_CLASS_FILES) {
className = makeDumpableClassName(className);
}
- this.className = CLASS_PREFIX + className;
- this.sourceFile = "LambdaForm$" + className;
+ this.className = className;
this.lambdaForm = lambdaForm;
this.invokerName = invokerName;
this.invokerType = invokerType;
@@ -130,7 +127,7 @@
/** For generating customized code for a single LambdaForm. */
private InvokerBytecodeGenerator(String className, LambdaForm form, MethodType invokerType) {
- this(className, form.debugName, form, invokerType);
+ this(className, form.lambdaName(), form, invokerType);
}
/** For generating customized code for a single LambdaForm. */
@@ -173,6 +170,13 @@
}
}
+ private void maybeDump(final byte[] classFile) {
+ if (DUMP_CLASS_FILES) {
+ maybeDump(CLASS_PREFIX + className, classFile);
+ }
+ }
+
+ // Also used from BoundMethodHandle
static void maybeDump(final String className, final byte[] classFile) {
if (DUMP_CLASS_FILES) {
java.security.AccessController.doPrivileged(
@@ -306,8 +310,9 @@
private ClassWriter classFilePrologue() {
final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
- cw.visit(Opcodes.V1_8, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, INVOKER_SUPER_NAME, null);
- cw.visitSource(sourceFile, null);
+ cw.visit(Opcodes.V1_8, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
+ CLASS_PREFIX + className, null, INVOKER_SUPER_NAME, null);
+ cw.visitSource(SOURCE_PREFIX + className, null);
return cw;
}
@@ -617,12 +622,11 @@
return resolvedMember;
}
- private static MemberName lookupPregenerated(LambdaForm form) {
+ private static MemberName lookupPregenerated(LambdaForm form, MethodType invokerType) {
if (form.customized != null) {
// No pre-generated version for customized LF
return null;
}
- MethodType invokerType = form.methodType();
String name = form.kind.methodName;
switch (form.kind) {
case BOUND_REINVOKER: {
@@ -670,7 +674,7 @@
* Generate customized bytecode for a given LambdaForm.
*/
static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType) {
- MemberName pregenerated = lookupPregenerated(form);
+ MemberName pregenerated = lookupPregenerated(form, invokerType);
if (pregenerated != null) return pregenerated; // pre-generated bytecode
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
@@ -720,7 +724,7 @@
bogusMethod(lambdaForm);
final byte[] classFile = toByteArray();
- maybeDump(className, classFile);
+ maybeDump(classFile);
return classFile;
}
@@ -908,7 +912,7 @@
//MethodHandle.class already covered
};
- static boolean isStaticallyInvocable(NamedFunction[] functions) {
+ static boolean isStaticallyInvocable(NamedFunction ... functions) {
for (NamedFunction nf : functions) {
if (!isStaticallyInvocable(nf.member())) {
return false;
@@ -1761,7 +1765,7 @@
bogusMethod(invokerType);
final byte[] classFile = cw.toByteArray();
- maybeDump(className, classFile);
+ maybeDump(classFile);
return classFile;
}
@@ -1829,7 +1833,7 @@
bogusMethod(dstType);
final byte[] classFile = cw.toByteArray();
- maybeDump(className, classFile);
+ maybeDump(classFile);
return classFile;
}