|
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,26 @@ 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 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; |
115 | 141 | this.lambdaForm = lambdaForm;
|
116 | 142 | this.invokerName = invokerName;
|
117 | 143 | this.invokerType = invokerType;
|
@@ -690,6 +716,10 @@ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType
|
690 | 716 | if (pregenerated != null) return pregenerated; // pre-generated bytecode
|
691 | 717 |
|
692 | 718 | 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 | + } |
693 | 723 | return g.loadMethod(g.generateCustomizedCodeBytes());
|
694 | 724 | }
|
695 | 725 |
|
@@ -1766,6 +1796,10 @@ static MemberName generateLambdaFormInterpreterEntryPoint(MethodType mt) {
|
1766 | 1796 | MethodType type = mt; // includes leading argument
|
1767 | 1797 | type = type.changeParameterType(0, MethodHandle.class);
|
1768 | 1798 | 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 | + } |
1769 | 1803 | return g.loadMethod(g.generateLambdaFormInterpreterEntryPointBytes());
|
1770 | 1804 | }
|
1771 | 1805 |
|
@@ -1825,6 +1859,10 @@ static MemberName generateNamedFunctionInvoker(MethodTypeForm typeForm) {
|
1825 | 1859 | MethodType invokerType = NamedFunction.INVOKER_METHOD_TYPE;
|
1826 | 1860 | String invokerName = "invoke_" + shortenSignature(basicTypeSignature(typeForm.erasedType()));
|
1827 | 1861 | 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 | + } |
1828 | 1866 | return g.loadMethod(g.generateNamedFunctionInvokerImpl(typeForm));
|
1829 | 1867 | }
|
1830 | 1868 |
|
|
0 commit comments