Author: [email protected]
Date: Thu Apr 2 17:54:48 2009
New Revision: 5177
Modified:
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JArrayType.java
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JNullType.java
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
Log:
First pass at storing clinit state in classes.
Modified:
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JArrayType.java
==============================================================================
---
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JArrayType.java
(original)
+++
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JArrayType.java
Thu Apr 2 17:54:48 2009
@@ -29,8 +29,8 @@
}
private int dims;
- private JType leafType;
private JType elementType;
+ private JType leafType;
/**
* These are only supposed to be constructed by JProgram.
@@ -71,9 +71,14 @@
}
return s;
}
-
+
public JType getLeafType() {
return leafType;
+ }
+
+ @Override
+ public boolean hasClinit() {
+ return false;
}
public boolean isAbstract() {
Modified:
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JNullType.java
==============================================================================
---
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JNullType.java
(original)
+++
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JNullType.java
Thu Apr 2 17:54:48 2009
@@ -44,6 +44,11 @@
return "N";
}
+ @Override
+ public boolean hasClinit() {
+ return false;
+ }
+
public boolean isAbstract() {
return false;
}
Modified:
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java
==============================================================================
---
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java
(original)
+++
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java
Thu Apr 2 17:54:48 2009
@@ -25,10 +25,16 @@
*/
public abstract class JReferenceType extends JType implements
CanBeAbstract {
- public List<JField> fields = new ArrayList<JField>();
- public List<JMethod> methods = new ArrayList<JMethod>();
public JClassType extnds;
+ public List<JField> fields = new ArrayList<JField>();
public List<JInterfaceType> implments = new ArrayList<JInterfaceType>();
+ public List<JMethod> methods = new ArrayList<JMethod>();
+
+ /**
+ * Tracks whether this class has a dynamic clinit. Defaults to true until
+ * shown otherwise.
+ */
+ private boolean hasClinit = true;
public JReferenceType(SourceInfo info, String name) {
super(info, name, JNullLiteral.INSTANCE);
@@ -49,4 +55,21 @@
return name.substring(dotpos + 1);
}
+ /**
+ * Returns <code>true</code> when this method's clinit must be run
+ * dynamically.
+ */
+ public boolean hasClinit() {
+ return hasClinit;
+ }
+
+ /**
+ * Called when this class's clinit is empty or can be run at the top
level.
+ */
+ void removeClinit() {
+ assert hasClinit();
+ JMethod clinitMethod = methods.get(0);
+ assert JProgram.isClinit(clinitMethod);
+ hasClinit = false;
+ }
}
Modified:
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
==============================================================================
---
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
(original)
+++
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
Thu Apr 2 17:54:48 2009
@@ -208,7 +208,7 @@
private final Set<JInterfaceType> dualImpl = new
IdentityHashSet<JInterfaceType>();
- private final Set<JReferenceType> hasClinitSet = new
IdentityHashSet<JReferenceType>();
+ private Set<JReferenceType> hasClinitSet;
private final Map<JClassType, Set<JInterfaceType>> implementsMap = new
IdentityHashMap<JClassType, Set<JInterfaceType>>();
@@ -510,7 +510,8 @@
}
public boolean hasClinit(JReferenceType type) {
- return hasClinitSet.contains(type);
+ assert type.hasClinit() == hasClinitSet.contains(type);
+ return type.hasClinit();
}
/**
@@ -544,11 +545,15 @@
* associated JProgram.
*/
public void recomputeAfterOptimizations() {
- hasClinitSet.clear();
+ hasClinitSet = new IdentityHashSet<JReferenceType>();
Set<JReferenceType> computed = new IdentityHashSet<JReferenceType>();
for (int i = 0; i < program.getDeclaredTypes().size(); ++i) {
JReferenceType type = program.getDeclaredTypes().get(i);
- computeHasClinit(type, computed);
+ if (type.hasClinit()) {
+ computeHasClinit(type, computed);
+ } else {
+ computed.add(type);
+ }
}
computeSingleJsoImplData();
@@ -618,6 +623,8 @@
if (computeHasClinitRecursive(type, computed,
new IdentityHashSet<JReferenceType>())) {
hasClinitSet.add(type);
+ } else {
+ type.removeClinit();
}
computed.add(type);
}
@@ -629,7 +636,8 @@
// If we've been computed, hasClinitSet is accurate for me.
if (computed.contains(type)) {
- return hasClinitSet.contains(type);
+ assert type.hasClinit() == hasClinitSet.contains(type);
+ return type.hasClinit();
}
JMethod method = type.methods.get(0);
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---