8189209: java/lang/invoke/lambda/LambdaAsm.java failed with "could not create proxy classes" jdk-10+27
authorbpb
Thu, 12 Oct 2017 10:28:20 -0700
changeset 47332 b87d7b5d5ded
parent 47331 39d1de71faca
child 47333 0c2e5ef6a1c6
child 47338 89e5860b4e33
8189209: java/lang/invoke/lambda/LambdaAsm.java failed with "could not create proxy classes" Summary: Use an inner class for the closer instead of a lambda Reviewed-by: alanb, rriggs
src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java
--- a/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java	Thu Oct 12 16:00:29 2017 +0200
+++ b/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java	Thu Oct 12 10:28:20 2017 -0700
@@ -90,6 +90,18 @@
     // Cleanable with an action which closes this channel's file descriptor
     private final Cleanable closer;
 
+    private static class Closer implements Runnable {
+        private final FileDescriptor fd;
+
+        Closer(FileDescriptor fd) {
+            this.fd = fd;
+        }
+
+        public void run() {
+            fdAccess.close(fd);
+        }
+    }
+
     private FileChannelImpl(FileDescriptor fd, String path, boolean readable,
                             boolean writable, Object parent)
     {
@@ -101,8 +113,10 @@
         this.nd = new FileDispatcherImpl();
         // Register a cleaning action if and only if there is no parent
         // as the parent will take care of closing the file descriptor.
-        this.closer= parent != null ? null :
-            CleanerFactory.cleaner().register(this, () -> fdAccess.close(fd));
+        // FileChannel is used by the LambdaMetaFactory so a lambda cannot
+        // be used here hence we use a nested class instead.
+        this.closer = parent != null ? null :
+            CleanerFactory.cleaner().register(this, new Closer(fd));
     }
 
     // Used by FileInputStream.getChannel(), FileOutputStream.getChannel