Adds an experimental flag, -XdisableCastChecking which turns off runtime cast checks in compiler output.

Review by: spoon


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5032 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/HostedModeBase.java b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
index ecdf0d9..640f813 100644
--- a/dev/core/src/com/google/gwt/dev/HostedModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/HostedModeBase.java
@@ -32,6 +32,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.ArgHandlerDisableCastChecking;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableClassMetadata;
 import com.google.gwt.dev.util.arg.ArgHandlerDraftCompile;
 import com.google.gwt.dev.util.arg.ArgHandlerEnableAssertions;
@@ -322,6 +323,7 @@
       registerHandler(new ArgHandlerEnableAssertions(options));
       registerHandler(new ArgHandlerDisableAggressiveOptimization(options));
       registerHandler(new ArgHandlerDisableClassMetadata(options));
+      registerHandler(new ArgHandlerDisableCastChecking(options));
       registerHandler(new ArgHandlerDraftCompile(options));
     }
   }
diff --git a/dev/core/src/com/google/gwt/dev/Precompile.java b/dev/core/src/com/google/gwt/dev/Precompile.java
index 4609a65..9e9b143 100644
--- a/dev/core/src/com/google/gwt/dev/Precompile.java
+++ b/dev/core/src/com/google/gwt/dev/Precompile.java
@@ -43,6 +43,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.ArgHandlerDisableCastChecking;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableClassMetadata;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableRunAsync;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableUpdateCheck;
@@ -87,6 +88,7 @@
       registerHandler(new ArgHandlerEnableAssertions(options));
       registerHandler(new ArgHandlerDisableAggressiveOptimization(options));
       registerHandler(new ArgHandlerDisableClassMetadata(options));
+      registerHandler(new ArgHandlerDisableCastChecking(options));
       registerHandler(new ArgHandlerValidateOnlyFlag(options));
       registerHandler(new ArgHandlerDisableRunAsync(options));
       registerHandler(new ArgHandlerDraftCompile(options));
@@ -142,6 +144,10 @@
       return jjsOptions.isAggressivelyOptimize();
     }
 
+    public boolean isCastCheckingDisabled() {
+      return jjsOptions.isCastCheckingDisabled();
+    }
+
     public boolean isClassMetadataDisabled() {
       return jjsOptions.isClassMetadataDisabled();
     }
@@ -174,6 +180,10 @@
       jjsOptions.setAggressivelyOptimize(aggressivelyOptimize);
     }
 
+    public void setCastCheckingDisabled(boolean disabled) {
+      jjsOptions.setCastCheckingDisabled(disabled);
+    }
+
     public void setClassMetadataDisabled(boolean disabled) {
       jjsOptions.setClassMetadataDisabled(disabled);
     }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
index cf8fea0..e9624a0 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
@@ -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.OptionDisableCastChecking;
 import com.google.gwt.dev.util.arg.OptionDisableClassMetadata;
 import com.google.gwt.dev.util.arg.OptionDraftCompile;
 import com.google.gwt.dev.util.arg.OptionEnableAssertions;
@@ -28,6 +29,7 @@
  * Controls options for the {@link JavaToJavaScriptCompiler}.
  */
 public interface JJSOptions extends OptionAggressivelyOptimize,
