diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/Main.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/Main.java index 07cae101a64..35fd1089b90 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/Main.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/Main.java @@ -25,6 +25,8 @@ package com.sun.tools.javac; +import com.sun.tools.javac.util.Name; + import java.io.PrintWriter; /** diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Main.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Main.java index 10e8ac7c854..eba9a9ef67a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Main.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Main.java @@ -40,6 +40,7 @@ import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Calendar; import java.util.Set; import java.util.regex.Matcher; @@ -192,179 +193,184 @@ public class Main { * @return the result of the compilation */ public Result compile(String[] argv, Context context) { - if (stdOut != null) { - context.put(Log.outKey, stdOut); - } + try { + if (stdOut != null) { + context.put(Log.outKey, stdOut); + } - if (stdErr != null) { - context.put(Log.errKey, stdErr); - } + if (stdErr != null) { + context.put(Log.errKey, stdErr); + } - log = Log.instance(context); + log = Log.instance(context); - if (argv.length == 0) { - OptionHelper h = new OptionHelper.GrumpyHelper(log) { - @Override - public String getOwnName() { return ownName; } - @Override - public void put(String name, String value) { } - }; - try { - Option.HELP.process(h, "-help"); - } catch (Option.InvalidValueException ignore) { + if (argv.length == 0) { + OptionHelper h = new OptionHelper.GrumpyHelper(log) { + @Override + public String getOwnName() { return ownName; } + + @Override + public void put(String name, String value) { } + }; + try { + Option.HELP.process(h, "-help"); + } catch (Option.InvalidValueException ignore) { + } + return Result.CMDERR; } - return Result.CMDERR; - } - // prefix argv with contents of environment variable and expand @-files - Iterable allArgs; - try { - allArgs = CommandLine.parse(ENV_OPT_NAME, List.from(argv)); - } catch (UnmatchedQuote ex) { - reportDiag(Errors.UnmatchedQuote(ex.variableName)); - return Result.CMDERR; - } catch (FileNotFoundException | NoSuchFileException e) { - reportHelper(Errors.FileNotFound(e.getMessage())); - return Result.SYSERR; - } catch (IOException ex) { - log.printLines(PrefixKind.JAVAC, "msg.io"); - ex.printStackTrace(log.getWriter(WriterKind.NOTICE)); - return Result.SYSERR; - } + // prefix argv with contents of environment variable and expand @-files + Iterable allArgs; + try { + allArgs = CommandLine.parse(ENV_OPT_NAME, List.from(argv)); + } catch (UnmatchedQuote ex) { + reportDiag(Errors.UnmatchedQuote(ex.variableName)); + return Result.CMDERR; + } catch (FileNotFoundException | NoSuchFileException e) { + reportHelper(Errors.FileNotFound(e.getMessage())); + return Result.SYSERR; + } catch (IOException ex) { + log.printLines(PrefixKind.JAVAC, "msg.io"); + ex.printStackTrace(log.getWriter(WriterKind.NOTICE)); + return Result.SYSERR; + } - Arguments args = Arguments.instance(context); - args.init(ownName, allArgs); + Arguments args = Arguments.instance(context); + args.init(ownName, allArgs); - if (log.nerrors > 0) - return Result.CMDERR; + if (log.nerrors > 0) + return Result.CMDERR; - Options options = Options.instance(context); + Options options = Options.instance(context); - // init Log - boolean forceStdOut = options.isSet("stdout"); - if (forceStdOut) { - log.flush(); - log.setWriters(new PrintWriter(System.out, true)); - } + // init Log + boolean forceStdOut = options.isSet("stdout"); + if (forceStdOut) { + log.flush(); + log.setWriters(new PrintWriter(System.out, true)); + } - // init CacheFSInfo - // allow System property in following line as a Mustang legacy - boolean batchMode = (options.isUnset("nonBatchMode") + // init CacheFSInfo + // allow System property in following line as a Mustang legacy + boolean batchMode = (options.isUnset("nonBatchMode") && System.getProperty("nonBatchMode") == null); - if (batchMode) - CacheFSInfo.preRegister(context); - - boolean ok = true; - - // init file manager - fileManager = context.get(JavaFileManager.class); - JavaFileManager undel = fileManager instanceof DelegatingJavaFileManager delegatingJavaFileManager ? - delegatingJavaFileManager.getBaseFileManager() : fileManager; - if (undel instanceof BaseFileManager baseFileManager) { - baseFileManager.setContext(context); // reinit with options - ok &= baseFileManager.handleOptions(args.getDeferredFileManagerOptions()); - } + if (batchMode) + CacheFSInfo.preRegister(context); + + boolean ok = true; + + // init file manager + fileManager = context.get(JavaFileManager.class); + JavaFileManager undel = fileManager instanceof DelegatingJavaFileManager delegatingJavaFileManager ? + delegatingJavaFileManager.getBaseFileManager() : fileManager; + if (undel instanceof BaseFileManager baseFileManager) { + baseFileManager.setContext(context); // reinit with options + ok &= baseFileManager.handleOptions(args.getDeferredFileManagerOptions()); + } - // handle this here so it works even if no other options given - String showClass = options.get("showClass"); - if (showClass != null) { - if (showClass.equals("showClass")) // no value given for option - showClass = "com.sun.tools.javac.Main"; - showClass(showClass); - } + // handle this here so it works even if no other options given + String showClass = options.get("showClass"); + if (showClass != null) { + if (showClass.equals("showClass")) // no value given for option + showClass = "com.sun.tools.javac.Main"; + showClass(showClass); + } - ok &= args.validate(); - if (!ok || log.nerrors > 0) - return Result.CMDERR; + ok &= args.validate(); + if (!ok || log.nerrors > 0) + return Result.CMDERR; - if (args.isEmpty()) - return Result.OK; + if (args.isEmpty()) + return Result.OK; - // init Dependencies - if (options.isSet("debug.completionDeps")) { - Dependencies.GraphDependencies.preRegister(context); - } + // init Dependencies + if (options.isSet("debug.completionDeps")) { + Dependencies.GraphDependencies.preRegister(context); + } - BasicJavacTask t = (BasicJavacTask) BasicJavacTask.instance(context); + BasicJavacTask t = (BasicJavacTask) BasicJavacTask.instance(context); - // init plugins - Set> pluginOpts = args.getPluginOpts(); - t.initPlugins(pluginOpts); + // init plugins + Set> pluginOpts = args.getPluginOpts(); + t.initPlugins(pluginOpts); - // init multi-release jar handling - if (fileManager.isSupportedOption(Option.MULTIRELEASE.primaryName) == 1) { - Target target = Target.instance(context); - List list = List.of(target.multiReleaseValue()); - fileManager.handleOption(Option.MULTIRELEASE.primaryName, list.iterator()); - } + // init multi-release jar handling + if (fileManager.isSupportedOption(Option.MULTIRELEASE.primaryName) == 1) { + Target target = Target.instance(context); + List list = List.of(target.multiReleaseValue()); + fileManager.handleOption(Option.MULTIRELEASE.primaryName, list.iterator()); + } - // init JavaCompiler - JavaCompiler comp = JavaCompiler.instance(context); + // init JavaCompiler + JavaCompiler comp = JavaCompiler.instance(context); - // init doclint - List docLintOpts = args.getDocLintOpts(); - if (!docLintOpts.isEmpty()) { - t.initDocLint(docLintOpts); - } + // init doclint + List docLintOpts = args.getDocLintOpts(); + if (!docLintOpts.isEmpty()) { + t.initDocLint(docLintOpts); + } - if (options.get(Option.XSTDOUT) != null) { - // Stdout reassigned - ask compiler to close it when it is done - comp.closeables = comp.closeables.prepend(log.getWriter(WriterKind.NOTICE)); - } + if (options.get(Option.XSTDOUT) != null) { + // Stdout reassigned - ask compiler to close it when it is done + comp.closeables = comp.closeables.prepend(log.getWriter(WriterKind.NOTICE)); + } - boolean printArgsToFile = options.isSet("printArgsToFile"); - try { - comp.compile(args.getFileObjects(), args.getClassNames(), null, List.nil()); - - if (log.expectDiagKeys != null) { - if (log.expectDiagKeys.isEmpty()) { - log.printRawLines("all expected diagnostics found"); - return Result.OK; - } else { - log.printRawLines("expected diagnostic keys not found: " + log.expectDiagKeys); - return Result.ERROR; + boolean printArgsToFile = options.isSet("printArgsToFile"); + try { + comp.compile(args.getFileObjects(), args.getClassNames(), null, List.nil()); + + if (log.expectDiagKeys != null) { + if (log.expectDiagKeys.isEmpty()) { + log.printRawLines("all expected diagnostics found"); + return Result.OK; + } else { + log.printRawLines("expected diagnostic keys not found: " + log.expectDiagKeys); + return Result.ERROR; + } } - } - return (comp.errorCount() == 0) ? Result.OK : Result.ERROR; - - } catch (OutOfMemoryError | StackOverflowError ex) { - resourceMessage(ex); - return Result.SYSERR; - } catch (FatalError ex) { - feMessage(ex, options); - return Result.SYSERR; - } catch (AnnotationProcessingError ex) { - apMessage(ex); - return Result.SYSERR; - } catch (PropagatedException ex) { - // TODO: what about errors from plugins? should not simply rethrow the error here - throw ex.getCause(); - } catch (IllegalAccessError iae) { - if (twoClassLoadersInUse(iae)) { - bugMessage(iae); - } - printArgsToFile = true; - return Result.ABNORMAL; - } catch (Throwable ex) { - // Nasty. If we've already reported an error, compensate - // for buggy compiler error recovery by swallowing thrown - // exceptions. - if (comp == null || comp.errorCount() == 0 || options.isSet("dev")) - bugMessage(ex); - printArgsToFile = true; - return Result.ABNORMAL; - } finally { - if (printArgsToFile) { - printArgumentsToFile(argv); - } - if (comp != null) { - try { - comp.close(); - } catch (ClientCodeException ex) { - throw new RuntimeException(ex.getCause()); + return (comp.errorCount() == 0) ? Result.OK : Result.ERROR; + + } catch (OutOfMemoryError | StackOverflowError ex) { + resourceMessage(ex); + return Result.SYSERR; + } catch (FatalError ex) { + feMessage(ex, options); + return Result.SYSERR; + } catch (AnnotationProcessingError ex) { + apMessage(ex); + return Result.SYSERR; + } catch (PropagatedException ex) { + // TODO: what about errors from plugins? should not simply rethrow the error here + throw ex.getCause(); + } catch (IllegalAccessError iae) { + if (twoClassLoadersInUse(iae)) { + bugMessage(iae); + } + printArgsToFile = true; + return Result.ABNORMAL; + } catch (Throwable ex) { + // Nasty. If we've already reported an error, compensate + // for buggy compiler error recovery by swallowing thrown + // exceptions. + if (comp == null || comp.errorCount() == 0 || options.isSet("dev")) + bugMessage(ex); + printArgsToFile = true; + return Result.ABNORMAL; + } finally { + if (printArgsToFile) { + printArgumentsToFile(argv); + } + if (comp != null) { + try { + comp.close(); + } catch (ClientCodeException ex) { + throw new RuntimeException(ex.getCause()); + } } } + } finally { + System.out.println("stats: " + Arrays.toString(new Object[]{Name.charAts, Name.lengths, Name.subSequences})); } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Name.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Name.java index 0ff4ea3204f..71f9f394ec8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Name.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Name.java @@ -29,6 +29,12 @@ import com.sun.tools.javac.jvm.ClassFile; import com.sun.tools.javac.jvm.PoolConstant; import com.sun.tools.javac.util.DefinedBy.Api; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicLong; + /** An abstraction for internal compiler strings. They are stored in * Utf8 format. Names are stored in a Name.Table, and are unique within * that table. @@ -42,6 +48,12 @@ public abstract class Name implements javax.lang.model.element.Name, PoolConstan public final Table table; + public static final ConcurrentMap, AtomicLong> lengths = new ConcurrentHashMap<>(); + + public static final ConcurrentMap, AtomicLong> charAts = new ConcurrentHashMap<>(); + + public static final ConcurrentMap, AtomicLong> subSequences = new ConcurrentHashMap<>(); + protected Name(Table table) { this.table = table; } @@ -63,13 +75,26 @@ public abstract class Name implements javax.lang.model.element.Name, PoolConstan * {@inheritDoc} */ public int length() { + updateStats(lengths); return toString().length(); } + private void updateStats(ConcurrentMap, AtomicLong> stats) { + stats.compute(getClass(), (c, i) -> { + if (i == null) { + return new AtomicLong(1); + } else { + i.incrementAndGet(); + return i; + } + }); + } + /** * {@inheritDoc} */ public char charAt(int index) { + updateStats(charAts); return toString().charAt(index); } @@ -77,6 +102,7 @@ public abstract class Name implements javax.lang.model.element.Name, PoolConstan * {@inheritDoc} */ public CharSequence subSequence(int start, int end) { + updateStats(subSequences); return toString().subSequence(start, end); }