< prev index next >

test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathDirEntry.java

Print this page
rev 13327 : 8184738: CTW fails with assert(!method->method_holder()->is_not_initialized()) failed: method holder must be initialized
Reviewed-by: duke

@@ -21,106 +21,75 @@
  * questions.
  */
 
 package sun.hotspot.tools.ctw;
 
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Set;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.concurrent.Executor;
-
-import java.io.*;
-import java.nio.file.*;
-import java.nio.file.attribute.*;
+
+import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.stream.Stream;
 
 /**
  * Handler for dirs containing classes to compile.
  */
-public class ClassPathDirEntry extends PathHandler {
-
-    private final int rootLength = root.toString().length();
+public class ClassPathDirEntry extends PathHandler.PathEntry {
+    private final int rootLength;
 
-    public ClassPathDirEntry(Path root, Executor executor) {
-        super(root, executor);
-        try {
-            URL url = root.toUri().toURL();
-            setLoader(new URLClassLoader(new URL[]{url}));
-        } catch (MalformedURLException e) {
-            e.printStackTrace();
+    public ClassPathDirEntry(Path root) {
+        super(root);
+        if (!Files.exists(root)) {
+            throw new Error(root + " dir does not exist");
         }
+        rootLength = root.toString()
+                         .length();
     }
 
     @Override
-    public void process() {
-        CompileTheWorld.OUT.println("# dir: " + root);
-        if (!Files.exists(root)) {
-            return;
-        }
+    protected Stream<String> classes() {
         try {
-            Files.walkFileTree(root, EnumSet.of(FileVisitOption.FOLLOW_LINKS),
-                    Integer.MAX_VALUE, new CompileFileVisitor());
-        } catch (IOException ioe) {
-            ioe.printStackTrace();
+            return Files.walk(root, Integer.MAX_VALUE, FileVisitOption.FOLLOW_LINKS)
+                        .filter(p -> Utils.isClassFile(p.toString()))
+                        .map(this::pathToClassName);
+        } catch (IOException e) {
+            throw new Error("can not traverse " + root + " : " + e.getMessage(), e);
         }
     }
 
     @Override
-    public long classCount() {
-        try {
-            return Files.walk(root, FileVisitOption.FOLLOW_LINKS).count();
-        } catch (IOException e) {
-            throw new Error("can not walk dir " + root + " : "
-                    + e.getMessage(), e);
-        }
+    protected String description() {
+        return "# dir: " + root;
     }
 
-    private void processFile(Path file) {
-        if (Utils.isClassFile(file.toString())) {
-            processClass(pathToClassName(file));
+    @Override
+    protected byte[] findByteCode(String classname) {
+        Path path = root;
+        for (String c : Utils.classNameToFileName(classname).split("/")) {
+            path = path.resolve(c);
+        }
+        if (!path.toFile()
+                 .exists()) {
+            return null;
+        }
+        try {
+            return Files.readAllBytes(path);
+        } catch (IOException e) {
+            e.printStackTrace(CompileTheWorld.ERR);
+            return null;
         }
     }
 
     private String pathToClassName(Path file) {
         String fileString;
         if (root == file) {
-            fileString = file.normalize().toString();
+            fileString = file.normalize()
+                             .toString();
         } else {
-            fileString = file.normalize().toString().substring(rootLength + 1);
+            fileString = file.normalize()
+                             .toString()
+                             .substring(rootLength + 1);
         }
         return Utils.fileNameToClassName(fileString);
     }
-
-    private class CompileFileVisitor extends SimpleFileVisitor<Path> {
-
-        private final Set<Path> ready = new HashSet<>();
-
-        @Override
-        public FileVisitResult preVisitDirectory(Path dir,
-                BasicFileAttributes attrs) throws IOException {
-            if (ready.contains(dir)) {
-                return FileVisitResult.SKIP_SUBTREE;
-            }
-            ready.add(dir);
-            return super.preVisitDirectory(dir, attrs);
-        }
-
-        @Override
-        public FileVisitResult visitFile(Path file,
-                BasicFileAttributes attrs) throws IOException {
-            if (!ready.contains(file)) {
-                processFile(file);
-            }
-            return isFinished() ? FileVisitResult.TERMINATE
-                    : FileVisitResult.CONTINUE;
-        }
-
-        @Override
-        public FileVisitResult visitFileFailed(Path file,
-                IOException exc) throws IOException {
-            return FileVisitResult.CONTINUE;
-        }
-    }
 }
 
< prev index next >