Fixed some nondeterministic iterator; also some Java 5 updates.
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1508 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index 607bae4..36c45c8 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -68,7 +68,6 @@
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -142,7 +141,7 @@
// Find the appropriate (noArg) constructor
JMethod noArgCtor = null;
for (int j = 0; j < mainClass.methods.size(); ++j) {
- JMethod ctor = (JMethod) mainClass.methods.get(j);
+ JMethod ctor = mainClass.methods.get(j);
if (ctor.getName().equals(mainClass.getShortName())) {
if (ctor.params.size() == 0) {
noArgCtor = ctor;
@@ -177,7 +176,7 @@
private static JMethod findMainMethod(JReferenceType referenceType) {
for (int j = 0; j < referenceType.methods.size(); ++j) {
- JMethod method = (JMethod) referenceType.methods.get(j);
+ JMethod method = referenceType.methods.get(j);
if (method.getName().equals("onModuleLoad")) {
if (method.params.size() == 0) {
return method;
@@ -202,7 +201,7 @@
private long lastModified;
private final boolean obfuscate;
private final boolean prettyNames;
- private final Set/* <IProblem> */problemSet = new HashSet/* <IProblem> */();
+ private final Set<IProblem> problemSet = new HashSet<IProblem>();
public JavaToJavaScriptCompiler(final TreeLogger logger,
final WebModeCompilerFrontEnd compiler, final String[] declEntryPts)
@@ -230,9 +229,9 @@
// Find all the possible rebound entry points.
//
RebindPermutationOracle rpo = compiler.getRebindPermutationOracle();
- Set allEntryPoints = new HashSet();
- for (int i = 0; i < declEntryPts.length; i++) {
- String[] all = rpo.getAllPossibleRebindAnswers(logger, declEntryPts[i]);
+ Set<String> allEntryPoints = new HashSet<String>();
+ for (String element : declEntryPts) {
+ String[] all = rpo.getAllPossibleRebindAnswers(logger, element);
Util.addAll(allEntryPoints, all);
}
String[] entryPts = Util.toStringArray(allEntryPoints);
@@ -262,8 +261,7 @@
//
lastModified = 0;
CompilationUnitProvider newestCup = null;
- for (int i = 0; i < goldenCuds.length; i++) {
- CompilationUnitDeclaration cud = goldenCuds[i];
+ for (CompilationUnitDeclaration cud : goldenCuds) {
ICompilationUnitAdapter icua = (ICompilationUnitAdapter) cud.compilationResult.compilationUnit;
CompilationUnitProvider cup = icua.getCompilationUnitProvider();
long cupLastModified = cup.getLastModified();
@@ -427,9 +425,8 @@
} catch (InternalCompilerException e) {
TreeLogger topBranch = logger.branch(TreeLogger.ERROR,
"An internal compiler exception occurred", e);
- List nodeTrace = e.getNodeTrace();
- for (Iterator it = nodeTrace.iterator(); it.hasNext();) {
- NodeInfo nodeInfo = (NodeInfo) it.next();
+ List<NodeInfo> nodeTrace = e.getNodeTrace();
+ for (NodeInfo nodeInfo : nodeTrace) {
SourceInfo info = nodeInfo.getSourceInfo();
String msg;
if (info != null) {
@@ -470,8 +467,7 @@
if (goldenCuds.length == 0) {
compilationFailed = true;
}
- for (int iCud = 0; iCud < goldenCuds.length; iCud++) {
- CompilationUnitDeclaration cud = goldenCuds[iCud];
+ for (CompilationUnitDeclaration cud : goldenCuds) {
CompilationResult result = cud.compilationResult();
if (result.hasErrors()) {
compilationFailed = true;
@@ -482,8 +478,7 @@
TreeLogger branch = logger.branch(TreeLogger.ERROR, "Errors in "
+ String.valueOf(result.getFileName()), null);
IProblem[] errors = result.getErrors();
- for (int i = 0; i < errors.length; i++) {
- IProblem problem = errors[i];
+ for (IProblem problem : errors) {
if (problemSet.contains(problem)) {
continue;
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
index 3f5134d..fed1fff 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
@@ -28,6 +28,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
@@ -35,6 +36,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeSet;
/**
* Root for the AST representing an entire Java program.
@@ -113,7 +115,19 @@
public final JTypeOracle typeOracle = new JTypeOracle(this);
- private final List<JArrayType> allArrayTypes = new ArrayList<JArrayType>();
+ /**
+ * Sorted to avoid nondeterministic iteration.
+ */
+ private final Set<JArrayType> allArrayTypes = new TreeSet<JArrayType>(
+ new Comparator<JArrayType>() {
+ public int compare(JArrayType o1, JArrayType o2) {
+ int comp = o1.getDims() - o2.getDims();
+ if (comp != 0) {
+ return comp;
+ }
+ return o1.getName().compareTo(o2.getName());
+ }
+ });
private final List<JReferenceType> allTypes = new ArrayList<JReferenceType>();
@@ -398,7 +412,11 @@
return curType;
}
- public List<JArrayType> getAllArrayTypes() {
+ /**
+ * Returns a sorted set of array types, so the returned set can be iterated
+ * over without introducing nondeterminism.
+ */
+ public Set<JArrayType> getAllArrayTypes() {
return allArrayTypes;
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
index 5a3f4ce..c781389 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
@@ -43,7 +43,6 @@
import java.util.ArrayList;
import java.util.HashSet;
import java.util.IdentityHashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -201,15 +200,16 @@
// Find all possible query types which I can satisfy
Set<JReferenceType> yesSet = null;
- for (Iterator<JReferenceType> iter = queriedTypes.keySet().iterator(); iter.hasNext();) {
- JReferenceType qType = iter.next();
+ // NOTE: non-deterministic iteration over HashSet and HashMap. This is
+ // okay here because we're just adding things to another HashSet.
+ for (JReferenceType qType : queriedTypes.keySet()) {
+
Set<JReferenceType> querySet = queriedTypes.get(qType);
if (program.typeOracle.canTriviallyCast(type, qType)) {
- for (Iterator<JReferenceType> it = querySet.iterator(); it.hasNext();) {
+ for (JReferenceType argType : querySet) {
- JReferenceType argType = it.next();
if (program.typeOracle.canTriviallyCast(type, argType)) {
if (yesSet == null) {
yesSet = new HashSet<JReferenceType>();
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 8e32999..e45e74e 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -141,6 +141,7 @@
import java.util.Map;
import java.util.Set;
import java.util.Stack;
+import java.util.TreeMap;
/**
* Creates a JavaScript AST from a <code>JProgram</code> node.
@@ -1581,7 +1582,13 @@
}
private final Map<JBlock, JsCatch> catchMap = new IdentityHashMap<JBlock, JsCatch>();
- private final Map<JType, JsName> classLits = new IdentityHashMap<JType, JsName>();
+
+ /**
+ * Sorted to avoid nondeterministic iteration.
+ */
+ private final Map<JType, JsName> classLits = new TreeMap<JType, JsName>(
+ new HasNameSort());
+
private final Map<JsName, JsExpression> classObjects = new IdentityHashMap<JsName, JsExpression>();
private final Map<JClassType, JsScope> classScopes = new IdentityHashMap<JClassType, JsScope>();