summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/matching/PatternMatcher.java
diff options
context:
space:
mode:
authorMatthias Zenger <mzenger@gmail.com>2003-09-02 22:54:27 +0000
committerMatthias Zenger <mzenger@gmail.com>2003-09-02 22:54:27 +0000
commitd1746306e487c16ebfeb14d2c7b600004b49a870 (patch)
tree44f682fff3eb3ff1ac113a85c9d1a108e869ffb8 /sources/scalac/transformer/matching/PatternMatcher.java
parentd8a3d0acaa3ff4bae5a20ff64d265754e7c1fbe5 (diff)
downloadscala-d1746306e487c16ebfeb14d2c7b600004b49a870.tar.gz
scala-d1746306e487c16ebfeb14d2c7b600004b49a870.tar.bz2
scala-d1746306e487c16ebfeb14d2c7b600004b49a870.zip
Fixed a small bug and started adding a new opti...
Fixed a small bug and started adding a new optimization.
Diffstat (limited to 'sources/scalac/transformer/matching/PatternMatcher.java')
-rw-r--r--sources/scalac/transformer/matching/PatternMatcher.java90
1 files changed, 71 insertions, 19 deletions
diff --git a/sources/scalac/transformer/matching/PatternMatcher.java b/sources/scalac/transformer/matching/PatternMatcher.java
index c5ebd28afa..ca196c37e6 100644
--- a/sources/scalac/transformer/matching/PatternMatcher.java
+++ b/sources/scalac/transformer/matching/PatternMatcher.java
@@ -47,11 +47,25 @@ public class PatternMatcher extends PatternTool {
*/
protected PatternNodeCreator mk;
+ /** constructor
+ */
+ public PatternMatcher(Unit unit, Infer infer, Tree selector,
+ Symbol owner, Type resultType) {
+ super(unit, infer);
+ initialize(selector, owner, resultType);
+ }
+
+ /** constructor, used in subclass ALgebraicMatcher
+ */
+ protected PatternMatcher(Unit unit, Infer infer) {
+ super(unit, infer);
+ }
+
/** init method, also needed in subclass AlgebraicMatcher
*/
- protected void initialize( Tree selector, Symbol owner, Type resultType) {
- this.mk = new PatternNodeCreator( unit, infer, owner );
- this.cf = new CodeFactory( unit, infer, selector.pos );
+ protected void initialize(Tree selector, Symbol owner, Type resultType) {
+ this.mk = new PatternNodeCreator(unit, infer, owner);
+ this.cf = new CodeFactory(unit, infer, selector.pos);
this.root = mk.ConstrPat(selector.pos, selector.type.widen());
this.root.and = mk.Header(selector.pos,
selector.type.widen(),
@@ -62,19 +76,7 @@ public class PatternMatcher extends PatternTool {
owner,
Modifiers.MUTABLE);
this.resultVar.setType(resultType);
-
- }
- /** constructor, used in subclass ALgebraicMatcher
- */
- protected PatternMatcher( Unit unit, Infer infer ) {
- super( unit, infer );
- }
- /** constructor
- */
- public PatternMatcher(Unit unit, Infer infer, Tree selector, Symbol owner, Type resultType) {
- super(unit, infer);
- initialize( selector, owner, resultType );
- this.owner = owner;
+ this.owner = owner;
this.selector = selector;
this.optimize &= (unit.global.target == Global.TARGET_JVM);
}
@@ -542,13 +544,15 @@ public class PatternMatcher extends PatternTool {
//////////// generator methods
public Tree toTree() {
- if (optimize && isTopLevelIntSwitch())
+ if (optimize && isSimpleIntSwitch())
return intSwitchToTree();
+ else if (false && optimize && isSimpleSwitch())
+ return switchToTree();
else
return generalSwitchToTree();
}
- protected boolean isTopLevelIntSwitch() {
+ protected boolean isSimpleIntSwitch() {
if (selector.type.widen().isSameAs(defs.INT_TYPE)) {
PatternNode patNode = root.and;
while (patNode != null) {
@@ -571,6 +575,50 @@ public class PatternMatcher extends PatternTool {
return false;
}
+ protected boolean isSimpleSwitch() {
+ print();
+ PatternNode patNode = root.and;
+ while (patNode != null) {
+ PatternNode node = patNode;
+ while ((node = node.or) != null) {
+ boolean isCase = false;
+ switch (node) {
+ case VariablePat(Tree tree):
+ System.out.println(((tree.symbol().flags & Modifiers.CASE) != 0));
+ break;
+ case ConstrPat(_):
+ System.out.println(node.type + " / " + ((node.type.symbol().flags & Modifiers.CASE) != 0));
+ PatternNode inner = node.and;
+ outer: while (true) {
+ switch (inner) {
+ case Header(_, Header next):
+ if (next != null)
+ return false;
+ inner = inner.or;
+ break;
+ case DefaultPat():
+ inner = inner.and;
+ break;
+ case Body(ValDef[][] bound, Tree[] guard, _):
+ if ((guard.length > 1) ||
+ (guard[0] != Tree.Empty))
+ return false;
+ break outer;
+ default:
+ System.out.println(inner);
+ return false;
+ }
+ }
+ break;
+ default:
+ return false;
+ }
+ }
+ patNode = patNode.next();
+ }
+ return true;
+ }
+
static class TagBodyPair {
int tag;
Tree body;
@@ -614,7 +662,7 @@ public class PatternMatcher extends PatternTool {
while ((node = node.or) != null)
switch (node) {
case DefaultPat():
- return bodyToTree(patNode.and);
+ return bodyToTree(node.and);
}
patNode = patNode.next();
}
@@ -704,6 +752,10 @@ public class PatternMatcher extends PatternTool {
}
}
+ public Tree switchToTree() {
+ throw new Error();
+ }
+
public Tree generalSwitchToTree() {
TreeList ts = new TreeList();
ts.append(