Reviewers: zundel,
Please review this at http://gwt-code-reviews.appspot.com/1513803/
Affected files:
M dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
Index: dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
b/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
index
4c85a0ab51d0678f3e42219fe2620260c28fa471..9da0f69c72818ef89c0530b5d5745f4a88124e85
100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
@@ -431,18 +431,6 @@ public class CodeSplitter {
return maxTotalSize;
}
- private static Map<JField, JClassLiteral>
buildFieldToClassLiteralMap(JProgram jprogram) {
- final Map<JField, JClassLiteral> map = new HashMap<JField,
JClassLiteral>();
- class BuildFieldToLiteralVisitor extends JVisitor {
- @Override
- public void endVisit(JClassLiteral lit, Context ctx) {
- map.put(lit.getField(), lit);
- }
- }
- (new BuildFieldToLiteralVisitor()).accept(jprogram);
- return map;
- }
-
/**
* Compute the set of initially live code for this program. Such code
must be
* included in the initial download of the program.
@@ -620,7 +608,6 @@ public class CodeSplitter {
}
private final MultipleDependencyGraphRecorder dependencyRecorder;
- private final Map<JField, JClassLiteral> fieldToLiteralOfClass;
private final FragmentExtractor fragmentExtractor;
private final LinkedHashSet<Integer> initialLoadSequence;
@@ -653,7 +640,6 @@ public class CodeSplitter {
numEntries = jprogram.getRunAsyncs().size() + 1;
logging = Boolean.getBoolean(PROP_LOG_FRAGMENT_MAP);
- fieldToLiteralOfClass = buildFieldToClassLiteralMap(jprogram);
fragmentExtractor = new FragmentExtractor(jprogram, jsprogram, map);
initiallyLive = computeInitiallyLive(jprogram, dependencyRecorder);
@@ -861,25 +847,36 @@ public class CodeSplitter {
}
private void fixUpLoadOrderDependenciesForClassLiterals(ExclusivityMap
fragmentMap) {
- int numClassLitStrings = 0;
- int numFixups = 0;
- for (JField field : fragmentMap.fields.keySet()) {
- JClassLiteral classLit = fieldToLiteralOfClass.get(field);
- if (classLit != null) {
- int classLitFrag = fragmentMap.fields.get(field);
+ int numStrings = 0;
+ int numStringFixups = 0;
+ int numSuperClasses = 0;
+ int numSuperClassFixups = 0;
+ for (JField field : jprogram.getTypeClassLiteralHolder().getFields()) {
+ int classLitFrag = getOrZero(fragmentMap.fields, field);
+ if (classLitFrag != 0) {
for (String string : stringsIn(field.getInitializer())) {
- numClassLitStrings++;
+ numStrings++;
int stringFrag = getOrZero(fragmentMap.strings, string);
if (stringFrag != classLitFrag && stringFrag != 0) {
- numFixups++;
+ numStringFixups++;
fragmentMap.strings.put(string, 0);
}
}
+ for (JClassLiteral otherLiteral:
classLiteralsIn(field.getInitializer())) {
+ numSuperClasses++;
+ int otherLitFrag = getOrZero(fragmentMap.fields,
otherLiteral.getField());
+ if (classLitFrag != otherLitFrag && otherLitFrag != 0) {
+ numSuperClassFixups++;
+ fragmentMap.fields.put(otherLiteral.getField(), 0);
+ }
+ }
}
}
if (logger.isLoggable(TreeLogger.DEBUG)) {
- logger.log(TreeLogger.DEBUG, "Fixed up load-order dependencies by
moving " + numFixups
- + " strings in class literal constructors to fragment 0, out
of " + numClassLitStrings);
+ logger.log(TreeLogger.DEBUG, "Fixed up load-order dependencies by
moving " + numStringFixups
+ + " strings in class literal constructors to fragment 0, out
of " + numStrings);
+ logger.log(TreeLogger.DEBUG, "Fixed up load-order dependencies by
moving " + numSuperClassFixups
+ + " class literal fields to fragment 0, out of " +
numSuperClasses);
}
}
@@ -1021,4 +1018,19 @@ public class CodeSplitter {
(new StringFinder()).accept(exp);
return strings;
}
+
+ /**
+ * Traverse <code>exp</code> and find all class literals within it.
+ */
+ private Set<JClassLiteral> classLiteralsIn(JExpression exp) {
+ final Set<JClassLiteral> literals = new HashSet<JClassLiteral>();
+ class ClassLiteralFinder extends JVisitor {
+ @Override
+ public void endVisit(JClassLiteral classLiteral, Context ctx) {
+ literals.add(classLiteral);
+ }
+ }
+ (new ClassLiteralFinder()).accept(exp);
+ return literals;
+ }
}
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors