From c05cf39b320c39bfd21fafa933a43df47e13651f Mon Sep 17 00:00:00 2001 From: jjg Date: Tue, 23 Sep 2008 10:44:51 -0700 Subject: [PATCH] 6420151: need to improve byfile compile policy to eliminate footprint issues Reviewed-by: mcimadamore --- .../sun/tools/javac/api/JavacTaskImpl.java | 13 +- .../com/sun/tools/javac/comp/Todo.java | 122 +++++++++++++- .../sun/tools/javac/main/JavaCompiler.java | 69 +++++--- .../com/sun/tools/javadoc/JavadocTodo.java | 9 +- src/share/classes/javax/tools/FileObject.java | 2 - test/tools/javac/6734819/T6734819b.out | 2 +- test/tools/javac/policy/{ => test1}/A.java | 0 test/tools/javac/policy/{ => test1}/B.java | 0 test/tools/javac/policy/{ => test1}/C.java | 0 test/tools/javac/policy/{ => test1}/D.java | 0 .../policy/{Test.java => test1/Test1a.java} | 8 + test/tools/javac/policy/test1/Test1b.java | 156 ++++++++++++++++++ .../javac/policy/{ => test1}/byfile.ABD.out | 12 +- .../javac/policy/{ => test1}/byfile.ACD.out | 15 +- .../javac/policy/{ => test1}/bytodo.ABD.out | 0 .../javac/policy/{ => test1}/bytodo.ACD.out | 0 .../javac/policy/{ => test1}/simple.ABD.out | 0 .../javac/policy/{ => test1}/simple.ACD.out | 0 test/tools/javac/policy/test2/A.java | 46 ++++++ test/tools/javac/policy/test2/B.java | 27 +++ test/tools/javac/policy/test2/Test.java | 42 +++++ test/tools/javac/policy/test2/byfile.AB.out | 15 ++ test/tools/javac/policy/test2/byfile.BA.out | 15 ++ test/tools/javac/policy/test2/bytodo.AB.out | 15 ++ test/tools/javac/policy/test2/bytodo.BA.out | 15 ++ 25 files changed, 533 insertions(+), 50 deletions(-) rename test/tools/javac/policy/{ => test1}/A.java (100%) rename test/tools/javac/policy/{ => test1}/B.java (100%) rename test/tools/javac/policy/{ => test1}/C.java (100%) rename test/tools/javac/policy/{ => test1}/D.java (100%) rename test/tools/javac/policy/{Test.java => test1/Test1a.java} (88%) create mode 100644 test/tools/javac/policy/test1/Test1b.java rename test/tools/javac/policy/{ => test1}/byfile.ABD.out (60%) rename test/tools/javac/policy/{ => test1}/byfile.ACD.out (66%) rename test/tools/javac/policy/{ => test1}/bytodo.ABD.out (100%) rename test/tools/javac/policy/{ => test1}/bytodo.ACD.out (100%) rename test/tools/javac/policy/{ => test1}/simple.ABD.out (100%) rename test/tools/javac/policy/{ => test1}/simple.ACD.out (100%) create mode 100644 test/tools/javac/policy/test2/A.java create mode 100644 test/tools/javac/policy/test2/B.java create mode 100644 test/tools/javac/policy/test2/Test.java create mode 100644 test/tools/javac/policy/test2/byfile.AB.out create mode 100644 test/tools/javac/policy/test2/byfile.BA.out create mode 100644 test/tools/javac/policy/test2/bytodo.AB.out create mode 100644 test/tools/javac/policy/test2/bytodo.BA.out diff --git a/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java b/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java index f2565607..c7bc83e5 100644 --- a/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java +++ b/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java @@ -474,23 +474,22 @@ public class JavacTaskImpl extends JavacTask { } abstract class Filter { - void run(ListBuffer> list, Iterable classes) { + void run(Queue> list, Iterable classes) { Set set = new HashSet(); for (TypeElement item: classes) set.add(item); - List> defer = List.>nil(); - while (list.nonEmpty()) { - Env env = list.next(); + ListBuffer> defer = ListBuffer.>lb(); + while (list.peek() != null) { + Env env = list.remove(); ClassSymbol csym = env.enclClass.sym; if (csym != null && set.contains(csym.outermostClass())) process(env); else - defer = defer.prepend(env); + defer = defer.append(env); } - for (List> l = defer; l.nonEmpty(); l = l.tail) - list.prepend(l.head); + list.addAll(defer); } abstract void process(Env env); diff --git a/src/share/classes/com/sun/tools/javac/comp/Todo.java b/src/share/classes/com/sun/tools/javac/comp/Todo.java index 3dd4c0fc..bab5bbc7 100644 --- a/src/share/classes/com/sun/tools/javac/comp/Todo.java +++ b/src/share/classes/com/sun/tools/javac/comp/Todo.java @@ -25,7 +25,14 @@ package com.sun.tools.javac.comp; -import com.sun.tools.javac.util.*; +import java.util.AbstractQueue; +import com.sun.tools.javac.util.Context; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; +import java.util.Queue; +import javax.tools.JavaFileObject; /** A queue of all as yet unattributed classes. * @@ -34,7 +41,7 @@ import com.sun.tools.javac.util.*; * This code and its internal interfaces are subject to change or * deletion without notice. */ -public class Todo extends ListBuffer> { +public class Todo extends AbstractQueue> { /** The context key for the todo list. */ protected static final Context.Key todoKey = new Context.Key(); @@ -51,4 +58,115 @@ public class Todo extends ListBuffer> { protected Todo(Context context) { context.put(todoKey, this); } + + public void append(Env env) { + add(env); + } + + @Override + public Iterator> iterator() { + return contents.iterator(); + } + + @Override + public int size() { + return contents.size(); + } + + public boolean offer(Env e) { + if (contents.add(e)) { + if (contentsByFile != null) + addByFile(e); + return true; + } else { + return false; + } + } + + public Env poll() { + if (size() == 0) + return null; + Env env = contents.remove(0); + if (contentsByFile != null) + removeByFile(env); + return env; + } + + public Env peek() { + return (size() == 0 ? null : contents.get(0)); + } + + public Queue>> groupByFile() { + if (contentsByFile == null) { + contentsByFile = new LinkedList>>(); + for (Env env: contents) { + addByFile(env); + } + } + return contentsByFile; + } + + private void addByFile(Env env) { + JavaFileObject file = env.toplevel.sourcefile; + if (fileMap == null) + fileMap = new HashMap(); + FileQueue fq = fileMap.get(file); + if (fq == null) { + fq = new FileQueue(); + fileMap.put(file, fq); + contentsByFile.add(fq); + } + fq.fileContents.add(env); + } + + private void removeByFile(Env env) { + JavaFileObject file = env.toplevel.sourcefile; + FileQueue fq = fileMap.get(file); + if (fq == null) + return; + if (fq.fileContents.remove(env)) { + if (fq.isEmpty()) { + fileMap.remove(file); + contentsByFile.remove(fq); + } + } + } + + LinkedList> contents = new LinkedList>(); + LinkedList>> contentsByFile; + Map fileMap; + + class FileQueue extends AbstractQueue> { + @Override + public Iterator> iterator() { + return fileContents.iterator(); + } + + @Override + public int size() { + return fileContents.size(); + } + + public boolean offer(Env e) { + if (fileContents.offer(e)) { + contents.add(e); + return true; + } + return false; + } + + public Env poll() { + if (fileContents.size() == 0) + return null; + Env env = fileContents.remove(0); + contents.remove(env); + return env; + } + + public Env peek() { + return (fileContents.size() == 0 ? null : fileContents.get(0)); + } + + LinkedList> fileContents = new LinkedList>(); + } } diff --git a/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java index ba05d17c..3f4911bb 100644 --- a/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -122,35 +122,47 @@ public class JavaCompiler implements ClassReader.SourceCompleter { } } - private static enum CompilePolicy { - /* - * Just attribute the parse trees + /** + * Control how the compiler's latter phases (attr, flow, desugar, generate) + * are connected. Each individual file is processed by each phase in turn, + * but with different compile policies, you can control the order in which + * each class is processed through its next phase. + * + *

Generally speaking, the compiler will "fail fast" in the face of + * errors, although not aggressively so. flow, desugar, etc become no-ops + * once any errors have occurred. No attempt is currently made to determine + * if it might be safe to process a class through its next phase because + * it does not depend on any unrelated errors that might have occurred. + */ + protected static enum CompilePolicy { + /** + * Just attribute the parse trees. */ ATTR_ONLY, - /* + /** * Just attribute and do flow analysis on the parse trees. * This should catch most user errors. */ CHECK_ONLY, - /* + /** * Attribute everything, then do flow analysis for everything, * then desugar everything, and only then generate output. - * Means nothing is generated if there are any errors in any classes. + * This means no output will be generated if there are any + * errors in any classes. */ SIMPLE, - /* - * After attributing everything and doing flow analysis, - * group the work by compilation unit. - * Then, process the work for each compilation unit together. - * Means nothing is generated for a compilation unit if the are any errors - * in the compilation unit (or in any preceding compilation unit.) + /** + * Groups the classes for each source file together, then process + * each group in a manner equivalent to the {@code SIMPLE} policy. + * This means no output will be generated if there are any + * errors in any of the classes in a source file. */ BY_FILE, - /* + /** * Completely process each entry on the todo list in turn. * -- this is the same for 1.5. * Means output might be generated for some classes in a compilation unit @@ -178,7 +190,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { private static CompilePolicy DEFAULT_COMPILE_POLICY = CompilePolicy.BY_TODO; - private static enum ImplicitSourcePolicy { + protected static enum ImplicitSourcePolicy { /** Don't generate or process implicitly read source files. */ NONE, /** Generate classes for implicitly read source files. */ @@ -252,11 +264,11 @@ public class JavaCompiler implements ClassReader.SourceCompleter { /** The type eraser. */ - TransTypes transTypes; + protected TransTypes transTypes; /** The syntactic sugar desweetener. */ - Lower lower; + protected Lower lower; /** The annotation annotator. */ @@ -788,14 +800,17 @@ public class JavaCompiler implements ClassReader.SourceCompleter { generate(desugar(flow(attribute(todo)))); break; - case BY_FILE: - for (Queue> queue : groupByFile(flow(attribute(todo))).values()) - generate(desugar(queue)); + case BY_FILE: { + Queue>> q = todo.groupByFile(); + while (!q.isEmpty() && errorCount() == 0) { + generate(desugar(flow(attribute(q.remove())))); + } + } break; case BY_TODO: - while (todo.nonEmpty()) - generate(desugar(flow(attribute(todo.next())))); + while (!todo.isEmpty()) + generate(desugar(flow(attribute(todo.remove())))); break; default: @@ -1105,13 +1120,13 @@ public class JavaCompiler implements ClassReader.SourceCompleter { /** * Perform dataflow checks on an attributed parse tree. */ - protected void flow(Env env, ListBuffer> results) { + protected void flow(Env env, Queue> results) { try { if (errorCount() > 0) return; if (relax || compileStates.isDone(env, CompileState.FLOW)) { - results.append(env); + results.add(env); return; } @@ -1130,7 +1145,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { if (errorCount() > 0) return; - results.append(env); + results.add(env); } finally { log.useSource(prev); @@ -1284,7 +1299,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { generate(queue, null); } - public void generate(Queue, JCClassDecl>> queue, ListBuffer results) { + public void generate(Queue, JCClassDecl>> queue, Queue results) { boolean usePrintSource = (stubOutput || sourceOutput || printFlat); for (Pair, JCClassDecl> x: queue) { @@ -1294,7 +1309,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { if (verboseCompilePolicy) { log.printLines(log.noticeWriter, "[generate " + (usePrintSource ? " source" : "code") - + " " + env.enclClass.sym + "]"); + + " " + cdef.sym + "]"); } if (taskListener != null) { @@ -1312,7 +1327,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { else file = genCode(env, cdef); if (results != null && file != null) - results.append(file); + results.add(file); } catch (IOException ex) { log.error(cdef.pos(), "class.cant.write", cdef.sym, ex.getMessage()); diff --git a/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java b/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java index 1552fe1e..f1d2e536 100644 --- a/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java +++ b/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java @@ -46,8 +46,13 @@ public class JavadocTodo extends Todo { super(context); } - public ListBuffer> append(Env e) { + @Override + public void append(Env e) { // do nothing; Javadoc doesn't perform attribution. - return this; + } + + @Override + public boolean offer(Env e) { + return false; } } diff --git a/src/share/classes/javax/tools/FileObject.java b/src/share/classes/javax/tools/FileObject.java index 046ad959..bbf5037a 100644 --- a/src/share/classes/javax/tools/FileObject.java +++ b/src/share/classes/javax/tools/FileObject.java @@ -26,12 +26,10 @@ package javax.tools; import java.io.IOException; -import java.io.CharConversionException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; -import java.nio.CharBuffer; import java.net.URI; /** diff --git a/test/tools/javac/6734819/T6734819b.out b/test/tools/javac/6734819/T6734819b.out index 4b25a08e..3d715333 100644 --- a/test/tools/javac/6734819/T6734819b.out +++ b/test/tools/javac/6734819/T6734819b.out @@ -5,5 +5,5 @@ [desugar A] [generate code A] [desugar B] -[generate code B] +[generate code B.C] [generate code B] diff --git a/test/tools/javac/policy/A.java b/test/tools/javac/policy/test1/A.java similarity index 100% rename from test/tools/javac/policy/A.java rename to test/tools/javac/policy/test1/A.java diff --git a/test/tools/javac/policy/B.java b/test/tools/javac/policy/test1/B.java similarity index 100% rename from test/tools/javac/policy/B.java rename to test/tools/javac/policy/test1/B.java diff --git a/test/tools/javac/policy/C.java b/test/tools/javac/policy/test1/C.java similarity index 100% rename from test/tools/javac/policy/C.java rename to test/tools/javac/policy/test1/C.java diff --git a/test/tools/javac/policy/D.java b/test/tools/javac/policy/test1/D.java similarity index 100% rename from test/tools/javac/policy/D.java rename to test/tools/javac/policy/test1/D.java diff --git a/test/tools/javac/policy/Test.java b/test/tools/javac/policy/test1/Test1a.java similarity index 88% rename from test/tools/javac/policy/Test.java rename to test/tools/javac/policy/test1/Test1a.java index 694daa89..5e850023 100644 --- a/test/tools/javac/policy/Test.java +++ b/test/tools/javac/policy/test1/Test1a.java @@ -21,6 +21,14 @@ * have any questions. */ +// These tests exercise the various compile policies available via +// JavaCompiler.CompilePolicy. Like any golden file tests, they are +// somewhat fragile and susceptible to breakage, but like the canary +// in the mine, it is useful to know when something is not as it used +// to be. The golden files should not be taken as a guarantee of +// future behavior, and should be updated, with due care, if the +// behavior of the compile policy is deliberately changed. + /* * @test * @bug 6260188 6290772 diff --git a/test/tools/javac/policy/test1/Test1b.java b/test/tools/javac/policy/test1/Test1b.java new file mode 100644 index 00000000..8cf3d4d3 --- /dev/null +++ b/test/tools/javac/policy/test1/Test1b.java @@ -0,0 +1,156 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test 6420151 + * @summary Compile a group of files and validate the set of class files produced + * @run main Test1b -XDcompilePolicy=byfile A.java B.java D.java + */ + +/* + * @test 6420151 + * @summary Compile a group of files and validate the set of class files produced + * @run main Test1b -XDcompilePolicy=byfile A.java C.java D.java + */ + +/* + * @test 6420151 + * @summary Compile a group of files and validate the set of class files produced + * @run main Test1b -XDcompilePolicy=simple A.java B.java D.java + */ + +/* + * @test 6420151 + * @summary Compile a group of files and validate the set of class files produced + * @run main Test1b -XDcompilePolicy=simple A.java C.java D.java + */ + +// These test cases should be uncommented when the default compile policy is +// changed to "byfile". While the default policy is "bytodo", the test cases fail +///* +// * @test 6420151 +// * @summary Compile a group of files and validate the set of class files produced +// * @run main Test1b A.java B.java D.java +// */ +// +///* +// * @test 6420151 +// * @summary Compile a group of files and validate the set of class files produced +// * @run main Test1b A.java C.java D.java +// */ + +// These test cases are retained for debugging; if uncommented, they show that +// to bytodo mode fails the "all or none" class file test +///* +// * @test 6420151 +// * @summary Compile a group of files and validate the set of class files produced +// * @run main Test1b -XDcompilePolicy=bytodo A.java B.java D.java +// */ +// +///* +// * @test 6420151 +// * @summary Compile a group of files and validate the set of class files produced +// * @run main Test1b -XDcompilePolicy=bytodo A.java C.java D.java +// */ + +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Test1b +{ + public static void main(String... args) throws Exception { + new Test1b().run(args); + } + + void run(String... args) throws Exception { + File testSrcDir = new File(System.getProperty("test.src")); + File tmpClassDir = new File("."); + List l = new ArrayList(); + l.add("-d"); + l.add(tmpClassDir.getPath()); + for (String a: args) { + if (a.endsWith(".java")) + l.add(new File(testSrcDir, a).getPath()); + else + l.add(a); + } + + StringWriter sw = new StringWriter(); + int rc = com.sun.tools.javac.Main.compile(l.toArray(new String[l.size()]), new PrintWriter(sw)); + System.err.println(sw); + + Pattern p = Pattern.compile("([A-Z]+).*"); + for (String name: tmpClassDir.list()) { + if (name.endsWith(".class")) { + Matcher m = p.matcher(name); + if (m.matches()) { + found(m.group(1), name); + } + } + } + + // for all classes that might have been compiled, check that + // all the classes in the source file get generated, or none do. + check("A", 3); + check("B", 3); + check("C", 3); + check("D", 3); + + if (errors > 0) + throw new Exception(errors + " errors"); + } + + void check(String prefix, int expect) { + List names = map.get(prefix); + int found = (names == null ? 0 : names.size()); + if (found == 0 || found == expect) { + System.err.println("Found " + found + " files for " + prefix + ": OK"); + return; + } + error("Found " + found + " files for " + prefix + ": expected 0 or " + expect + " " + names); + } + + void found(String prefix, String name) { + List names = map.get(prefix); + if (names == null) { + names = new ArrayList(); + map.put(prefix, names); + } + names.add(name); + } + + void error(String message) { + System.err.println(message); + errors++; + } + + Map> map = new HashMap>(); + int errors; +} diff --git a/test/tools/javac/policy/byfile.ABD.out b/test/tools/javac/policy/test1/byfile.ABD.out similarity index 60% rename from test/tools/javac/policy/byfile.ABD.out rename to test/tools/javac/policy/test1/byfile.ABD.out index ac67dbd5..4ad8736c 100644 --- a/test/tools/javac/policy/byfile.ABD.out +++ b/test/tools/javac/policy/test1/byfile.ABD.out @@ -1,11 +1,17 @@ [attribute A] [attribute A1] [attribute A2] +[flow A] +[flow A1] +[flow A2] +[desugar A] +[desugar A1] +[desugar A2] +[generate code A] +[generate code A1] +[generate code A2] [attribute B] [attribute B1] B.java:12:9: compiler.err.cant.resolve.location: kindname.variable, x, , , kindname.class, B1 [attribute B2] -[attribute D] -[attribute D1] -[attribute D2] 1 error diff --git a/test/tools/javac/policy/byfile.ACD.out b/test/tools/javac/policy/test1/byfile.ACD.out similarity index 66% rename from test/tools/javac/policy/byfile.ACD.out rename to test/tools/javac/policy/test1/byfile.ACD.out index 02598f14..66534ce0 100644 --- a/test/tools/javac/policy/byfile.ACD.out +++ b/test/tools/javac/policy/test1/byfile.ACD.out @@ -1,15 +1,18 @@ [attribute A] [attribute A1] [attribute A2] -[attribute C] -[attribute C1] -[attribute C2] -[attribute D] -[attribute D1] -[attribute D2] [flow A] [flow A1] [flow A2] +[desugar A] +[desugar A1] +[desugar A2] +[generate code A] +[generate code A1] +[generate code A2] +[attribute C] +[attribute C1] +[attribute C2] [flow C] [flow C1] C.java:12:17: compiler.err.unreachable.stmt diff --git a/test/tools/javac/policy/bytodo.ABD.out b/test/tools/javac/policy/test1/bytodo.ABD.out similarity index 100% rename from test/tools/javac/policy/bytodo.ABD.out rename to test/tools/javac/policy/test1/bytodo.ABD.out diff --git a/test/tools/javac/policy/bytodo.ACD.out b/test/tools/javac/policy/test1/bytodo.ACD.out similarity index 100% rename from test/tools/javac/policy/bytodo.ACD.out rename to test/tools/javac/policy/test1/bytodo.ACD.out diff --git a/test/tools/javac/policy/simple.ABD.out b/test/tools/javac/policy/test1/simple.ABD.out similarity index 100% rename from test/tools/javac/policy/simple.ABD.out rename to test/tools/javac/policy/test1/simple.ABD.out diff --git a/test/tools/javac/policy/simple.ACD.out b/test/tools/javac/policy/test1/simple.ACD.out similarity index 100% rename from test/tools/javac/policy/simple.ACD.out rename to test/tools/javac/policy/test1/simple.ACD.out diff --git a/test/tools/javac/policy/test2/A.java b/test/tools/javac/policy/test2/A.java new file mode 100644 index 00000000..924b6120 --- /dev/null +++ b/test/tools/javac/policy/test2/A.java @@ -0,0 +1,46 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +class A { + + class A1 { + } + + static class A2 extends B { + } + + static class A3 extends B.Inner { + } + + class A4 { + void m1() { + class A3m1 { } + } + + void m2() { + new B() { + }; + } + } + +} diff --git a/test/tools/javac/policy/test2/B.java b/test/tools/javac/policy/test2/B.java new file mode 100644 index 00000000..234b3f45 --- /dev/null +++ b/test/tools/javac/policy/test2/B.java @@ -0,0 +1,27 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +class B { + static class Inner { + } +} diff --git a/test/tools/javac/policy/test2/Test.java b/test/tools/javac/policy/test2/Test.java new file mode 100644 index 00000000..604ae201 --- /dev/null +++ b/test/tools/javac/policy/test2/Test.java @@ -0,0 +1,42 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @compile/ref=byfile.AB.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=byfile A.java B.java + */ + +/* + * @test + * @compile/ref=byfile.BA.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=byfile B.java A.java + */ + +/* + * @test + * @compile/ref=bytodo.AB.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=bytodo A.java B.java + */ + +/* + * @test + * @compile/ref=bytodo.BA.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=bytodo B.java A.java + */ diff --git a/test/tools/javac/policy/test2/byfile.AB.out b/test/tools/javac/policy/test2/byfile.AB.out new file mode 100644 index 00000000..fdc7d872 --- /dev/null +++ b/test/tools/javac/policy/test2/byfile.AB.out @@ -0,0 +1,15 @@ +[attribute A] +[flow A] +[attribute B] +[flow B] +[desugar A] +[generate code A.A1] +[generate code A.A2] +[generate code A.A3] +[generate code A3m1] +[generate code ] +[generate code A.A4] +[generate code A] +[desugar B] +[generate code B.Inner] +[generate code B] diff --git a/test/tools/javac/policy/test2/byfile.BA.out b/test/tools/javac/policy/test2/byfile.BA.out new file mode 100644 index 00000000..565ad138 --- /dev/null +++ b/test/tools/javac/policy/test2/byfile.BA.out @@ -0,0 +1,15 @@ +[attribute B] +[flow B] +[desugar B] +[generate code B.Inner] +[generate code B] +[attribute A] +[flow A] +[desugar A] +[generate code A.A1] +[generate code A.A2] +[generate code A.A3] +[generate code A3m1] +[generate code ] +[generate code A.A4] +[generate code A] diff --git a/test/tools/javac/policy/test2/bytodo.AB.out b/test/tools/javac/policy/test2/bytodo.AB.out new file mode 100644 index 00000000..fdc7d872 --- /dev/null +++ b/test/tools/javac/policy/test2/bytodo.AB.out @@ -0,0 +1,15 @@ +[attribute A] +[flow A] +[attribute B] +[flow B] +[desugar A] +[generate code A.A1] +[generate code A.A2] +[generate code A.A3] +[generate code A3m1] +[generate code ] +[generate code A.A4] +[generate code A] +[desugar B] +[generate code B.Inner] +[generate code B] diff --git a/test/tools/javac/policy/test2/bytodo.BA.out b/test/tools/javac/policy/test2/bytodo.BA.out new file mode 100644 index 00000000..565ad138 --- /dev/null +++ b/test/tools/javac/policy/test2/bytodo.BA.out @@ -0,0 +1,15 @@ +[attribute B] +[flow B] +[desugar B] +[generate code B.Inner] +[generate code B] +[attribute A] +[flow A] +[desugar A] +[generate code A.A1] +[generate code A.A2] +[generate code A.A3] +[generate code A3m1] +[generate code ] +[generate code A.A4] +[generate code A] -- GitLab