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