|
23 | 23 | * questions.
|
24 | 24 | */
|
25 | 25 |
|
| 26 | +/* |
| 27 | + * =========================================================================== |
| 28 | + * (c) Copyright IBM Corp. 2024, 2024 All Rights Reserved |
| 29 | + * =========================================================================== |
| 30 | + */ |
| 31 | + |
| 32 | + |
26 | 33 | package java.lang.invoke;
|
27 | 34 |
|
28 | 35 | import jdk.internal.org.objectweb.asm.ClassWriter;
|
@@ -111,7 +118,22 @@ private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize,
|
111 | 118 | if (DUMP_CLASS_FILES) {
|
112 | 119 | className = makeDumpableClassName(className);
|
113 | 120 | }
|
114 |
| - this.className = className; |
| 121 | + String rawUniqueID = className + invokerName + invokerType.toString() + lambdaForm.toString(); |
| 122 | + StringBuilder encodedUniqueID = new StringBuilder(); |
| 123 | + String parentheses = "(){}[]<>"; |
| 124 | + for (int i = 0; i < rawUniqueID.length(); i++) { |
| 125 | + char currentChar = rawUniqueID.charAt(i); |
| 126 | + if (Character.isLetterOrDigit(currentChar)) { |
| 127 | + encodedUniqueID.append(currentChar); |
| 128 | + } else { |
| 129 | + if (parentheses.indexOf(currentChar) != -1) { |
| 130 | + encodedUniqueID.append("__"); |
| 131 | + } else { |
| 132 | + encodedUniqueID.append('_'); |
| 133 | + } |
| 134 | + } |
| 135 | + } |
| 136 | + this.className = className + "$" + encodedUniqueID.toString(); |
115 | 137 | this.lambdaForm = lambdaForm;
|
116 | 138 | this.invokerName = invokerName;
|
117 | 139 | this.invokerType = invokerType;
|
@@ -690,6 +712,10 @@ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType
|
690 | 712 | if (pregenerated != null) return pregenerated; // pre-generated bytecode
|
691 | 713 |
|
692 | 714 | InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
|
| 715 | + Class<?> customized = MethodHandleNatives.findLambdaFormInSCC(CLASS_PREFIX + g.className, HOST_CLASS); |
| 716 | + if (customized != null) { |
| 717 | + return resolveInvokerMember(customized, g.invokerName, g.invokerType); |
| 718 | + } |
693 | 719 | return g.loadMethod(g.generateCustomizedCodeBytes());
|
694 | 720 | }
|
695 | 721 |
|
@@ -1766,6 +1792,10 @@ static MemberName generateLambdaFormInterpreterEntryPoint(MethodType mt) {
|
1766 | 1792 | MethodType type = mt; // includes leading argument
|
1767 | 1793 | type = type.changeParameterType(0, MethodHandle.class);
|
1768 | 1794 | InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("LFI", name, type);
|
| 1795 | + Class<?> customized = MethodHandleNatives.findLambdaFormInSCC(CLASS_PREFIX + g.className, HOST_CLASS); |
| 1796 | + if (customized != null) { |
| 1797 | + return resolveInvokerMember(customized, g.invokerName, g.invokerType); |
| 1798 | + } |
1769 | 1799 | return g.loadMethod(g.generateLambdaFormInterpreterEntryPointBytes());
|
1770 | 1800 | }
|
1771 | 1801 |
|
@@ -1825,6 +1855,10 @@ static MemberName generateNamedFunctionInvoker(MethodTypeForm typeForm) {
|
1825 | 1855 | MethodType invokerType = NamedFunction.INVOKER_METHOD_TYPE;
|
1826 | 1856 | String invokerName = "invoke_" + shortenSignature(basicTypeSignature(typeForm.erasedType()));
|
1827 | 1857 | InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("NFI", invokerName, invokerType);
|
| 1858 | + Class<?> customized = MethodHandleNatives.findLambdaFormInSCC(CLASS_PREFIX + g.className, HOST_CLASS); |
| 1859 | + if (customized != null) { |
| 1860 | + return resolveInvokerMember(customized, g.invokerName, g.invokerType); |
| 1861 | + } |
1828 | 1862 | return g.loadMethod(g.generateNamedFunctionInvokerImpl(typeForm));
|
1829 | 1863 | }
|
1830 | 1864 |
|
|
0 commit comments