< 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 >