Skip to content

Commit

Permalink
wip Stable and unique Lambda and LambdaForm class names
Browse files Browse the repository at this point in the history
  • Loading branch information
ThanHenderson committed Jul 26, 2024
1 parent 95a3a61 commit 1221a9c
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
* questions.
*/

/*
* ===========================================================================
* (c) Copyright IBM Corp. 2024, 2024 All Rights Reserved
* ===========================================================================
*/

package java.lang.invoke;

import jdk.internal.org.objectweb.asm.*;
Expand Down Expand Up @@ -163,7 +169,27 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller,
implMethodName = implInfo.getName();
implMethodDesc = implInfo.getMethodType().toMethodDescriptorString();
constructorType = invokedType.changeReturnType(Void.TYPE);
lambdaClassName = targetClass.getName().replace('.', '/') + "$$Lambda$" + counter.incrementAndGet();
String uniqueID = targetClass.getName()
+ invokedType.toString()
+ samMethodName
+ samMethodType.toString()
+ instantiatedMethodType.toString()
+ implMethodClassName
+ implMethodName
+ implMethodDesc;
uniqueID = uniqueID.replace("$", "_")
.replace(".", "_")
.replace(";", "_")
.replace(",", "_")
.replace("-", "_")
.replace("/", "_")
.replace("[", "_")
.replace("]", "_")
.replace("(", "__")
.replace(")", "__")
.replace("<", "__")
.replace(">", "__");
lambdaClassName = targetClass.getName().replace('.', '/') + "$$Lambda$" + uniqueID;
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
int parameterCount = invokedType.parameterCount();
if (parameterCount > 0) {
Expand Down Expand Up @@ -252,6 +278,10 @@ public Constructor<?>[] run() {
* is not found
*/
private Class<?> spinInnerClass() throws LambdaConversionException {
Class<?> innerClass = MethodHandleNatives.findInSCC(lambdaClassName, targetClass);
if (innerClass != null) {
return innerClass;
}
String[] interfaces;
String samIntf = samBase.getName().replace('.', '/');
boolean accidentallySerializable = !isSerializable && Serializable.class.isAssignableFrom(samBase);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@
* questions.
*/

/*
* ===========================================================================
* (c) Copyright IBM Corp. 2024, 2024 All Rights Reserved
* ===========================================================================
*/


package java.lang.invoke;

import jdk.internal.org.objectweb.asm.ClassWriter;
Expand Down Expand Up @@ -111,7 +118,26 @@ private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize,
if (DUMP_CLASS_FILES) {
className = makeDumpableClassName(className);
}
this.className = className;
String uniqueID = className + invokerName + invokerType.toString() + lambdaForm.toString();
uniqueID = uniqueID.replace(",", "_")
.replace("-", "_")
.replace("/", "_")
.replace("\t", "_")
.replace("\n", "_")
.replace(" ", "_")
.replace(":", "_")
.replace(".", "_")
.replace("=", "_")
.replace("<", "_")
.replace(">", "_")
.replace(";", "_")
.replace("{", "_")
.replace("}", "_")
.replace("[", "_")
.replace("]", "_")
.replace("(", "__")
.replace(")", "__");
this.className = className + "$" + uniqueID;
this.lambdaForm = lambdaForm;
this.invokerName = invokerName;
this.invokerType = invokerType;
Expand Down Expand Up @@ -690,6 +716,10 @@ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType
if (pregenerated != null) return pregenerated; // pre-generated bytecode

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

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

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
* questions.
*/

/*
* ===========================================================================
* (c) Copyright IBM Corp. 2024, 2024 All Rights Reserved
* ===========================================================================
*/

package java.lang.invoke;

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

static native void init(MemberName self, Object ref);
static native void expand(MemberName self);
static native Class<?> findInSCC(String classname, Class<?> hostClass);
static native MemberName resolve(MemberName self, Class<?> caller,
boolean speculativeResolve) throws LinkageError, ClassNotFoundException;
static native int getMembers(Class<?> defc, String matchName, String matchSig,
Expand Down

0 comments on commit 1221a9c

Please sign in to comment.