summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/matching
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2004-02-12 15:10:40 +0000
committerpaltherr <paltherr@epfl.ch>2004-02-12 15:10:40 +0000
commit2014d1feeefd1bc6bcfee0cee347c4a77db05253 (patch)
treedeffe18f0bf6527171d655885445abc8bb17023b /sources/scalac/transformer/matching
parentb62de8dc4f94efa47bf6714865b8bbf4df700046 (diff)
downloadscala-2014d1feeefd1bc6bcfee0cee347c4a77db05253.tar.gz
scala-2014d1feeefd1bc6bcfee0cee347c4a77db05253.tar.bz2
scala-2014d1feeefd1bc6bcfee0cee347c4a77db05253.zip
- Changed Tree.Block(Tree[]) to Tree.Block(Tree...
- Changed Tree.Block(Tree[]) to Tree.Block(Tree[],Tree)
Diffstat (limited to 'sources/scalac/transformer/matching')
-rw-r--r--sources/scalac/transformer/matching/AlgebraicMatcher.java14
-rw-r--r--sources/scalac/transformer/matching/Autom2Scala.java8
-rw-r--r--sources/scalac/transformer/matching/LeftTracerInScala.java3
-rw-r--r--sources/scalac/transformer/matching/PatternMatcher.java52
-rw-r--r--sources/scalac/transformer/matching/RightTracerInScala.java65
-rw-r--r--sources/scalac/transformer/matching/SequenceMatcher.java16
-rw-r--r--sources/scalac/transformer/matching/WordAutomInScala.java4
7 files changed, 70 insertions, 92 deletions
diff --git a/sources/scalac/transformer/matching/AlgebraicMatcher.java b/sources/scalac/transformer/matching/AlgebraicMatcher.java
index 6b96072bae..fc70741cd4 100644
--- a/sources/scalac/transformer/matching/AlgebraicMatcher.java
+++ b/sources/scalac/transformer/matching/AlgebraicMatcher.java
@@ -79,13 +79,13 @@ public class AlgebraicMatcher extends PatternMatcher {
//////////// generator methods
public Tree toTree() {
- TreeList ts = new TreeList();
- ts.append( gen.ValDef(root.symbol(), _m.selector ));
- ts.append( gen.ValDef(resultVar,
- gen.mkDefaultValue(_m.pos, resultVar.info()) ));
- ts.append( gen.If( toTree(root.and),
+ Tree[] ts = {
+ gen.ValDef(root.symbol(), _m.selector ),
+ gen.ValDef(resultVar,
+ gen.mkDefaultValue(_m.pos, resultVar.info()) )};
+ Tree res = gen.If( toTree(root.and),
gen.Ident( _m.pos, resultVar ),
- cf.ThrowMatchError( _m.pos, _m.resultType )));
+ cf.ThrowMatchError( _m.pos, _m.resultType ));
/*
gen.If(
_m.pos,
@@ -93,7 +93,7 @@ public class AlgebraicMatcher extends PatternMatcher {
gen.Ident( _m.pos, resultVar ),
cf.ThrowMatchError( _m.resultType ));
*/
- return gen.mkBlock(_m.pos, ts.toArray());
+ return gen.mkBlock(_m.pos, ts, res);
}
protected Tree toTree(PatternNode node, Tree selector) {
diff --git a/sources/scalac/transformer/matching/Autom2Scala.java b/sources/scalac/transformer/matching/Autom2Scala.java
index 6f99a699cf..102353c8d4 100644
--- a/sources/scalac/transformer/matching/Autom2Scala.java
+++ b/sources/scalac/transformer/matching/Autom2Scala.java
@@ -92,9 +92,9 @@ public class Autom2Scala {
cf.gen.ValDef( this.curSym,
gen.If( gen.Ident( pos, hasnSym ),
cf._next( _iter() ),
- gen.mkDefaultValue(cf.pos,curSym.type()))),
+ gen.mkDefaultValue(cf.pos,curSym.type())))},
- body });
+ body );
}
/** bug ?? */
@@ -189,10 +189,10 @@ public class Autom2Scala {
/** some error happened which is due to bug in translation/automaton
*/
final Tree code_error() {
- return gen.Block( new Tree[] {
+ return gen.mkBlock(
gen.Console_print( pos, "System error during pattern matching. Please file bug report\n"),
cf.ThrowMatchError( pos, funRetType() )
- });
+ );
}
Tree code_fail() {
diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java
index 4c02ce28dc..875b1dd89b 100644
--- a/sources/scalac/transformer/matching/LeftTracerInScala.java
+++ b/sources/scalac/transformer/matching/LeftTracerInScala.java
@@ -208,7 +208,8 @@ public class LeftTracerInScala extends TracerInScala {
new Ident[] {
gen.Ident( pos, stateSym ),
gen.Ident( pos, accumSym )
- }, code_body() /* code_body_new ? */ ))});
+ }, code_body() /* code_body_new ? */ ))},
+ gen.Ident( cf.pos, resultSym ));
}
// calling the AlgebraicMatcher here
diff --git a/sources/scalac/transformer/matching/PatternMatcher.java b/sources/scalac/transformer/matching/PatternMatcher.java
index b2c45278ef..eeebe6321d 100644
--- a/sources/scalac/transformer/matching/PatternMatcher.java
+++ b/sources/scalac/transformer/matching/PatternMatcher.java
@@ -766,16 +766,15 @@ public class PatternMatcher extends PatternTool {
}
public Tree generalSwitchToTree() {
- TreeList ts = new TreeList();
- ts.append(gen.ValDef(root.symbol(), selector));
- ts.append(gen.ValDef(resultVar, gen.mkDefaultValue(selector.pos, resultVar.getType())));
- ts.append(
- gen.If(
- selector.pos,
- toTree(root.and),
- gen.Ident(selector.pos, resultVar),
- cf.ThrowMatchError(selector.pos, resultVar.getType())));
- return gen.mkBlock(selector.pos, ts.toArray());
+ Tree[] ts = {
+ gen.ValDef(root.symbol(), selector),
+ gen.ValDef(resultVar, gen.mkDefaultValue(selector.pos, resultVar.getType()))};
+ Tree res = gen.If(
+ selector.pos,
+ toTree(root.and),
+ gen.Ident(selector.pos, resultVar),
+ cf.ThrowMatchError(selector.pos, resultVar.getType()));
+ return gen.mkBlock(selector.pos, ts, res);
}
protected Tree toTree(PatternNode node) {
@@ -799,18 +798,15 @@ public class PatternMatcher extends PatternTool {
} else if (!doBinding)
bound = new ValDef[][]{new ValDef[]{}};
for (int i = guard.length - 1; i >= 0; i--) {
- Tree[] ts = new Tree[bound[i].length + 1];
- System.arraycopy(bound[i], 0, ts, 0, bound[i].length);
- ts[bound[i].length] = gen.mkBlock(
- new Tree[]{
- gen.Assign(
- gen.Ident(body[i].pos, resultVar),
- body[i]),
- gen.mkBooleanLit(body[i].pos, true)
- });
+ Tree[] ts = bound[i];
+ Tree res0 = gen.mkBlock(
+ gen.Assign(
+ gen.Ident(body[i].pos, resultVar),
+ body[i]),
+ gen.mkBooleanLit(body[i].pos, true));
if (guard[i] != Tree.Empty)
- ts[bound[i].length] = cf.And(guard[i], ts[bound[i].length]);
- res = cf.Or(gen.mkBlock(body[i].pos, ts), res);
+ res0 = cf.And(guard[i], res0);
+ res = cf.Or(gen.mkBlock(body[i].pos, ts, res0), res);
}
return res;
default:
@@ -922,10 +918,9 @@ public class PatternMatcher extends PatternTool {
return gen.If(
gen.mkIsInstanceOf(selector.duplicate(), node.type),
gen.mkBlock(
- new Tree[]{
- gen.ValDef(casted,
- gen.mkAsInstanceOf(selector.duplicate(), node.type)),
- toTree(node.and)}),
+ gen.ValDef(casted,
+ gen.mkAsInstanceOf(selector.duplicate(), node.type)),
+ toTree(node.and)),
toTree(node.or, selector.duplicate()));
case SequencePat(Symbol casted, int len):
return gen.If(
@@ -939,10 +934,9 @@ public class PatternMatcher extends PatternTool {
defs.SEQ_LENGTH())),
gen.mkIntLit(selector.pos, len))),
gen.mkBlock(
- new Tree[]{
- gen.ValDef(casted,
- gen.mkAsInstanceOf(selector.duplicate(), node.type)),
- toTree(node.and)}),
+ gen.ValDef(casted,
+ gen.mkAsInstanceOf(selector.duplicate(), node.type)),
+ toTree(node.and)),
toTree(node.or, selector.duplicate()));
case ConstantPat(AConstant value):
return gen.If(
diff --git a/sources/scalac/transformer/matching/RightTracerInScala.java b/sources/scalac/transformer/matching/RightTracerInScala.java
index e7ef7ae029..e6fc1378ae 100644
--- a/sources/scalac/transformer/matching/RightTracerInScala.java
+++ b/sources/scalac/transformer/matching/RightTracerInScala.java
@@ -32,7 +32,7 @@ public class RightTracerInScala extends TracerInScala {
HashMap helpMap;
HashMap helpMap2 ;
- Vector helpVarDefs;
+ TreeList helpVarDefs;
/** translate right tracer to code
@@ -60,7 +60,7 @@ public class RightTracerInScala extends TracerInScala {
this.helpMap = new HashMap();
helpMap2 = new HashMap();
- helpVarDefs = new Vector();
+ helpVarDefs = new TreeList();
for( Iterator it = seqVars.iterator(); it.hasNext(); ) {
makeHelpVar( (Symbol) it.next() );
@@ -110,7 +110,7 @@ public class RightTracerInScala extends TracerInScala {
helpVar.flags |= Modifiers.MUTABLE;
Tree varDef = gen.ValDef( helpVar, rhs );
//((ValDef) varDef).kind = Kinds.VAR;
- helpVarDefs.add( varDef );
+ helpVarDefs.append( varDef );
}
@@ -174,16 +174,16 @@ public class RightTracerInScala extends TracerInScala {
// load current elem and trace
Tree loadCurrentElem( Tree body ) {
- return gen.mkBlock( new Tree[] {
+ return
gen.If( cf.isEmpty( _iter() ),
run_finished( 0 ), // we are done
gen.mkBlock( new Tree[] {
gen.ValDef( this.targetSym,
cf.SeqTrace_headState( gen.Ident( pos, iterSym))),
gen.ValDef( this.curSym,
- cf.SeqTrace_headElem( gen.Ident( pos, iterSym ))),
- body })
- )});
+ cf.SeqTrace_headElem( gen.Ident( pos, iterSym )))},
+ body )
+ );
}
/** see code_state0_NEW
@@ -354,7 +354,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
// case _ => false
- Tree res[] = new Tree[ helpMap3.keySet().size() + 1 ];
+ Tree ts[] = new Tree[ helpMap3.keySet().size() ];
int j = 0;
for( Iterator it = helpMap3.keySet().iterator(); it.hasNext(); ) {
Symbol vsym = (Symbol) it.next();
@@ -362,12 +362,12 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
//hv.setType( defs.LIST_TYPE( elementType ) ) ; DEBUG ALARM ?
Tree refv = gen.Ident(cf.pos, vsym);
Tree refhv = gen.Ident(cf.pos, hv);
- res[ j++ ] = gen.Assign( refhv, refv );
+ ts[ j++ ] = gen.Assign( refhv, refv );
// System.out.println( "the assign" + res[ j - 1 ] );
}
- res[ j ] = gen.mkBooleanLit( cf.pos, true ); // just `true'
- Tree theBody = gen.mkBlock(res);
+ Tree res = gen.mkBooleanLit( cf.pos, true ); // just `true'
+ Tree theBody = gen.mkBlock(ts, res);
am.construct( m, new CaseDef[] {
@@ -417,8 +417,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
assert vars != null;
Tree stms[] = new Tree[ vars.size()
- + ((algMatchTree != null )? 1 : 0 )
- + 1 ];
+ + ((algMatchTree != null )? 1 : 0 ) ];
int j = 0;
for( Iterator it = vars.iterator(); it.hasNext(); ) {
Symbol var = (Symbol) it.next();
@@ -431,10 +430,10 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
if( algMatchTree != null )
stms[ j++ ] = algMatchTree ;
- stms[ j ] = callFun( new Tree[] { cf.SeqTrace_tail( _iter() ),
- gen.mkIntLit( cf.pos, ntarget.intValue() ) } );
+ Tree value = callFun( new Tree[] { cf.SeqTrace_tail( _iter() ),
+ gen.mkIntLit( cf.pos, ntarget.intValue() ) } );
- return gen.mkBlock( pos, stms );
+ return gen.mkBlock( pos, stms, value );
}
Tree stateWrap(int i) {
@@ -445,23 +444,23 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
/* returns statements that do the work of the right-transducer
*/
- Tree[] getStms( Tree trace, Unit unit, Tree body ) {
+ Tree getStms( Tree trace, Unit unit, Tree body ) {
- Vector v = new Vector();
+ TreeList stms = new TreeList();
Tree loopbody = code_body_NEW();
- v.add( gen.ValDef( iterSym, trace ) );
- v.add( gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0 ) ) );
- v.addAll( helpVarDefs );
- v.add( gen.LabelDef( this.funSym,
- new Ident[] {
- gen.Ident( pos, iterSym ),
- gen.Ident( pos, stateSym )
- }, loopbody ));
+ stms.append( gen.ValDef( iterSym, trace ) );
+ stms.append( gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0 ) ) );
+ stms.append( helpVarDefs );
+ stms.append( gen.LabelDef( this.funSym,
+ new Ident[] {
+ gen.Ident( pos, iterSym ),
+ gen.Ident( pos, stateSym )
+ }, loopbody ));
// bind variables handled by this righttracer
for( Iterator it = seqVars.iterator(); it.hasNext(); ) {
- v.add( bindVar( (Symbol) it.next() ) );
+ stms.append( bindVar( (Symbol) it.next() ) );
}
Transformer treeCloner = new Transformer(unit.global) {
@@ -475,15 +474,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
}
};
- v.add( treeCloner.transform( body ) );
-
- Tree result[] = new Tree[ v.size() ];
- int j = 0;
- for( Iterator it = v.iterator(); it.hasNext(); ) {
- result[ j++ ] = (Tree) it.next();
- }
-
- return result;
+ return gen.mkBlock(stms.toArray(), treeCloner.transform( body ));
}
@@ -492,7 +483,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
* todo: move tree generation of Unit somewhere else
*/
Tree run_finished( int state ) {
- return gen.Block(Position.FIRSTPOS, Tree.EMPTY_ARRAY);
+ return gen.mkUnitLit(Position.FIRSTPOS);
}
Tree current() { return gen.Ident( pos, targetSym );}
diff --git a/sources/scalac/transformer/matching/SequenceMatcher.java b/sources/scalac/transformer/matching/SequenceMatcher.java
index 68d698986c..78334e5c10 100644
--- a/sources/scalac/transformer/matching/SequenceMatcher.java
+++ b/sources/scalac/transformer/matching/SequenceMatcher.java
@@ -55,8 +55,6 @@ public class SequenceMatcher extends PatternTool {
Tree trace = ltis.getTrace();
- Tree theTrace = gen.Ident( cf.pos, ltis.resultSym );
-
// (c) determinize + translate R
DetWordAutom dRight = new DetWordAutom( right, left, dLeft );
@@ -67,16 +65,10 @@ public class SequenceMatcher extends PatternTool {
new RightTracerInScala( dRight, seqVars, _m.owner,
cf, pat, elementType );
- Tree stms2[] = rtis.getStms( theTrace, unit, body );
-
- // paste statements together
-
- Tree items[] = new Tree[ 1 + stms2.length ];
-
- items[ 0 ] = trace;
- System.arraycopy( stms2, 0, items, 1, stms2.length );
-
- return gen.mkBlock( body.pos, items );
+ // !!! Tree stms2 = rtis.getStms( theTrace, unit, body );
+ // !!! gen.mkBlock_( body.pos, trace, stms2 );
+ Tree stms2 = rtis.getStms( trace, unit, body );
+ return stms2;
}
private NondetWordAutom[] buildNfas( Tree[] pat ) {
diff --git a/sources/scalac/transformer/matching/WordAutomInScala.java b/sources/scalac/transformer/matching/WordAutomInScala.java
index bb05f6f63b..c84291b9ae 100644
--- a/sources/scalac/transformer/matching/WordAutomInScala.java
+++ b/sources/scalac/transformer/matching/WordAutomInScala.java
@@ -60,8 +60,8 @@ public class WordAutomInScala extends Autom2Scala {
result = cf.gen.mkBlock( cf.pos, new Tree[] {
gen.ValDef( iterSym, cf.newIterator( selector )),
gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0) ),
- gen.ValDef( resultSym, theDefDef ),
- result } );
+ gen.ValDef( resultSym, theDefDef )},
+ result );
//unit.global.debugPrinter.print( result );
return result;
}