Reduce JType and JPrimitiveType memory and serialization footprint.
http://gwt-code-reviews.appspot.com/1367801/
Review by: zundel@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9783 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JPrimitiveType.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JPrimitiveType.java
index 6e62e0d..a639b43 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JPrimitiveType.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JPrimitiveType.java
@@ -25,6 +25,9 @@
* Base class for all Java primitive types.
*/
public class JPrimitiveType extends JType {
+ /*
+ * Primitive types are static singletons. Serialization via readResolve().
+ */
private static final class Singletons {
public static final Map<String, JPrimitiveType> map = new HashMap<String, JPrimitiveType>();
@@ -57,13 +60,16 @@
public static final JPrimitiveType VOID = new JPrimitiveType("void", "V",
"java.lang.Void", null);
- private final String signatureName;
+ private final transient JValueLiteral defaultValue;
- private final String wrapperTypeName;
+ private final transient String signatureName;
+
+ private final transient String wrapperTypeName;
private JPrimitiveType(String name, String signatureName,
- String wrapperTypeName, JLiteral defaultValue) {
- super(SourceOrigin.UNKNOWN, name, defaultValue);
+ String wrapperTypeName, JValueLiteral defaultValue) {
+ super(SourceOrigin.UNKNOWN, name);
+ this.defaultValue = defaultValue;
this.signatureName = StringInterner.get().intern(signatureName);
this.wrapperTypeName = StringInterner.get().intern(wrapperTypeName);
Singletons.map.put(this.name, this);
@@ -74,10 +80,8 @@
* if no such coercion is possible.
*/
public JValueLiteral coerceLiteral(JValueLiteral value) {
- JLiteral defaultValue = getDefaultValue();
- if (defaultValue instanceof JValueLiteral) {
- JValueLiteral defaultValueLiteral = (JValueLiteral) defaultValue;
- return defaultValueLiteral.cloneFrom(value);
+ if (defaultValue != null) {
+ return defaultValue.cloneFrom(value);
}
return null;
}
@@ -88,6 +92,11 @@
}
@Override
+ public final JLiteral getDefaultValue() {
+ return defaultValue;
+ }
+
+ @Override
public String getJavahSignatureName() {
return signatureName;
}
@@ -111,6 +120,9 @@
visitor.endVisit(this, ctx);
}
+ /**
+ * Canonicalize to singleton; uses {@link JType#name}.
+ */
private Object readResolve() {
return Singletons.map.get(name);
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java
index c91b6ef..ce28542 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JReferenceType.java
@@ -25,7 +25,7 @@
private transient JNonNullType nonNullType;
public JReferenceType(SourceInfo info, String name) {
- super(info, name, JNullLiteral.INSTANCE);
+ super(info, name);
}
/**
@@ -39,6 +39,11 @@
}
@Override
+ public final JLiteral getDefaultValue() {
+ return JNullLiteral.INSTANCE;
+ }
+
+ @Override
public String getJavahSignatureName() {
return "L" + name.replaceAll("_", "_1").replace('.', '_') + "_2";
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JType.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JType.java
index f772af7..f97e5fa 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JType.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JType.java
@@ -24,19 +24,15 @@
public abstract class JType extends JNode implements HasName, CanBeFinal {
protected final String name;
- private final JLiteral defaultValue;
- public JType(SourceInfo info, String name, JLiteral defaultValue) {
+ public JType(SourceInfo info, String name) {
super(info);
this.name = StringInterner.get().intern(name);
- this.defaultValue = defaultValue;
}
public abstract String getClassLiteralFactoryMethod();
- public JLiteral getDefaultValue() {
- return defaultValue;
- }
+ public abstract JLiteral getDefaultValue();
public abstract String getJavahSignatureName();