Skip to content

Commit 5770205

Browse files
committed
wip Stable and unique Lambda and LambdaForm class names
1 parent 95a3a61 commit 5770205

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,16 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller,
163163
implMethodName = implInfo.getName();
164164
implMethodDesc = implInfo.getMethodType().toMethodDescriptorString();
165165
constructorType = invokedType.changeReturnType(Void.TYPE);
166-
lambdaClassName = targetClass.getName().replace('.', '/') + "$$Lambda$" + counter.incrementAndGet();
166+
int uniqueID = targetClass.getName().hashCode()
167+
^ invokedType.toString().hashCode()
168+
^ samMethodName.hashCode()
169+
^ samMethodType.toString().hashCode()
170+
^ instantiatedMethodType.toString().hashCode()
171+
^ implMethodClassName.hashCode()
172+
^ implMethodName.hashCode()
173+
^ implMethodDesc.hashCode();
174+
uniqueID &= 0x7fffffff;
175+
lambdaClassName = targetClass.getName().replace('.', '/') + "$$Lambda$" + uniqueID;
167176
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
168177
int parameterCount = invokedType.parameterCount();
169178
if (parameterCount > 0) {
@@ -252,6 +261,10 @@ public Constructor<?>[] run() {
252261
* is not found
253262
*/
254263
private Class<?> spinInnerClass() throws LambdaConversionException {
264+
Class<?> innerClass = MethodHandleNatives.findInSCC(lambdaClassName, targetClass);
265+
if (innerClass != null) {
266+
return innerClass;
267+
}
255268
String[] interfaces;
256269
String samIntf = samBase.getName().replace('.', '/');
257270
boolean accidentallySerializable = !isSerializable && Serializable.class.isAssignableFrom(samBase);

src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
import java.io.File;
3939
import java.io.FileOutputStream;
4040
import java.io.IOException;
41+
import java.lang.invoke.LambdaForm.BasicType;
42+
import java.lang.invoke.LambdaForm.Name;
43+
import java.lang.invoke.LambdaForm.NamedFunction;
4144
import java.lang.reflect.Modifier;
4245
import java.util.ArrayList;
4346
import java.util.Arrays;
@@ -111,7 +114,12 @@ private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize,
111114
if (DUMP_CLASS_FILES) {
112115
className = makeDumpableClassName(className);
113116
}
114-
this.className = className;
117+
int uniqueID = lambdaForm.toString().hashCode()
118+
^ className.hashCode()
119+
^ invokerName.hashCode()
120+
^ invokerType.toString().hashCode();
121+
uniqueID &= 0x7fffffff;
122+
this.className = className + "$" + uniqueID;
115123
this.lambdaForm = lambdaForm;
116124
this.invokerName = invokerName;
117125
this.invokerType = invokerType;
@@ -690,6 +698,10 @@ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType
690698
if (pregenerated != null) return pregenerated; // pre-generated bytecode
691699

692700
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
701+
Class<?> customized = MethodHandleNatives.findInSCC(CLASS_PREFIX + g.className, HOST_CLASS);
702+
if (customized != null) {
703+
return resolveInvokerMember(customized, g.invokerName, g.invokerType);
704+
}
693705
return g.loadMethod(g.generateCustomizedCodeBytes());
694706
}
695707

@@ -1766,6 +1778,10 @@ static MemberName generateLambdaFormInterpreterEntryPoint(MethodType mt) {
17661778
MethodType type = mt; // includes leading argument
17671779
type = type.changeParameterType(0, MethodHandle.class);
17681780
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("LFI", name, type);
1781+
Class<?> customized = MethodHandleNatives.findInSCC(CLASS_PREFIX + g.className, HOST_CLASS);
1782+
if (customized != null) {
1783+
return resolveInvokerMember(customized, g.invokerName, g.invokerType);
1784+
}
17691785
return g.loadMethod(g.generateLambdaFormInterpreterEntryPointBytes());
17701786
}
17711787

@@ -1825,6 +1841,10 @@ static MemberName generateNamedFunctionInvoker(MethodTypeForm typeForm) {
18251841
MethodType invokerType = NamedFunction.INVOKER_METHOD_TYPE;
18261842
String invokerName = "invoke_" + shortenSignature(basicTypeSignature(typeForm.erasedType()));
18271843
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("NFI", invokerName, invokerType);
1844+
Class<?> customized = MethodHandleNatives.findInSCC(CLASS_PREFIX + g.className, HOST_CLASS);
1845+
if (customized != null) {
1846+
return resolveInvokerMember(customized, g.invokerName, g.invokerType);
1847+
}
18281848
return g.loadMethod(g.generateNamedFunctionInvokerImpl(typeForm));
18291849
}
18301850

src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ private MethodHandleNatives() { } // static only
4949

5050
static native void init(MemberName self, Object ref);
5151
static native void expand(MemberName self);
52+
static native Class<?> findInSCC(String classname, Class<?> hostClass);
5253
static native MemberName resolve(MemberName self, Class<?> caller,
5354
boolean speculativeResolve) throws LinkageError, ClassNotFoundException;
5455
static native int getMembers(Class<?> defc, String matchName, String matchSig,

0 commit comments

Comments
 (0)