mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-11 02:48:20 +00:00
6420151: need to improve byfile compile policy to eliminate footprint issues
Reviewed-by: mcimadamore
This commit is contained in:
parent
4cea49cf1c
commit
fc58b54ba3
@ -474,23 +474,22 @@ public class JavacTaskImpl extends JavacTask {
|
||||
}
|
||||
|
||||
abstract class Filter {
|
||||
void run(ListBuffer<Env<AttrContext>> list, Iterable<? extends TypeElement> classes) {
|
||||
void run(Queue<Env<AttrContext>> list, Iterable<? extends TypeElement> classes) {
|
||||
Set<TypeElement> set = new HashSet<TypeElement>();
|
||||
for (TypeElement item: classes)
|
||||
set.add(item);
|
||||
|
||||
List<Env<AttrContext>> defer = List.<Env<AttrContext>>nil();
|
||||
while (list.nonEmpty()) {
|
||||
Env<AttrContext> env = list.next();
|
||||
ListBuffer<Env<AttrContext>> defer = ListBuffer.<Env<AttrContext>>lb();
|
||||
while (list.peek() != null) {
|
||||
Env<AttrContext> 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<Env<AttrContext>> l = defer; l.nonEmpty(); l = l.tail)
|
||||
list.prepend(l.head);
|
||||
list.addAll(defer);
|
||||
}
|
||||
|
||||
abstract void process(Env<AttrContext> env);
|
||||
|
||||
@ -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.</b>
|
||||
*/
|
||||
public class Todo extends ListBuffer<Env<AttrContext>> {
|
||||
public class Todo extends AbstractQueue<Env<AttrContext>> {
|
||||
/** The context key for the todo list. */
|
||||
protected static final Context.Key<Todo> todoKey =
|
||||
new Context.Key<Todo>();
|
||||
@ -51,4 +58,115 @@ public class Todo extends ListBuffer<Env<AttrContext>> {
|
||||
protected Todo(Context context) {
|
||||
context.put(todoKey, this);
|
||||
}
|
||||
|
||||
public void append(Env<AttrContext> env) {
|
||||
add(env);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Env<AttrContext>> iterator() {
|
||||
return contents.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return contents.size();
|
||||
}
|
||||
|
||||
public boolean offer(Env<AttrContext> e) {
|
||||
if (contents.add(e)) {
|
||||
if (contentsByFile != null)
|
||||
addByFile(e);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public Env<AttrContext> poll() {
|
||||
if (size() == 0)
|
||||
return null;
|
||||
Env<AttrContext> env = contents.remove(0);
|
||||
if (contentsByFile != null)
|
||||
removeByFile(env);
|
||||
return env;
|
||||
}
|
||||
|
||||
public Env<AttrContext> peek() {
|
||||
return (size() == 0 ? null : contents.get(0));
|
||||
}
|
||||
|
||||
public Queue<Queue<Env<AttrContext>>> groupByFile() {
|
||||
if (contentsByFile == null) {
|
||||
contentsByFile = new LinkedList<Queue<Env<AttrContext>>>();
|
||||
for (Env<AttrContext> env: contents) {
|
||||
addByFile(env);
|
||||
}
|
||||
}
|
||||
return contentsByFile;
|
||||
}
|
||||
|
||||
private void addByFile(Env<AttrContext> env) {
|
||||
JavaFileObject file = env.toplevel.sourcefile;
|
||||
if (fileMap == null)
|
||||
fileMap = new HashMap<JavaFileObject, FileQueue>();
|
||||
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<AttrContext> 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<Env<AttrContext>> contents = new LinkedList<Env<AttrContext>>();
|
||||
LinkedList<Queue<Env<AttrContext>>> contentsByFile;
|
||||
Map<JavaFileObject, FileQueue> fileMap;
|
||||
|
||||
class FileQueue extends AbstractQueue<Env<AttrContext>> {
|
||||
@Override
|
||||
public Iterator<Env<AttrContext>> iterator() {
|
||||
return fileContents.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return fileContents.size();
|
||||
}
|
||||
|
||||
public boolean offer(Env<AttrContext> e) {
|
||||
if (fileContents.offer(e)) {
|
||||
contents.add(e);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Env<AttrContext> poll() {
|
||||
if (fileContents.size() == 0)
|
||||
return null;
|
||||
Env<AttrContext> env = fileContents.remove(0);
|
||||
contents.remove(env);
|
||||
return env;
|
||||
}
|
||||
|
||||
public Env<AttrContext> peek() {
|
||||
return (fileContents.size() == 0 ? null : fileContents.get(0));
|
||||
}
|
||||
|
||||
LinkedList<Env<AttrContext>> fileContents = new LinkedList<Env<AttrContext>>();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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.
|
||||
*
|
||||
* <p>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<Env<AttrContext>> queue : groupByFile(flow(attribute(todo))).values())
|
||||
generate(desugar(queue));
|
||||
case BY_FILE: {
|
||||
Queue<Queue<Env<AttrContext>>> 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<AttrContext> env, ListBuffer<Env<AttrContext>> results) {
|
||||
protected void flow(Env<AttrContext> env, Queue<Env<AttrContext>> 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<Pair<Env<AttrContext>, JCClassDecl>> queue, ListBuffer<JavaFileObject> results) {
|
||||
public void generate(Queue<Pair<Env<AttrContext>, JCClassDecl>> queue, Queue<JavaFileObject> results) {
|
||||
boolean usePrintSource = (stubOutput || sourceOutput || printFlat);
|
||||
|
||||
for (Pair<Env<AttrContext>, 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());
|
||||
|
||||
@ -46,8 +46,13 @@ public class JavadocTodo extends Todo {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public ListBuffer<Env<AttrContext>> append(Env<AttrContext> e) {
|
||||
@Override
|
||||
public void append(Env<AttrContext> e) {
|
||||
// do nothing; Javadoc doesn't perform attribution.
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean offer(Env<AttrContext> e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@ -5,5 +5,5 @@
|
||||
[desugar A]
|
||||
[generate code A]
|
||||
[desugar B]
|
||||
[generate code B]
|
||||
[generate code B.C]
|
||||
[generate code B]
|
||||
|
||||
@ -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
|
||||
156
langtools/test/tools/javac/policy/test1/Test1b.java
Normal file
156
langtools/test/tools/javac/policy/test1/Test1b.java
Normal file
@ -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<String> l = new ArrayList<String>();
|
||||
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<String> 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<String> names = map.get(prefix);
|
||||
if (names == null) {
|
||||
names = new ArrayList<String>();
|
||||
map.put(prefix, names);
|
||||
}
|
||||
names.add(name);
|
||||
}
|
||||
|
||||
void error(String message) {
|
||||
System.err.println(message);
|
||||
errors++;
|
||||
}
|
||||
|
||||
Map<String,List<String>> map = new HashMap<String,List<String>>();
|
||||
int errors;
|
||||
}
|
||||
@ -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
|
||||
@ -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
|
||||
46
langtools/test/tools/javac/policy/test2/A.java
Normal file
46
langtools/test/tools/javac/policy/test2/A.java
Normal file
@ -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() {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
27
langtools/test/tools/javac/policy/test2/B.java
Normal file
27
langtools/test/tools/javac/policy/test2/B.java
Normal file
@ -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 {
|
||||
}
|
||||
}
|
||||
42
langtools/test/tools/javac/policy/test2/Test.java
Normal file
42
langtools/test/tools/javac/policy/test2/Test.java
Normal file
@ -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
|
||||
*/
|
||||
15
langtools/test/tools/javac/policy/test2/byfile.AB.out
Normal file
15
langtools/test/tools/javac/policy/test2/byfile.AB.out
Normal file
@ -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 <anonymous A$A4$1>]
|
||||
[generate code A.A4]
|
||||
[generate code A]
|
||||
[desugar B]
|
||||
[generate code B.Inner]
|
||||
[generate code B]
|
||||
15
langtools/test/tools/javac/policy/test2/byfile.BA.out
Normal file
15
langtools/test/tools/javac/policy/test2/byfile.BA.out
Normal file
@ -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 <anonymous A$A4$1>]
|
||||
[generate code A.A4]
|
||||
[generate code A]
|
||||
15
langtools/test/tools/javac/policy/test2/bytodo.AB.out
Normal file
15
langtools/test/tools/javac/policy/test2/bytodo.AB.out
Normal file
@ -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 <anonymous A$A4$1>]
|
||||
[generate code A.A4]
|
||||
[generate code A]
|
||||
[desugar B]
|
||||
[generate code B.Inner]
|
||||
[generate code B]
|
||||
15
langtools/test/tools/javac/policy/test2/bytodo.BA.out
Normal file
15
langtools/test/tools/javac/policy/test2/bytodo.BA.out
Normal file
@ -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 <anonymous A$A4$1>]
|
||||
[generate code A.A4]
|
||||
[generate code A]
|
||||
Loading…
x
Reference in New Issue
Block a user