Author: b...@google.com
Date: Fri Feb  6 07:43:25 2009
New Revision: 4650

Added:
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClassMetadata.java
    
(contents, props changed)
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableClassMetadata.java
    
(contents, props changed)
Modified:
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/HostedModeBase.java
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/Precompile.java
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JClassLiteral.java
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
     
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
     
changes/bobv/elide_rpc_type_names_r4602/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
     
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Class.java
     
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Enum.java
     
changes/bobv/elide_rpc_type_names_r4602/user/test/com/google/gwt/user/client/rpc/ObjectGraphTest.java

Log:
Add an -XdisableClassMetadata flag.
This disables:
   - Class.getName() -> returns "Class$<hashCode()>"
   - Class.getSuperclass() -> returns null
   - Class.toString() -> returns Object.toString()
Misc javadoc and comment updates.


Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/HostedModeBase.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/HostedModeBase.java
      
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/HostedModeBase.java
      
Fri Feb  6 07:43:25 2009
@@ -31,6 +31,7 @@
  import com.google.gwt.dev.shell.ShellModuleSpaceHost;
  import com.google.gwt.dev.util.Util;
  import com.google.gwt.dev.util.arg.ArgHandlerDisableAggressiveOptimization;
+import com.google.gwt.dev.util.arg.ArgHandlerDisableClassMetadata;
  import com.google.gwt.dev.util.arg.ArgHandlerDraftCompile;
  import com.google.gwt.dev.util.arg.ArgHandlerEnableAssertions;
  import com.google.gwt.dev.util.arg.ArgHandlerGenDir;
@@ -320,6 +321,7 @@
        registerHandler(new ArgHandlerScriptStyle(options));
        registerHandler(new ArgHandlerEnableAssertions(options));
        registerHandler(new  
ArgHandlerDisableAggressiveOptimization(options));
+      registerHandler(new ArgHandlerDisableClassMetadata(options));
        registerHandler(new ArgHandlerDraftCompile(options));
      }
    }

Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/Precompile.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/Precompile.java
  
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/Precompile.java
  
Fri Feb  6 07:43:25 2009
@@ -41,6 +41,7 @@
  import com.google.gwt.dev.util.PerfLogger;
  import com.google.gwt.dev.util.Util;
  import com.google.gwt.dev.util.arg.ArgHandlerDisableAggressiveOptimization;
+import com.google.gwt.dev.util.arg.ArgHandlerDisableClassMetadata;
  import com.google.gwt.dev.util.arg.ArgHandlerDisableRunAsync;
  import com.google.gwt.dev.util.arg.ArgHandlerDraftCompile;
  import com.google.gwt.dev.util.arg.ArgHandlerEnableAssertions;
@@ -77,6 +78,7 @@
        registerHandler(new ArgHandlerScriptStyle(options));
        registerHandler(new ArgHandlerEnableAssertions(options));
        registerHandler(new  
ArgHandlerDisableAggressiveOptimization(options));
+      registerHandler(new ArgHandlerDisableClassMetadata(options));
        registerHandler(new ArgHandlerValidateOnlyFlag(options));
        registerHandler(new ArgHandlerDisableRunAsync(options));
        registerHandler(new ArgHandlerDraftCompile(options));
@@ -123,6 +125,10 @@
        return jjsOptions.isAggressivelyOptimize();
      }

+    public boolean isClassMetadataDisabled() {
+      return jjsOptions.isClassMetadataDisabled();
+    }
+
      public boolean isDraftCompile() {
        return jjsOptions.isDraftCompile();
      }
