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 -~----------~----~----~----~------~----~------~--~---