summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2003-10-29 14:24:49 +0000
committerburaq <buraq@epfl.ch>2003-10-29 14:24:49 +0000
commitf381bdba78f74f5baa41c597bc5f1cffef4c290c (patch)
tree54302ce655fe23146302efcd927ec4493be4ed6b
parent05e2b718cd6ec1a375df4c51107f06c1d6dd74b6 (diff)
downloadscala-f381bdba78f74f5baa41c597bc5f1cffef4c290c.tar.gz
scala-f381bdba78f74f5baa41c597bc5f1cffef4c290c.tar.bz2
scala-f381bdba78f74f5baa41c597bc5f1cffef4c290c.zip
fixed bug196 with a wild hack
-rw-r--r--sources/scalac/transformer/TransMatch.java24
1 files changed, 20 insertions, 4 deletions
diff --git a/sources/scalac/transformer/TransMatch.java b/sources/scalac/transformer/TransMatch.java
index 814a52ac19..4cea1d9770 100644
--- a/sources/scalac/transformer/TransMatch.java
+++ b/sources/scalac/transformer/TransMatch.java
@@ -89,11 +89,27 @@ public class TransMatch extends OwnerTransformer {
protected Tree transform(Tree root, CaseDef[] cases, Type restpe) {
boolean containsReg = false;
int i = 0;
- while(!containsReg && (i < cases.length))
- containsReg = TestRegTraverser.apply(cases[i++]);
+ while (i < cases.length) {
+ containsReg = TestRegTraverser.apply(cases[i]) || containsReg;
+ Set nilvars = TestRegTraverser.getNilVariables();
+ if(!nilvars.isEmpty()) {
+ //System.err.println("nilvars present");
+ Tree[] newBody = new Tree[ nilvars.size() + 1 ];
+ int j=0;
+ for( Iterator it = nilvars.iterator(); it.hasNext(); ) {
+ Symbol v = (Symbol) it.next();
+ newBody[ j++ ] = unit.global.treeGen.ValDef(v,
+ unit.global.treeGen.Nil(cases[i].pos));
+ }
+ newBody[ newBody.length - 1 ] = cases[i].body;
+ cases[i].body = unit.global.treeGen.mkBlock( newBody );
+ }
+ i++;
+ }
+
if (containsReg) {
- AlgebraicMatcher am = new AlgebraicMatcher( unit );
- Matcher matcher = new Matcher( currentOwner, root, restpe );
+ AlgebraicMatcher am = new AlgebraicMatcher( unit );
+ Matcher matcher = new Matcher( currentOwner, root, restpe );
am.construct( matcher, cases );
return matcher.tree;
} else {