@@ -145,6 +151,10 @@

      public void setAggressivelyOptimize(boolean aggressivelyOptimize) {
        jjsOptions.setAggressivelyOptimize(aggressivelyOptimize);
+    }
+
+    public void setClassMetadataDisabled(boolean disabled) {
+      jjsOptions.setClassMetadataDisabled(disabled);
      }

      public void setDraftCompile(boolean draft) {

Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
      
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
      
Fri Feb  6 07:43:25 2009
@@ -16,6 +16,7 @@
  package com.google.gwt.dev.jjs;

  import com.google.gwt.dev.util.arg.OptionAggressivelyOptimize;
+import com.google.gwt.dev.util.arg.OptionDisableClassMetadata;
  import com.google.gwt.dev.util.arg.OptionDraftCompile;
  import com.google.gwt.dev.util.arg.OptionEnableAssertions;
  import com.google.gwt.dev.util.arg.OptionRunAsyncEnabled;
@@ -26,6 +27,6 @@
   * Controls options for the {...@link JavaToJavaScriptCompiler}.
   */
  public interface JJSOptions extends OptionAggressivelyOptimize,
-    OptionDraftCompile, OptionEnableAssertions, OptionRunAsyncEnabled,
-    OptionScriptStyle, OptionSoycEnabled {
+    OptionDisableClassMetadata, OptionDraftCompile, OptionEnableAssertions,
+    OptionRunAsyncEnabled, OptionScriptStyle, OptionSoycEnabled {
  }

Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
  
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
  
Fri Feb  6 07:43:25 2009
@@ -23,6 +23,7 @@
  public class JJSOptionsImpl implements JJSOptions, Serializable {

    private boolean aggressivelyOptimize = true;
+  private boolean disableClassMetadata = false;
    private boolean draftCompile = false;
    private boolean enableAssertions;
    private JsOutputOption output = JsOutputOption.OBFUSCATED;
@@ -38,6 +39,7 @@

    public void copyFrom(JJSOptions other) {
      setAggressivelyOptimize(other.isAggressivelyOptimize());
+    setClassMetadataDisabled(other.isClassMetadataDisabled());
      setDraftCompile(other.isDraftCompile());
      setEnableAssertions(other.isEnableAssertions());
      setOutput(other.getOutput());
@@ -53,6 +55,10 @@
      return aggressivelyOptimize;
    }

+  public boolean isClassMetadataDisabled() {
+    return disableClassMetadata;
+  }
+
    public boolean isDraftCompile() {
      return draftCompile;
    }
@@ -71,6 +77,10 @@

    public void setAggressivelyOptimize(boolean aggressivelyOptimize) {
      this.aggressivelyOptimize = aggressivelyOptimize;
+  }
+
+  public void setClassMetadataDisabled(boolean disabled) {
+    disableClassMetadata = disabled;
    }

    public void setDraftCompile(boolean draft) {

Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
        
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
        
Fri Feb  6 07:43:25 2009
@@ -340,7 +340,7 @@

        // (2) Create our own Java AST from the JDT AST.
        GenerateJavaAST.exec(allTypeDeclarations, typeMap, jprogram,  
jsProgram,
-          options.isEnableAssertions());
+          options);

        // GenerateJavaAST can uncover semantic JSNI errors; report & abort
        checkForErrors(logger, goldenCuds, true);

Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JClassLiteral.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JClassLiteral.java
       
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JClassLiteral.java
       
Fri Feb  6 07:43:25 2009
@@ -36,6 +36,20 @@
      String typeName = getTypeName(program, type);

      JMethod method =  
program.getIndexedMethod(type.getClassLiteralFactoryMethod());
+
+    /*
+     * Use the classForEnum() constructor even for enum subtypes to aid in
+     * pruning supertype data.
+     */
+    boolean isEnumOrSubclass = false;
+    if (type instanceof JClassType) {
+      JEnumType maybeEnum = ((JClassType) type).isEnumOrSubclass();
+      if (maybeEnum != null) {
+        isEnumOrSubclass = true;
+        method =  
program.getIndexedMethod(maybeEnum.getClassLiteralFactoryMethod());
+      }
+    }
+
      assert method != null;

      JMethodCall call = new JMethodCall(program, info, null, method);
@@ -80,6 +94,8 @@
          JsniMethodRef jsniMethodRef = new JsniMethodRef(program, info,  
null,
              valuesMethod);
          call.getArgs().add(jsniMethodRef);
+      } else if (isEnumOrSubclass) {
+        call.getArgs().add(program.getLiteralNull());
        }
      } else {
        assert (type instanceof JArrayType || type instanceof JInterfaceType  
|| type instanceof JPrimitiveType);

Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
    
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
    
Fri Feb  6 07:43:25 2009
@@ -575,18 +575,7 @@
    public JReferenceType getFromTypeMap(String qualifiedBinaryOrSourceName)  
{
      String srcTypeName = qualifiedBinaryOrSourceName.replace('$', '.');

-    int dim = 0;
-    while (srcTypeName.endsWith("[]")) {
-      dim++;
-      srcTypeName = srcTypeName.substring(0, srcTypeName.length() - 2);
-    }
-
-    JReferenceType toReturn = typeNameMap.get(srcTypeName);
-    if (toReturn == null || dim == 0) {
-      return toReturn;
-    } else {
-      return getTypeArray(toReturn, dim);
-    }
+    return typeNameMap.get(srcTypeName);
    }

    public JField getIndexedField(String string) {
@@ -827,6 +816,46 @@

    public JClassType getTypeClassLiteralHolder() {
      return typeSpecialClassLiteralHolder;
+  }
+
+  /**
+   * Returns the JType corresponding to a JSNI type reference.
+   */
+  public JType getTypeFromJsniRef(String className) {
+    int dim = 0;
+    while (className.endsWith("[]")) {
+      dim++;
+      className = className.substring(0, className.length() - 2);
+    }
+
+    JType type;
+    if ("Z".equals(className)) {
+      type = program.getTypePrimitiveBoolean();
+    } else if ("B".equals(className)) {
+      type = program.getTypePrimitiveByte();
+    } else if ("C".equals(className)) {
+      type = program.getTypePrimitiveChar();
+    } else if ("D".equals(className)) {
+      type = program.getTypePrimitiveDouble();
+    } else if ("F".equals(className)) {
+      type = program.getTypePrimitiveFloat();
+    } else if ("I".equals(className)) {
+      type = program.getTypePrimitiveInt();
+    } else if ("J".equals(className)) {
+      type = program.getTypePrimitiveLong();
+    } else if ("S".equals(className)) {
+      type = program.getTypePrimitiveShort();
+    } else if ("V".equals(className)) {
+      type = program.getTypeVoid();
+    } else {
+      type = getFromTypeMap(className);
+    }
+
+    if (type == null || dim == 0) {
+      return type;
+    } else {
+      return getTypeArray(type, dim);
+    }
    }

    public int getTypeId(JClassType classType) {

Modified:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
    
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
    
Fri Feb  6 07:43:25 2009
@@ -17,6 +17,7 @@

  import com.google.gwt.dev.jjs.HasSourceInfo;
  import com.google.gwt.dev.jjs.InternalCompilerException;
+import com.google.gwt.dev.jjs.JJSOptions;
  import com.google.gwt.dev.jjs.SourceInfo;
  import com.google.gwt.dev.jjs.ast.Context;
  import com.google.gwt.dev.jjs.ast.HasEnclosingType;
@@ -308,7 +309,9 @@

      private int[] currentSeparatorPositions;

-    private boolean enableAsserts;
+    private final boolean disableClassMetadata;
+
+    private final boolean enableAsserts;

      private final Map<JsniMethodBody, AbstractMethodDeclaration>  
jsniMethodMap = new HashMap<JsniMethodBody, AbstractMethodDeclaration>();

@@ -319,10 +322,16 @@
      private final TypeMap typeMap;

      public JavaASTGenerationVisitor(TypeMap typeMap, JProgram program,
-        boolean enableAsserts) {
+        JJSOptions options) {
        this.typeMap = typeMap;
        this.program = program;
-      this.enableAsserts = enableAsserts;
+      this.enableAsserts = options.isEnableAssertions();
+
+      /*
+       * TODO: Determine if this should be controlled by a compiler flag  
or a
+       * module property.
+       */
+      this.disableClassMetadata = options.isClassMetadataDisabled();
        autoboxUtils = new AutoboxUtils(program);
      }

@@ -532,10 +541,40 @@
            implementMethod(method, program.getLiteralBoolean(true));
          }

-        // Implement Class.desiredAssertionStatus
+        // Implement various methods on Class
          if (currentClass == program.getTypeJavaLangClass()) {
            JMethod method =  
program.getIndexedMethod("Class.desiredAssertionStatus");
            implementMethod(method,  
program.getLiteralBoolean(enableAsserts));
+
+          if (disableClassMetadata) {
+            SourceInfo info = currentClass.getSourceInfo().makeChild(
+                JavaASTGenerationVisitor.class, "Disabled class metadata");
+
+            JMethod nameMethod = program.getIndexedMethod("Class.getName");
+
+            // this.hashCode()
+            JMethodCall hashCall = new JMethodCall(program, info,
+                program.getExprThisRef(info, (JClassType) currentClass),
+                program.getIndexedMethod("Object.hashCode"));
+
+            // "Class$" + hashCode()
+            JBinaryOperation op = new JBinaryOperation(program, info,
+                program.getTypeJavaLangString(), JBinaryOperator.ADD,
+                program.getLiteralString(info, "Class$"), hashCall);
+
+            implementMethod(nameMethod, op);
+
+            // Forget the superclass
+            JMethod superclassMethod =  
program.getIndexedMethod("Class.getSuperclass");
+            implementMethod(superclassMethod, program.getLiteralNull());
+
+            // Replace Class.toString() with Object.toString()
+            JMethod toStringMethod =  
program.getIndexedMethod("Class.toString");
+            JMethod objectToStringMethod =  
program.getIndexedMethod("Object.toString");
+            implementMethod(toStringMethod, new JMethodCall(program, info,
+                program.getExprThisRef(info, (JClassType) currentClass),
+                objectToStringMethod));
+          }
          }

          if (currentClass instanceof JEnumType) {
@@ -2812,9 +2851,9 @@
          }

          String className = parsed.className();
-        JReferenceType type = null;
+        JType type = null;
          if (!className.equals("null")) {
-          type = program.getFromTypeMap(className);
+          type = program.getTypeFromJsniRef(className);
            if (type == null) {
              reportJsniError(info, methodDecl,
                  "Unresolvable native reference to type '" + className  
+ "'");
@@ -2829,12 +2868,24 @@
              if (fieldName.equals("nullField")) {
                return program.getNullField();
              }
+
            } else if (fieldName.equals("class")) {
              JClassLiteral lit = program.getLiteralClass(type);
              return lit.getField();
+
+          } else if (type instanceof JPrimitiveType) {
+            reportJsniError(info, methodDecl,
+                "May not refer to fields on primitive types");
+            return null;
+
+          } else if (type instanceof JArrayType) {
+            reportJsniError(info, methodDecl,
+                "May not refer to fields on array types");
+            return null;
+
            } else {
-            for (int i = 0; i < type.fields.size(); ++i) {
-              JField field = type.fields.get(i);
+            for (int i = 0; i < ((JReferenceType) type).fields.size();  
++i) {
+              JField field = ((JReferenceType) type).fields.get(i);
                if (field.getName().equals(fieldName)) {
                  return field;
                }
@@ -2845,6 +2896,12 @@
                "Unresolvable native reference to field '" + fieldName
                    + "' in type '" + className + "'");
            return null;
+
+        } else if (type instanceof JPrimitiveType) {
+          reportJsniError(info, methodDecl,
+              "May not refer to methods on primitive types");
+          return null;
+
          } else {
            // look for a method
            TreeSet<String> almostMatches = new TreeSet<String>();
@@ -2856,7 +2913,7 @@
              }
            } else {
              Queue<JReferenceType> workList = new  
LinkedList<JReferenceType>();
-            workList.add(type);
+            workList.add((JReferenceType) type);
              while (!workList.isEmpty()) {
                JReferenceType cur = workList.poll();
                for (int i = 0; i < cur.methods.size(); ++i) {
@@ -3033,10 +3090,10 @@
     * a JProgram structure.
     */
    public static void exec(TypeDeclaration[] types, TypeMap typeMap,
-      JProgram jprogram, JsProgram jsProgram, boolean enableAsserts) {
+      JProgram jprogram, JsProgram jsProgram, JJSOptions options) {
      // Construct the basic AST.
      JavaASTGenerationVisitor v = new JavaASTGenerationVisitor(typeMap,
-        jprogram, enableAsserts);
+        jprogram, options);
      for (int i = 0; i < types.length; ++i) {
        v.processType(types[i]);
      }

Added:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClassMetadata.java
==============================================================================
--- (empty file)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableClassMetadata.java
     
Fri Feb  6 07:43:25 2009
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may  
not
+ * use this file except in compliance with the License. You may obtain a  
copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations  
under
+ * the License.
+ */
+package com.google.gwt.dev.util.arg;
+
+import com.google.gwt.util.tools.ArgHandlerFlag;
+
+/**
+ * An ArgHandler to provide the -disableClassMetadata flag.
+ */
+public class ArgHandlerDisableClassMetadata extends ArgHandlerFlag {
+
+  private final OptionDisableClassMetadata option;
+
+  public ArgHandlerDisableClassMetadata(OptionDisableClassMetadata option)  
{
+    this.option = option;
+  }
+
+  @Override
+  public String getPurpose() {
+    return "EXPERIMENTAL: Disables some java.lang.Class methods (e.g.  
getName())";
+  }
+
+  @Override
+  public String getTag() {
+    return "-XdisableClassMetadata";
+  }
+
+  @Override
+  public boolean setFlag() {
+    option.setClassMetadataDisabled(true);
+    return true;
+  }
+}

Added:  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableClassMetadata.java
==============================================================================
--- (empty file)
+++  
changes/bobv/elide_rpc_type_names_r4602/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableClassMetadata.java
         
Fri Feb  6 07:43:25 2009
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may  
not
+ * use this file except in compliance with the License. You may obtain a  
copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations  
under
+ * the License.
+ */
+package com.google.gwt.dev.util.arg;
+
+/**
+ * Encapsulates a compiler option to disable {...@link Class#getName()}.
+ */
+public interface OptionDisableClassMetadata {
+  boolean isClassMetadataDisabled();
+
+  void setClassMetadataDisabled(boolean disabled);
+}

Modified:  
changes/bobv/elide_rpc_type_names_r4602/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
         
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
         
Fri Feb  6 07:43:25 2009
@@ -34,7 +34,7 @@
  public abstract class SerializerBase implements Serializer {

    /**
-   *
+   * Represents a collection of functions that perform type-specific  
functions.
     */
    protected static final class MethodMap extends JavaScriptObject {
      protected MethodMap() {
@@ -91,7 +91,13 @@
      }
    }

+  /**
+   * Hashcodes in hosted mode are unpredictable. Each signature map is
+   * associated with a proper IdentityHashMap. This method should only be  
used
+   * in hosted mode.
+   */
    private static Map<Class<?>, String> getSubMap(JsArrayString  
signatureMap) {
+    assert !GWT.isScript() : "Should only use this in hosted mode";
      Map<Class<?>, String> subMap = hostedSignatureMaps.get(signatureMap);
      if (subMap == null) {
        subMap = new IdentityHashMap<Class<?>, String>();
@@ -108,6 +114,7 @@
    }

    public final String getSerializationSignature(Class<?> clazz) {
+    assert clazz != null : "clazz";
      if (GWT.isScript()) {
        return getSignatureMap().get(clazz.hashCode());
      } else {

Modified:  
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Class.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Class.java
      
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Class.java
      
Fri Feb  6 07:43:25 2009
@@ -69,7 +69,7 @@
      Class<T> clazz = new Class<T>();
      clazz.typeName = packageName + className;
      clazz.modifiers = ENUM;
-    clazz.superclass = superclass;
+    clazz.superclass = clazz.enumSuperclass = superclass;
      clazz.enumConstantsFunc = enumConstantsFunc;
      return clazz;
    }
@@ -102,6 +102,8 @@

    @SuppressWarnings("unused")
    private JavaScriptObject enumConstantsFunc;
+
+  private Class<? super T> enumSuperclass;

    private int modifiers;

@@ -122,17 +124,26 @@
      // synthesized at compile-time based on the actual compilation  
arguments.
      return false;
    }
-
+
    public native T[] getEnumConstants() /*-{
      return th...@java.lang.class::enumConstantsFunc
          && (th...@java.lang.class::enumConstantsFunc)();
    }-*/;

+  /**
+   * Used by Enum to allow getSuperclass() to be pruned.
+   */
+  public Class<? super T> getEnumSuperclass() {
+    return enumSuperclass;
+  }
+
    public String getName() {
+    // This body may be replaced by the compiler
      return typeName;
    }

    public Class<? super T> getSuperclass() {
+    // This body may be replaced by the compiler
      return superclass;
    }

@@ -153,6 +164,7 @@
    }

    public String toString() {
+    // This body may be replaced by the compiler
      return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
          + getName();
    }

Modified:  
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Enum.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Enum.java
       
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/user/super/com/google/gwt/emul/java/lang/Enum.java
       
Fri Feb  6 07:43:25 2009
@@ -93,7 +93,12 @@
    @SuppressWarnings("unchecked")
    public final Class<E> getDeclaringClass() {
      Class clazz = getClass();
-    Class superclass = clazz.getSuperclass();
+    assert clazz != null : "clazz";
+
+    // Don't use getSuperclass() to allow that method to be pruned for most
+    // class types
+    Class superclass = clazz.getEnumSuperclass();
+    assert superclass != null : "superclass";

      return (superclass == Enum.class) ? clazz : superclass;
    }

Modified:  
changes/bobv/elide_rpc_type_names_r4602/user/test/com/google/gwt/user/client/rpc/ObjectGraphTest.java
==============================================================================
---  
changes/bobv/elide_rpc_type_names_r4602/user/test/com/google/gwt/user/client/rpc/ObjectGraphTest.java
    
(original)
+++  
changes/bobv/elide_rpc_type_names_r4602/user/test/com/google/gwt/user/client/rpc/ObjectGraphTest.java
    
Fri Feb  6 07:43:25 2009
@@ -109,15 +109,16 @@

      SerializationStreamWriter writer = ((SerializationStreamFactory)  
async).createStreamWriter();
      AbstractSerializationStream stream = (AbstractSerializationStream)  
writer;
-    assertEquals(expectedObfuscationState(),
+    assertEquals("Missing flag", expectedObfuscationState(),
           
stream.hasFlags(AbstractSerializationStream.FLAG_ELIDE_TYPE_NAMES));

      SerializableDoublyLinkedNode node = new SerializableDoublyLinkedNode();
      writer.writeObject(node);
      String s = writer.toString();

-    assertEquals(expectedObfuscationState(),
-        !s.contains(SerializableDoublyLinkedNode.class.getName()));
+    // Don't use class.getName() due to conflict with removal of type names
+    assertEquals("Checking for SerializableDoublyLinkedNode",
+         
expectedObfuscationState(), !s.contains("SerializableDoublyLinkedNode"));
    }

    public void testPrivateNoArg() {

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to