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();