jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java Thu Aug 18 09:52:43 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java Thu Aug 18 19:00:39 2016 +0200
@@ -55,7 +55,7 @@
private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME);
- private static final String DMH = "java/lang/invoke/DirectMethodHandle$Holder";
+ 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";
@@ -63,6 +63,8 @@
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();
@@ -222,7 +224,15 @@
@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);
+ 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();
@@ -264,15 +274,24 @@
}
}
try {
- byte[] bytes =
- JLIA.generateDMHClassBytes(DMH, methodTypes, dmhTypes);
- ResourcePoolEntry ndata = ResourcePoolEntry.create(DMH_ENTRY, bytes);
+ 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 DMH_ENTRY = "/java.base/" + DMH + ".class";
+ 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) {
@@ -310,15 +329,19 @@
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));
+ Class<?> rtype = simpleType(parts[1].charAt(0));
+ if (parameters.isEmpty()) {
+ return MethodType.methodType(rtype);
+ } else {
+ Class<?>[] ptypes = new Class<?>[parameters.length()];
+ for (int i = 0; i < ptypes.length; i++) {
+ ptypes[i] = simpleType(parameters.charAt(i));
+ }
+ return MethodType.methodType(rtype, ptypes);
}
- return MethodType.methodType(rtype, ptypes);
}
- private static Class<?> primitiveType(char c) {
+ private static Class<?> simpleType(char c) {
switch (c) {
case 'F':
return float.class;