Skip to content

Commit 1221a9c

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

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
lines changed

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

+31-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
* questions.
2424
*/
2525

26+
/*
27+
* ===========================================================================
28+
* (c) Copyright IBM Corp. 2024, 2024 All Rights Reserved
29+
* ===========================================================================
30+
*/
31+
2632
package java.lang.invoke;
2733

2834
import jdk.internal.org.objectweb.asm.*;
@@ -163,7 +169,27 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller,
163169
implMethodName = implInfo.getName();
164170
implMethodDesc = implInfo.getMethodType().toMethodDescriptorString();
165171
constructorType = invokedType.changeReturnType(Void.TYPE);
166-
lambdaClassName = targetClass.getName().replace('.', '/') + "$$Lambda$" + counter.incrementAndGet();
172+
String uniqueID = targetClass.getName()
173+
+ invokedType.toString()
174+
+ samMethodName
175+
+ samMethodType.toString()
176+
+ instantiatedMethodType.toString()
177+
+ implMethodClassName
178+
+ implMethodName
179+
+ implMethodDesc;
180+
uniqueID = uniqueID.replace("$", "_")
181+
.replace(".", "_")
182+
.replace(";", "_")
183+
.replace(",", "_")
184+
.replace("-", "_")
185+
.replace("/", "_")
186+
.replace("[", "_")
187+
.replace("]", "_")
188+
.replace("(", "__")
189+
.replace(")", "__")
190+
.replace("<", "__")
191+
.replace(">", "__");
192+
lambdaClassName = targetClass.getName().replace('.', '/') + "$$Lambda$" + uniqueID;
167193
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
168194
int parameterCount = invokedType.parameterCount();
169195
if (parameterCount > 0) {
@@ -252,6 +278,10 @@ public Constructor<?>[] run() {
252278
* is not found
253279
*/
254280
private Class<?> spinInnerClass() throws LambdaConversionException {
281+
Class<?> innerClass = MethodHandleNatives.findInSCC(lambdaClassName, targetClass);
282+
if (innerClass != null) {
283+
return innerClass;
284+
}
255285
String[] interfaces;
256286
String samIntf = samBase.getName().replace('.', '/');
257287
boolean accidentallySerializable = !isSerializable && Serializable.class.isAssignableFrom(samBase);

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

+39-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
* questions.
2424
*/
2525

26+
/*
27+
* ===========================================================================
28+
* (c) Copyright IBM Corp. 2024, 2024 All Rights Reserved
29+
* ===========================================================================
30+
*/
31+
32+
2633
package java.lang.invoke;
2734

2835
import jdk.internal.org.objectweb.asm.ClassWriter;
@@ -111,7 +118,26 @@ private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize,
111118
if (DUMP_CLASS_FILES) {
112119
className = makeDumpableClassName(className);
113120
}
114-
this.className = className;
121+
String uniqueID = className + invokerName + invokerType.toString() + lambdaForm.toString();
122+
uniqueID = uniqueID.replace(",", "_")
123+
.replace("-", "_")
124+
.replace("/", "_")
125+
.replace("\t", "_")
126+
.replace("\n", "_")
127+
.replace(" ", "_")
128+
.replace(":", "_")
129+
.replace(".", "_")
130+
.replace("=", "_")
131+
.replace("<", "_")
132+
.replace(">", "_")
133+
.replace(";", "_")
134+
.replace("{", "_")
135+
.replace("}", "_")
136+
.replace("[", "_")
137+
.replace("]", "_")
138+
.replace("(", "__")
139+
.replace(")", "__");
140+
this.className = className + "$" + uniqueID;
115141
this.lambdaForm = lambdaForm;
116142
this.invokerName = invokerName;
117143
this.invokerType = invokerType;
@@ -690,6 +716,10 @@ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType
690716
if (pregenerated != null) return pregenerated; // pre-generated bytecode
691717

692718
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
719+
Class<?> customized = MethodHandleNatives.findInSCC(CLASS_PREFIX + g.className, HOST_CLASS);
720+
if (customized != null) {
721+
return resolveInvokerMember(customized, g.invokerName, g.invokerType);
722+
}
693723
return g.loadMethod(g.generateCustomizedCodeBytes());
694724
}
695725

@@ -1766,6 +1796,10 @@ static MemberName generateLambdaFormInterpreterEntryPoint(MethodType mt) {
17661796
MethodType type = mt; // includes leading argument
17671797
type = type.changeParameterType(0, MethodHandle.class);
17681798
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("LFI", name, type);
1799+
Class<?> customized = MethodHandleNatives.findInSCC(CLASS_PREFIX + g.className, HOST_CLASS);
1800+
if (customized != null) {
1801+
return resolveInvokerMember(customized, g.invokerName, g.invokerType);
1802+
}
17691803
return g.loadMethod(g.generateLambdaFormInterpreterEntryPointBytes());
17701804
}
17711805

@@ -1825,6 +1859,10 @@ static MemberName generateNamedFunctionInvoker(MethodTypeForm typeForm) {
18251859
MethodType invokerType = NamedFunction.INVOKER_METHOD_TYPE;
18261860
String invokerName = "invoke_" + shortenSignature(basicTypeSignature(typeForm.erasedType()));
18271861
InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("NFI", invokerName, invokerType);
1862+
Class<?> customized = MethodHandleNatives.findInSCC(CLASS_PREFIX + g.className, HOST_CLASS);
1863+
if (customized != null) {
1864+
return resolveInvokerMember(customized, g.invokerName, g.invokerType);
1865+
}
18281866
return g.loadMethod(g.generateNamedFunctionInvokerImpl(typeForm));
18291867
}
18301868

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

+7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
* questions.
2424
*/
2525

26+
/*
27+
* ===========================================================================
28+
* (c) Copyright IBM Corp. 2024, 2024 All Rights Reserved
29+
* ===========================================================================
30+
*/
31+
2632
package java.lang.invoke;
2733

2834
import jdk.internal.ref.CleanerFactory;
@@ -49,6 +55,7 @@ private MethodHandleNatives() { } // static only
4955

5056
static native void init(MemberName self, Object ref);
5157
static native void expand(MemberName self);
58+
static native Class<?> findInSCC(String classname, Class<?> hostClass);
5259
static native MemberName resolve(MemberName self, Class<?> caller,
5360
boolean speculativeResolve) throws LinkageError, ClassNotFoundException;
5461
static native int getMembers(Class<?> defc, String matchName, String matchSig,

0 commit comments

Comments
 (0)