-    OptionDisableClassMetadata, OptionDraftCompile, OptionEnableAssertions,
-    OptionRunAsyncEnabled, OptionScriptStyle, OptionSoycEnabled, OptionWorkDir {
+    OptionDisableClassMetadata, OptionDisableCastChecking, OptionDraftCompile,
+    OptionEnableAssertions, OptionRunAsyncEnabled, OptionScriptStyle,
+    OptionSoycEnabled, OptionWorkDir {
 }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
index 6a9b3e1..63b29d7 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
@@ -24,6 +24,7 @@
 public class JJSOptionsImpl implements JJSOptions, Serializable {
 
   private boolean aggressivelyOptimize = true;
+  private boolean disableCastChecking = false;
   private boolean disableClassMetadata = false;
   private boolean draftCompile = false;
   private boolean enableAssertions;
@@ -42,6 +43,7 @@
   public void copyFrom(JJSOptions other) {
     setAggressivelyOptimize(other.isAggressivelyOptimize());
     setClassMetadataDisabled(other.isClassMetadataDisabled());
+    setCastCheckingDisabled(other.isCastCheckingDisabled());
     setDraftCompile(other.isDraftCompile());
     setEnableAssertions(other.isEnableAssertions());
     setOutput(other.getOutput());
@@ -62,6 +64,10 @@
     return aggressivelyOptimize;
   }
 
+  public boolean isCastCheckingDisabled() {
+    return disableCastChecking;
+  }
+
   public boolean isClassMetadataDisabled() {
     return disableClassMetadata;
   }
@@ -86,6 +92,10 @@
     this.aggressivelyOptimize = aggressivelyOptimize;
   }
 
+  public void setCastCheckingDisabled(boolean disabled) {
+    disableCastChecking = disabled;
+  }
+
   public void setClassMetadataDisabled(boolean disabled) {
     disableClassMetadata = disabled;
   }
@@ -109,7 +119,7 @@
   public void setSoycEnabled(boolean enabled) {
     soycEnabled = enabled;
   }
-  
+
   public void setWorkDir(File workDir) {
     this.workDir = workDir;
   }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index 345c8b5..2caadc0 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -184,7 +184,7 @@
       CatchBlockNormalizer.exec(jprogram);
       PostOptimizationCompoundAssignmentNormalizer.exec(jprogram);
       LongEmulationNormalizer.exec(jprogram);
-      CastNormalizer.exec(jprogram);
+      CastNormalizer.exec(jprogram, options.isCastCheckingDisabled());
       ArrayNormalizer.exec(jprogram);
       EqualityNormalizer.exec(jprogram);
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
index 7fd3680..0f2a55d 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
@@ -76,11 +76,11 @@
   private class AssignTypeIdsVisitor extends JVisitor {
 
     Set<JClassType> alreadyRan = new HashSet<JClassType>();
-    private Map<JReferenceType, Set<JReferenceType>> queriedTypes = new IdentityHashMap<JReferenceType, Set<JReferenceType>>();
-    private int nextQueryId = 0;
-    private final List<JArrayType> instantiatedArrayTypes = new ArrayList<JArrayType>();
     private List<JClassType> classes = new ArrayList<JClassType>();
+    private final List<JArrayType> instantiatedArrayTypes = new ArrayList<JArrayType>();
     private List<JsonObject> jsonObjects = new ArrayList<JsonObject>();
+    private int nextQueryId = 0;
+    private Map<JReferenceType, Set<JReferenceType>> queriedTypes = new IdentityHashMap<JReferenceType, Set<JReferenceType>>();
 
     {
       JTypeOracle typeOracle = program.typeOracle;
@@ -193,6 +193,9 @@
 
     @Override
     public void endVisit(JCastOperation x, Context ctx) {
+      if (disableCastChecking) {
+        return;
+      }
       if (x.getCastType() != program.getTypeNull()) {
         recordCast(x.getCastType(), x.getExpr());
       }
@@ -424,6 +427,10 @@
       JExpression replaceExpr;
       JType toType = x.getCastType();
       JExpression expr = x.getExpr();
+      if (disableCastChecking && toType instanceof JReferenceType) {
+        ctx.replaceMe(expr);
+        return;
+      }
       if (toType instanceof JNullType) {
         /*
          * Magic: a null type cast means the user tried a cast that couldn't
@@ -586,16 +593,19 @@
     }
   }
 
-  public static void exec(JProgram program) {
-    new CastNormalizer(program).execImpl();
+  public static void exec(JProgram program, boolean disableCastChecking) {
+    new CastNormalizer(program, disableCastChecking).execImpl();
   }
 
-  private Map<JReferenceType, Integer> queryIds = new IdentityHashMap<JReferenceType, Integer>();
+  private final boolean disableCastChecking;
 
   private final JProgram program;
 
-  private CastNormalizer(JProgram program) {
+  private Map<JReferenceType, Integer> queryIds = new IdentityHashMap<JReferenceType, Integer>();
+
+  private CastNormalizer(JProgram program, boolean disableCastChecking) {
     this.program = program;
+    this.disableCastChecking = disableCastChecking;
   }
 
   private void execImpl() {
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableCastChecking.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableCastChecking.java
new file mode 100644
index 0000000..29c8a1c
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableCastChecking.java
@@ -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 -disableCastChecking flag.
+ */
+public class ArgHandlerDisableCastChecking extends ArgHandlerFlag {
+
+  private final OptionDisableCastChecking option;
+
+  public ArgHandlerDisableCastChecking(OptionDisableCastChecking option) {
+    this.option = option;
+  }
+
+  @Override
+  public String getPurpose() {
+    return "EXPERIMENTAL: Disables run-time checking of cast operations";
+  }
+
+  @Override
+  public String getTag() {
+    return "-XdisableCastChecking";
+  }
+
+  @Override
+  public boolean setFlag() {
+    option.setCastCheckingDisabled(true);
+    return true;
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableCastChecking.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableCastChecking.java
new file mode 100644
index 0000000..7014934
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableCastChecking.java
@@ -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 OptionDisableCastChecking {
+  boolean isCastCheckingDisabled();
+
+  void setCastCheckingDisabled(boolean disabled);
+}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableClassMetadata.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableClassMetadata.java
index eadc103..64603c3 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableClassMetadata.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/OptionDisableClassMetadata.java
@@ -16,7 +16,7 @@
 package com.google.gwt.dev.util.arg;
 
 /**
- * Encapsulates a compiler option to disable {@link Class#getName()}.
+ * Encapsulates a compiler option to disable runtime cast checking.
  */
 public interface OptionDisableClassMetadata {
   boolean isClassMetadataDisabled();