This patch is based on work Alex did to implement assertions. While I'm not implementing asserts right now, what I am doing is pruning them out of the AST early so they don't block any optimizations, which they are currently doing. Suggested by: alex.tkachman Review by: mmendez git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@446 8db76d5a-ed1c-0410-87a9-c151d255dfc7
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 5d887e7..f78c8db 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java +++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -32,6 +32,7 @@ import com.google.gwt.dev.jjs.ast.JReferenceType; import com.google.gwt.dev.jjs.ast.JSourceInfo; import com.google.gwt.dev.jjs.impl.ArrayNormalizer; +import com.google.gwt.dev.jjs.impl.AssertionRemover; import com.google.gwt.dev.jjs.impl.BuildTypeMap; import com.google.gwt.dev.jjs.impl.CastNormalizer; import com.google.gwt.dev.jjs.impl.CatchBlockNormalizer; @@ -170,8 +171,6 @@ program.addEntryMethod(bootStrapMethod); } - private final Set/* <IProblem> */problemSet = new HashSet/* <IProblem> */(); - private final String[] declEntryPoints; private final CompilationUnitDeclaration[] goldenCuds; @@ -182,6 +181,8 @@ private final boolean prettyNames; + private final Set/* <IProblem> */problemSet = new HashSet/* <IProblem> */(); + public JavaToJavaScriptCompiler(final TreeLogger logger, final WebModeCompilerFrontEnd compiler, final String[] declEntryPts) throws UnableToCompleteException { @@ -305,6 +306,13 @@ throw new UnableToCompleteException(); } + // TODO: figure out how to have a debug mode. + boolean isDebugEnabled = false; + if (!isDebugEnabled) { + // Remove all assert statements. + AssertionRemover.exec(jprogram); + } + // Compute which classes have clinits jprogram.typeOracle.computeAfterAST(); @@ -354,6 +362,9 @@ // (5) "Normalize" the high-level Java tree into a lower-level tree more // suited for JavaScript code gen. Don't go reordering these willy-nilly // because there are some subtle interdependencies. + if (isDebugEnabled) { + // AssertionNormalizer.exec(jprogram); + } CatchBlockNormalizer.exec(jprogram); CompoundAssignmentNormalizer.exec(jprogram); JavaScriptObjectCaster.exec(jprogram);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/AssertionRemover.java b/dev/core/src/com/google/gwt/dev/jjs/impl/AssertionRemover.java new file mode 100644 index 0000000..89c6836 --- /dev/null +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/AssertionRemover.java
@@ -0,0 +1,63 @@ +/* + * Copyright 2006 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.jjs.impl; + +import com.google.gwt.dev.jjs.ast.Context; +import com.google.gwt.dev.jjs.ast.JAssertStatement; +import com.google.gwt.dev.jjs.ast.JBlock; +import com.google.gwt.dev.jjs.ast.JModVisitor; +import com.google.gwt.dev.jjs.ast.JProgram; +import com.google.gwt.dev.jjs.ast.JStatement; + +/** + * Removes all assertion statements from the AST. + */ +public class AssertionRemover { + + /** + * Removes all asserts. + */ + public class AssertVisitor extends JModVisitor { + + public void endVisit(JAssertStatement x, Context ctx) { + removeMe(x, ctx); + } + + private void removeMe(JStatement stmt, Context ctx) { + if (ctx.canRemove()) { + ctx.removeMe(); + } else { + // empty block statement + ctx.replaceMe(new JBlock(program, stmt.getSourceInfo())); + } + } + } + + public static void exec(JProgram program) { + new AssertionRemover(program).execImpl(); + } + + private final JProgram program; + + public AssertionRemover(JProgram program) { + this.program = program; + } + + private void execImpl() { + AssertVisitor assertVisitor = new AssertVisitor(); + assertVisitor.accept(program); + } +}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java index 804a097..ed18bfc 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -384,12 +384,7 @@ // @Override public void endVisit(JAssertStatement x, Context ctx) { - // TODO(later): implement assert - if (x.getArg() != null) { - pop(); // arg - } - pop(); // testExpr - push(jsProgram.getEmptyStmt()); + throw new InternalCompilerException("Should not get here."); } // @Override