Peephole optimization to speed up basic visitation a tiny bit.
Review by: spoon (TBR)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@3249 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JModVisitor.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JModVisitor.java
index 0468afb..28898a0 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JModVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JModVisitor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2007 Google Inc.
+ * Copyright 2008 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
@@ -17,48 +17,19 @@
import com.google.gwt.dev.jjs.InternalCompilerException;
-import java.util.ArrayList;
import java.util.List;
/**
* A visitor for iterating through and modifying an AST.
*/
-@SuppressWarnings("unchecked")
public class JModVisitor extends JVisitor {
- private interface ContextFactory {
- Context create();
- }
-
- private class ContextPool extends ArrayList {
-
- private ContextFactory factory;
- private int pos = 0;
-
- public ContextPool(ContextFactory factory) {
- this.factory = factory;
- }
-
- public void release(Context ctx) {
- if (get(--pos) != ctx) {
- throw new InternalCompilerException(
- "Tried to release the wrong context");
- }
- }
-
- public Context take() {
- if (pos == size()) {
- add(factory.create());
- }
- return (Context) get(pos++);
- }
- }
-
- private class ListContext implements Context {
- private int index;
- private List list;
- private boolean removed;
- private boolean replaced;
+ private static class ListContext implements Context {
+ boolean didChange;
+ int index;
+ List<JNode> list;
+ boolean removed;
+ boolean replaced;
public boolean canInsert() {
return true;
@@ -88,19 +59,11 @@
public void replaceMe(JNode node) {
checkState();
- checkReplacement((JNode) list.get(index), node);
+ checkReplacement(list.get(index), node);
list.set(index, node);
didChange = replaced = true;
}
- protected void traverse(List list) {
- this.list = list;
- for (index = 0; index < list.size(); ++index) {
- removed = replaced = false;
- doTraverse((JNode) list.get(index), this);
- }
- }
-
private void checkRemoved() {
if (removed) {
throw new InternalCompilerException("Node was already removed");
@@ -115,9 +78,10 @@
}
}
- private class NodeContext implements Context {
- private JNode node;
- private boolean replaced;
+ private static class NodeContext implements Context {
+ boolean didChange;
+ JNode node;
+ boolean replaced;
public boolean canInsert() {
return false;
@@ -147,13 +111,6 @@
this.node = node;
didChange = replaced = true;
}
-
- protected JNode traverse(JNode node) {
- this.node = node;
- replaced = false;
- doTraverse(node, this);
- return this.node;
- }
}
protected static void checkReplacement(JNode origNode, JNode newNode) {
@@ -168,51 +125,50 @@
protected boolean didChange = false;
- private final ContextPool listContextPool = new ContextPool(
- new ContextFactory() {
- public Context create() {
- return new ListContext();
- }
- });
+ public JNode accept(JNode node) {
+ NodeContext ctx = new NodeContext();
+ try {
+ ctx.node = node;
+ node.traverse(this, ctx);
+ didChange |= ctx.didChange;
+ return ctx.node;
+ } catch (Throwable e) {
+ throw translateException(node, e);
+ }
+ }
- private final ContextPool nodeContextPool = new ContextPool(
- new ContextFactory() {
- public Context create() {
- return new NodeContext();
- }
- });
+ @SuppressWarnings("unchecked")
+ public void accept(List<? extends JNode> list) {
+ NodeContext ctx = new NodeContext();
+ try {
+ for (int i = 0, c = list.size(); i < c; ++i) {
+ ctx.replaced = false;
+ (ctx.node = list.get(i)).traverse(this, ctx);
+ ((List) list).set(i, ctx.node);
+ }
+ didChange |= ctx.didChange;
+ } catch (Throwable e) {
+ throw translateException(ctx.node, e);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void acceptWithInsertRemove(List<? extends JNode> list) {
+ ListContext ctx = new ListContext();
+ try {
+ ctx.list = (List) list;
+ for (ctx.index = 0; ctx.index < list.size(); ++ctx.index) {
+ ctx.removed = ctx.replaced = false;
+ list.get(ctx.index).traverse(this, ctx);
+ }
+ didChange |= ctx.didChange;
+ } catch (Throwable e) {
+ throw translateException(list.get(ctx.index), e);
+ }
+ }
public boolean didChange() {
return didChange;
}
- protected JNode doAccept(JNode node) {
- NodeContext ctx = (NodeContext) nodeContextPool.take();
- try {
- return ctx.traverse(node);
- } finally {
- nodeContextPool.release(ctx);
- }
- }
-
- protected void doAccept(List list) {
- NodeContext ctx = (NodeContext) nodeContextPool.take();
- try {
- for (int i = 0, c = list.size(); i < c; ++i) {
- list.set(i, ctx.traverse((JNode) list.get(i)));
- }
- } finally {
- nodeContextPool.release(ctx);
- }
- }
-
- protected void doAcceptWithInsertRemove(List list) {
- ListContext ctx = (ListContext) listContextPool.take();
- try {
- ctx.traverse(list);
- } finally {
- listContextPool.release(ctx);
- }
- }
-
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java
index 7e61a47..4babd97 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2007 Google Inc.
+ * Copyright 2008 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
@@ -30,7 +30,7 @@
/**
* A visitor for iterating through an AST.
*/
-@SuppressWarnings({"unused", "unchecked"})
+@SuppressWarnings("unused")
public class JVisitor {
protected static final Context UNMODIFIABLE_CONTEXT = new Context() {
@@ -61,24 +61,48 @@
};
- public final JExpression accept(JExpression node) {
- return (JExpression) doAccept(node);
+ protected static InternalCompilerException translateException(JNode node,
+ Throwable e) {
+ InternalCompilerException ice;
+ if (e instanceof InternalCompilerException) {
+ ice = (InternalCompilerException) e;
+ } else {
+ ice = new InternalCompilerException("Unexpected error during visit.", e);
+ }
+ ice.addNode(node);
+ return ice;
}
- public final JNode accept(JNode node) {
- return doAccept(node);
+ public final JExpression accept(JExpression node) {
+ return (JExpression) accept((JNode) node);
+ }
+
+ public JNode accept(JNode node) {
+ try {
+ node.traverse(this, UNMODIFIABLE_CONTEXT);
+ return node;
+ } catch (Throwable e) {
+ throw translateException(node, e);
+ }
}
public final JStatement accept(JStatement node) {
- return (JStatement) doAccept(node);
+ return (JStatement) accept((JNode) node);
}
- public final void accept(List list) {
- doAccept(list);
+ public void accept(List<? extends JNode> list) {
+ int i = 0;
+ try {
+ for (int c = list.size(); i < c; ++i) {
+ list.get(i).traverse(this, UNMODIFIABLE_CONTEXT);
+ }
+ } catch (Throwable e) {
+ throw translateException(list.get(i), e);
+ }
}
- public final void acceptWithInsertRemove(List list) {
- doAcceptWithInsertRemove(list);
+ public void acceptWithInsertRemove(List<? extends JNode> list) {
+ accept(list);
}
public boolean didChange() {
@@ -504,40 +528,4 @@
public boolean visit(JWhileStatement x, Context ctx) {
return true;
}
-
- protected JNode doAccept(JNode node) {
- doTraverse(node, UNMODIFIABLE_CONTEXT);
- return node;
- }
-
- protected void doAccept(List list) {
- for (Object node : list) {
- doTraverse((JNode) node, UNMODIFIABLE_CONTEXT);
- }
- }
-
- protected void doAcceptWithInsertRemove(List list) {
- for (Object node : list) {
- doTraverse((JNode) node, UNMODIFIABLE_CONTEXT);
- }
- }
-
- protected final void doTraverse(JNode node, Context ctx) {
- try {
- node.traverse(this, ctx);
- } catch (Throwable e) {
- throw translateException(node, e);
- }
- }
-
- private InternalCompilerException translateException(JNode node, Throwable e) {
- InternalCompilerException ice;
- if (e instanceof InternalCompilerException) {
- ice = (InternalCompilerException) e;
- } else {
- ice = new InternalCompilerException("Unexpected error during visit.", e);
- }
- ice.addNode(node);
- return ice;
- }
}