< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java

Print this page
rev 15353 : 8164044: Generate the corresponding BoundMethodHandle to all generated DirectMethodHandles
Reviewed-by: vlivanov, mhaupt

*** 53,70 **** private static final String DMH_PARAM = "dmh"; private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME); ! private static final String DMH = "java/lang/invoke/DirectMethodHandle$Holder"; private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual"; private static final String DMH_INVOKE_STATIC = "invokeStatic"; private static final String DMH_INVOKE_SPECIAL = "invokeSpecial"; private static final String DMH_NEW_INVOKE_SPECIAL = "newInvokeSpecial"; private static final String DMH_INVOKE_INTERFACE = "invokeInterface"; private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit"; private static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess(); List<String> speciesTypes; --- 53,72 ---- private static final String DMH_PARAM = "dmh"; private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME); ! private static final String DIRECT_METHOD_HANDLE = "java/lang/invoke/DirectMethodHandle$Holder"; private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual"; private static final String DMH_INVOKE_STATIC = "invokeStatic"; private static final String DMH_INVOKE_SPECIAL = "invokeSpecial"; private static final String DMH_NEW_INVOKE_SPECIAL = "newInvokeSpecial"; private static final String DMH_INVOKE_INTERFACE = "invokeInterface"; private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit"; + private static final String DELEGATING_METHOD_HANDLE = "java/lang/invoke/DelegatingMethodHandle$Holder"; + private static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess(); List<String> speciesTypes;
*** 220,230 **** } @Override public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { // Copy all but DMH_ENTRY to out ! in.transformAndCopy(entry -> entry.path().equals(DMH_ENTRY) ? null : entry, out); speciesTypes.forEach(types -> generateBMHClass(types, out)); generateDMHClass(out); return out.build(); } --- 222,240 ---- } @Override public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { // Copy all but DMH_ENTRY to out ! in.transformAndCopy(entry -> { ! // filter out placeholder entries ! if (entry.path().equals(DIRECT_METHOD_HANDLE_ENTRY) || ! entry.path().equals(DELEGATING_METHOD_HANDLE_ENTRY)) { ! return null; ! } else { ! return entry; ! } ! }, out); speciesTypes.forEach(types -> generateBMHClass(types, out)); generateDMHClass(out); return out.build(); }
*** 262,280 **** dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType); index++; } } try { ! byte[] bytes = ! JLIA.generateDMHClassBytes(DMH, methodTypes, dmhTypes); ! ResourcePoolEntry ndata = ResourcePoolEntry.create(DMH_ENTRY, bytes); out.add(ndata); } catch (Exception ex) { throw new PluginException(ex); } } ! private static final String DMH_ENTRY = "/java.base/" + DMH + ".class"; // Convert LL -> LL, L3 -> LLL private static String expandSignature(String signature) { StringBuilder sb = new StringBuilder(); char last = 'X'; --- 272,299 ---- dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType); index++; } } try { ! byte[] bytes = JLIA.generateDirectMethodHandleHolderClassBytes( ! DIRECT_METHOD_HANDLE, methodTypes, dmhTypes); ! ResourcePoolEntry ndata = ResourcePoolEntry ! .create(DIRECT_METHOD_HANDLE_ENTRY, bytes); ! out.add(ndata); ! ! bytes = JLIA.generateDelegatingMethodHandleHolderClassBytes( ! DELEGATING_METHOD_HANDLE, methodTypes); ! ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HANDLE_ENTRY, bytes); out.add(ndata); } catch (Exception ex) { throw new PluginException(ex); } } ! private static final String DIRECT_METHOD_HANDLE_ENTRY = ! "/java.base/" + DIRECT_METHOD_HANDLE + ".class"; ! private static final String DELEGATING_METHOD_HANDLE_ENTRY = ! "/java.base/" + DELEGATING_METHOD_HANDLE + ".class"; // Convert LL -> LL, L3 -> LLL private static String expandSignature(String signature) { StringBuilder sb = new StringBuilder(); char last = 'X';
*** 308,326 **** private static MethodType asMethodType(String basicSignatureString) { String[] parts = basicSignatureString.split("_"); assert(parts.length == 2); assert(parts[1].length() == 1); String parameters = expandSignature(parts[0]); ! Class<?> rtype = primitiveType(parts[1].charAt(0)); Class<?>[] ptypes = new Class<?>[parameters.length()]; for (int i = 0; i < ptypes.length; i++) { ! ptypes[i] = primitiveType(parameters.charAt(i)); } return MethodType.methodType(rtype, ptypes); } ! private static Class<?> primitiveType(char c) { switch (c) { case 'F': return float.class; case 'D': return double.class; --- 327,349 ---- private static MethodType asMethodType(String basicSignatureString) { String[] parts = basicSignatureString.split("_"); assert(parts.length == 2); assert(parts[1].length() == 1); String parameters = expandSignature(parts[0]); ! Class<?> rtype = simpleType(parts[1].charAt(0)); Class<?>[] ptypes = new Class<?>[parameters.length()]; + if (ptypes.length == 0) { + return MethodType.methodType(rtype); + } else { for (int i = 0; i < ptypes.length; i++) { ! ptypes[i] = simpleType(parameters.charAt(i)); } return MethodType.methodType(rtype, ptypes); } + } ! private static Class<?> simpleType(char c) { switch (c) { case 'F': return float.class; case 'D': return double.class;
< prev index next >